0

为什么我在尝试抓取 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'
4

1 回答 1

2

正如我们在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]>
>>> 
于 2018-01-29T17:59:02.030 回答