Web服务器是黑匣子。允许他们根据您的请求,一天中的时间,月相或他们选择的任何其他条件返回任何有效的HTTP响应。如果另一个HTTP客户端始终收到不同的响应,请尝试找出Python发送的请求与另一个客户端发送的请求之间的区别。
这意味着您需要:
- 记录工作要求的各个方面
- 记录失败请求的所有方面
- 尝试进行哪些更改以使失败的请求更像工作请求,并最小化这些更改。
我通常将请求指向http://httpbin.org端点,让它记录该请求,然后进行实验。
对于
requests,有几个标头是自动设置的,而您通常不希望更改其中的许多标头:
Host
; 这个 必须 设置为你联系的主机名,这样它才能正常多主机不同的网站。requests
设置这个。Content-Length
和Content-Type
,对于POST请求,通常是通过传递给的参数设置的requests
。如果这些不匹配,请更改传入的参数requests
(但要注意multipart/*
请求,该请求使用记录在Content-Type
标头中的生成边界;将生成的边界保留为requests
)。Connection
:将其交给客户管理cookies
:这些通常是在初始GET请求中设置的,或者是在首次登录网站后设置的。确保使用requests.Session()
对象捕获cookie并登录(提供的凭据与浏览器相同)。
其他所有事情都是公平的游戏,但是如果
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而希望您使用。请检查其中一个,并考虑到如果您仍然继续抓取该站点,可能会更有效地阻止您。



