python requests.get总是得到404

时间:2017-11-27 07:51:40

标签: python python-requests

我想尝试向这个website发送request.get:

requests.get('https://rent.591.com.tw')

我总是得到

<Response [404]>

我知道这是一个常见的问题并尝试了不同的方法,但仍然失败了。 但所有其他网站都没问题。

任何建议?

2 个答案:

答案 0 :(得分:19)

网络服务器是黑盒子。他们可以根据您的请求,一天中的时间,月亮的阶段或他们选择的任何其他标准返回任何有效的HTTP响应。如果另一个HTTP客户端一致地获得不同的响应,请尝试弄清楚Python发送的请求和另一个客户端发送的请求之间的差异。

这意味着你需要:

  • 记录工作要求的所有方面
  • 记录失败请求的所有方面
  • 尝试进行哪些更改,使失败的请求更像工作请求,并尽量减少这些更改。

我通常会将我的请求指向http://httpbin.org端点,让它记录请求,然后进行实验。

对于requests,有几个标题会自动设置,其中许多标题通常不会发生变化:

  • Host;此必须设置为您正在联系的主机名,以便它可以正确地多个托管不同的站点。 requests设置了这个。
  • 对于POST请求,
  • Content-LengthContent-Type通常是根据您传递给requests的参数设置的。如果这些不匹配,请将您传入的参数更改为requests(但要注意multipart/*个请求,这些请求使用Content-Type标题中记录的生成边界;请保留生成到requests)。
  • Connection:将此留给客户管理
  • Cookies:这些通常是在初始GET请求时设置的,或者是在首次登录网站后设置的。确保使用requests.Session() object捕获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浏览器运行网址。

您尝试联系的网站向https://rent.591.com.tw/home/search/rsList?is_new_list=1&type=1&kind=0&searchtype=1&region=1发出了额外的AJAX请求,如果您尝试从此网站抓取数据,请将其考虑在内。

接下来,精心构建的网站将使用安全性最佳实践,例如CSRF tokens,这要求您按正确的顺序发出请求(例如,在POST到处理程序之前检索表单的GET请求)和处理cookie或以其他方式提取服务器期望从一个请求传递到另一个请求的额外信息。

最后但并非最不重要的一点是,如果一个网站阻止脚本发出请求,他们可能要么试图强制执行禁止抓取的服务条款,要么就是因为他们有一个他们宁愿使用的API。检查其中之一,并考虑到如果你继续刮擦网站,你可能会被更有效地阻止。

答案 1 :(得分:0)

在我的情况下,这是由于该网站地址最近已更改,并且为我提供了旧的网站地址。至少这将状态码从404更改为500,我认为这是进步:)