在多次成功请求后得到403

时间:2019-12-22 10:54:51

标签: python web-scraping

我一直在刮一些房地产页面,并碰到一个特定网站的墙。它在尝试在JavaScript onclick事件后面抓取电话号码时开始。我对JS不太了解,但是从某种程度上讲,它与展示广告紧密相关。

仔细检查后,我发现了每个页面上的json数据:

"data": {
            "advert": {
                "...,
                    "phoneObj":[ {
                        "phone": "735", "phoneCode": "173-28-189-69-82-145-233-192-109-58-19-5-226-110-115-225-135-77-50-22-83-36-187-139-85-8-219-95-87-164-33-33-139-78-248-201"
                    }
}

使用Web开发工具,我已经确定此“ phoneCode”用于通过将其值传递到特殊的API URL来获取真实的电话号码。我抓取了phoneCode,并使用此特殊URL发出了另一个请求,然后..

一切正常!

不幸的是..在几次成功请求之后,我开始收到403错误:

Access Denied
You don't have permission to access "http://www.host.com/frontera/api/item/owner/phone/173-28-189-69-82-145-233-192-109-58-19-5-226-110-115-225-135-77-50-22-83-36-187-139-85-8-219-95-87-164-33-33-139-78-248-201" on this server.

Reference #18.97645e68.1577009665.1a1da860 

在抓取这些页面时,我并不想很快,而且我真的不认为这是因为请求限制很低。我已经使用浏览器打开了一堆窗口,尝试手动单击它们,但没有任何问题。

我首先想到的是它与正确的会话有关,所以我立即开始修改request.Session()来实现cookie持久性和更多自定义标头:

header = {
           'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0',
           'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
           'Accept-Encoding': 'gzip, deflate, br',
           'Accept-Language': 'pl,en-US;q=0.7,en;q=0.3',
           'Cache-Control': 'no-cache',
           'Connection': 'keep-alive',
           'Host': 'www.host.com',
           'Pragma': 'no-cache'
          }

但这根本没有帮助。为了更好地找出问题所在,我可以尝试做些什么?

2 个答案:

答案 0 :(得分:0)

您正在使用的API可能不适合外部使用,至少不是您使用它的方式。 403 Forbidden表示您已明确拒绝该请求。最有可能的是,有人看到您的请求并主动将您列入黑名单,或者自适应防火墙阻止了您。

答案 1 :(得分:0)

基本上APIAkamaiGHost保护,这是众所周知的防火墙。

如果您通过浏览器浏览API,它将使您无所顾忌地做任何想做的事情。

一旦您通过代码调用网页,它将允许您执行一次或多次操作,但是一旦它分析了您的连接,便会阻止您的IP地址。因此您将需要使用tor

enter image description here

这是一个解决方案:

import requests
import time

headers = {'Cookie': 'Cookie: _csrf=nnukVQ2___D88BVt_3GzfUDG; b4da1ddd423e4e8c32114620d61bbfb1=0bfd4455bf8032a1e5e62a2b2db2ca85; bm_sz=5167FDE07330E3099013E268D18AFB4A~YAAQHeF6XED5n3NuAQAAoV5mLQb4rWWWvSkll4rpV5LNOx8bW8lYWVGiw+SKyXZCLJjazkuhzG5U9GpJexyQW4kSullpdq9N7ImTrLC07uFTnoDvyWAcmsXiAtPxUSoxK5ZCSF9xrcr/ZSBrV4ZC3uHuLjryXNfrhaQdQdB1f5gFz+1STW38EPK8TDffNZg=; _abck=68E27962FFDDB95297DAEE8A49E6E038~0~YAAQZ3JlX9+7an5uAQAAYaHaLQOfSeBfhlHt3FQ0LuHf1ZoysOC4RkdU3rtfAAvweF3Ovx8R2/+0IdpC6JNOrX+W/f4QdPA6R31aTAVu/WdgxSNxL5HUQyMqQG1CV1NarTEIramfKxO8++LIpFwfZ2KanBQZbodULrgJAB69ID1tzBz+RMAeBUom/MXsMID9SxRy95qp1lQF+RBxl8t4XlZJF0+2FxqdYEDrlsl2RxO/yqxhn5Z/Xb13c9gnQMn2036VVMhcZVlA2i6n1XppqFyLBoymiMeswoejjYIjRsTexO0jNuvg1LTcRglGn9Umde2l0mls~-1~-1~-1; onap=16f2d666288x105b1c23-3-16f2dd863cfx6b41b522-5-1577024110; ldTd=true; _gcl_au=1.1.1963230701.1577014683; lqstatus=1577022670|16f2dd863cfx6b41b522|gre-9806; laquesis=gre-10591@b#gre-9806@b; laquesisff=; _ga=GA1.2.38751210.1577014684; _gid=GA1.2.543658842.1577014684; __gads=ID=9053a074379a671c-22d104a743a50087:T=1577014685:S=ALNI_MaJQJ-d6rutVuf7LnxOXmGIR03RoA; __gfp_64b=9c7FPwH7yWthkZRHZr3Y4Z0rh6LMYCLWXZPKlTLdINP.a7; PHPSESSID=4dea16ddf9b53cc9374c4e9033cf62a9; mobile_default=desktop; optimizelyEndUserId=oeu1577015678908r0.8964587898345969; lastCatType=101; cookieBarSeen=true; ak_bmsc=6029E960D640205FDEA262145E90C8B65F657267692E0000C972FF5DA7317F36~plNg4UFj14Rs42ExadiFOY0WPsw4RYaVN1W8pQRWgKVubwFxZ4i2E/x+XeH/ae7m3d3fxkGLQG32M7Yc6KatTpznk2ydv7RHJ0WVcaitQBOkOMldJBO36S8oNEl/zrXF3DmMLKg/5A1uOlTPtxjjuIg2baCJZa/9plv2nBg5U+sKZL/VwtKFWJ0QFFi3vJqotOovcwY2BtNel+GVx86sBFeBSxDIbcs7mk9KaoODLqU6IvrZCksH2qM9/uxonw9oZz; bm_sv=B875EC57E094201C119B399A54AB5B08~x4qQoaVc7K+pGqLxOHNEbMgykyIKaofv8b6aP/lHqsuoqKLZxD23NY1uv0r0qOEpWbMTXpL7e5Oj51Ll+GlJ5uuSVZ+/0SbWYqWXHaSKzIL5x0+v7p4ZYJIQBwHCIhMMq4sXjBuf5HRlmeJN4pTvqDjHx3dYDlNbf/6ktsqdsik=; _gat_clientNinja=1'}

for item in range(10):
  r = requests.get("https://www.otodom.pl/frontera/api/item/owner/phone/154-147-95-63-124-231-56-151-181-24-172-166-153-110-202-140-185-214-191-162-155-200-255-142-82-184-41-75-23-189-204-95-97-210-122-115", headers=headers)
  print(r.text)
  time.sleep(10)