Web服务器是黑匣子。允许他们根据您的请求,一天中的时间,月相或他们选择的任何其他条件返回任何有效的HTTP响应。如果另一个HTTP客户端始终收到不同的响应,请尝试找出Python发送的请求与另一个客户端发送的请求之间的区别。
这意味着您需要:
我通常将请求指向http://httpbin.org端点,让它记录该请求,然后进行实验。
对于requests
,有几个标头是自动设置的,而您通常不希望更改其中的许多标头:
其他所有事情都是公平的游戏,但是如果requests
设置了默认值,那么这些默认值通常不是问题。就是说,我通常从User- Agent标头开始,然后从那里开始。
在这种情况下,该网站正在对用户代理进行过滤,看起来他们已被列入黑名单Python
,将其设置为 几乎任何其他可用值 :
>>> requests.get('https://rent.591.com.tw', headers={'User-Agent': 'Custom'})
<Response [200]>
接下来,你需要考虑到requests
是 不是浏览器 。requests
仅仅是HTTP客户端,浏览器的功能更多。浏览器会解析HTML以获取其他资源,例如图像,字体,样式和脚本,也加载这些其他资源,并执行脚本。然后,脚本可以更改浏览器显示的内容并加载其他资源。如果requests
结果与您在浏览器中看到的结果不匹配,但与浏览器发出 的 初始请求匹配 ,则您需要确定浏览器已加载了哪些其他资源,并requests
根据需要进行其他请求。如果所有其他方法均失败,请使用像这样的项目requests- html
,该项目可让您通过实际的无头Chromium浏览器运行URL。
您尝试联系的站点向发出了一个额外的AJAX请求https://rent.591.com.tw/home/search/rsList?is_new_list=1&type=1&kind=0&searchtype=1®ion=1
,如果您试图从该站点抓取数据,请考虑到这一点。
接下来,构建良好的网站将使用安全最佳实践,例如CSRF令牌,这要求您以正确的顺序发出请求(例如,在POST到处理程序之前先获取GET请求以检索表单),然后处理Cookie或以其他方式提取服务器希望从一个请求传递到另一个请求的额外信息。
最后但并非最不重要的一点是,如果站点阻止脚本发出请求,则它们可能试图强制执行禁止抓取的服务条款,或者因为它们具有API而希望您使用。请检查其中一个,并考虑到如果您仍然继续抓取该站点,可能会更有效地阻止您。