机械汤出现 403 错误

403 error with mechanicalsoup

为什么我在尝试抓取 hacked.com 时会收到 403,我该如何绕过它? 根据doesitusecloudflare.com,途中没有cloudflare (http://www.doesitusecloudflare.com/?url=https%3A%2F%2Fhacked.com%2Fwp-login.php) robots.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>\r\n<head><title>403 Forbidden</title></head>\r\n<body bgcolor="white">\r\n<center><h1>403 Forbidden</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n'

正如我们在 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]>
>>> 

多田!看起来有人在 hacked 试图避免某个机器人 - 即使他们的 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]>
>>>