403 机械汤错误



为什么当我尝试抓取 hacked.com 时会得到 403,我该如何绕过它?根据 doesitusecloudflare.com 的说法,途中没有云焰(http://www.doesitusecloudflare.com/?url=https%3A%2F%2Fhacked.com%2Fwp-login.php(机器人.txt允许任何用户代理,并且仅禁止访问WP-Admin登录。

>>> import mechanicalsoup
>>> browser = mechanicalsoup.StatefulBrowser()
>>> browser.get('https://google.com')
<Response [200]>
>>> browser.get('https://hacked.com')
<Response [403]>
>>> browser.get('https://hacked.com').content
b'<html>rn<head><title>403 Forbidden</title></head>rn<body bgcolor="white">rn<center><h1>403 Forbidden</h1></center>rn<hr><center>nginx</center>rn</body>rn</html>rn'

正如我们在 mechanicalsoup/browser.py#L106 中看到的那样,.get() 只是 requests.get() 的包装器,所以让我们回到那个。

正如我们所看到的;问题仍然存在于仅请求:

>>> import requests
>>> response = requests.get('https://hacked.com')
>>> response
<Response [403]>
>>> 

我有一个暗示,所以我删除了User-Agent字符串:

>>> request = response.request
>>> request.headers
{'User-Agent': 'python-requests/2.18.4', ...}
>>> del(request.headers['User-Agent'])
>>> request.headers
{...}
>>> 

并再次尝试:

>>> session = requests.Session()
>>> session.send(request)
<Response [200]>
>>> 

哒哒! 看起来这是有人试图避开某个机器人 - 即使他们的robots.txt说你可以。

因此,回到上下文中的问题,似乎我们只需要设置一个User-Agent字符串,该字符串不是默认情况下requests发送的内容。 我看不到用MechanicalSoup取消设置它的方法,所以这是我找到的最好的方法:

>>> import mechanicalsoup
>>> b = mechanicalsoup.StatefulBrowser()
>>> b.set_user_agent('my-awesome-script')
>>> b.get('https://hacked.com')
<Response [200]>
>>> 

最新更新