Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python requests.get始终获取404_Python_Python Requests - Fatal编程技术网

python requests.get始终获取404

python requests.get始终获取404,python,python-requests,Python,Python Requests,我想尝试发送请求。请转到: 而且我总是 <Response [404]> 我知道这是一个常见的问题,并尝试了不同的方法,但仍然失败。 但所有其他网站都可以 有什么建议吗?网络服务器是黑盒子。他们可以根据您的请求、一天中的时间、月亮的相位或他们选择的任何其他标准返回任何有效的HTTP响应。如果另一个HTTP客户机得到不同的响应,请始终尝试找出Python发送的请求与另一个客户机发送的请求之间的差异 这意味着您需要: 记录工作请求的所有方面 记录失败请求的所有方面 尝试您可以进行

我想尝试发送请求。请转到:

而且我总是

<Response [404]>

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


有什么建议吗?

网络服务器是黑盒子。他们可以根据您的请求、一天中的时间、月亮的相位或他们选择的任何其他标准返回任何有效的HTTP响应。如果另一个HTTP客户机得到不同的响应,请始终尝试找出Python发送的请求与另一个客户机发送的请求之间的差异

这意味着您需要:

  • 记录工作请求的所有方面
  • 记录失败请求的所有方面
  • 尝试您可以进行哪些更改,使失败的请求更像工作请求,并尽量减少这些更改
我通常将请求指向端点,让它记录请求,然后进行实验

对于
请求
,会自动设置多个标头,其中许多标头通常不需要更改:

  • 主机
    ;这必须设置为您正在联系的主机名,以便它可以正确地多主机连接不同的站点<代码>请求设置此请求
  • 对于POST请求,
    内容长度
    内容类型
    ,通常从传递给
    请求的参数设置。如果这些参数不匹配,请将传入的参数更改为
    请求
    (但请注意
    多部分/*
    请求,它们使用
    内容类型
    标题中记录的生成边界;将生成边界留给
    请求
  • 连接
    :将其留给客户端管理
  • Cookies
    :这些Cookies通常在初始GET请求时或首次登录站点后设置。确保您使用捕获Cookie并已登录(提供的凭据与浏览器相同)
其他一切都是公平的,但如果
请求
设置了默认值,那么这些默认值往往不是问题所在。也就是说,我通常从用户代理头开始,然后从那里开始工作

在这种情况下,站点正在用户代理上进行过滤,看起来他们正在将Python列入黑名单,将其设置为几乎任何其他值都已起作用:

>>> requests.get('https://rent.591.com.tw', headers={'User-Agent': 'Custom'})
<Response [200]>
>>请求。获取('https://rent.591.com.tw,标头={'User-Agent':'Custom'})
接下来,您需要考虑到
请求
不是浏览器<代码>请求
只是一个HTTP客户机,浏览器做的事情多得多。浏览器解析HTML以获取其他资源,如图像、字体、样式和脚本,同时加载这些额外资源并执行脚本。然后,脚本可以改变浏览器显示的内容并加载其他资源。如果您的
请求
结果与您在浏览器中看到的不匹配,但浏览器发出的初始请求与之匹配,则您需要了解浏览器已加载的其他资源,并根据需要使用
请求
发出附加请求。如果所有这些都失败了,那么使用一个类似的项目,它可以让您通过一个实际的、无头的Chromium浏览器运行URL

您试图联系的站点向
https://rent.591.com.tw/home/search/rsList?is_new_list=1&type=1&kind=0&searchtype=1®ion=1
,如果您试图从该站点中获取数据,请考虑这一点

接下来,构建良好的站点将使用安全最佳实践,例如,要求您按照正确的顺序发出请求(例如,在向处理程序发送邮件之前获取表单的GET请求),并处理cookie或以其他方式提取服务器期望从一个请求传递到另一个请求的额外信息


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

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

@Sayse我可以复制这个问题。URL很好。为什么站点会阻止python作为用户代理?我一直在阅读这篇文章,但当“欺骗”(我猜)用户代理如此容易时,我觉得这毫无意义。@roganjosh:可能是站点管理员看到某个特定的Python脚本滥用了站点,并想快速阻止该脚本。他们可能实施了一个简单的黑名单,并将根据需要使其更加复杂。仅仅因为封锁在今天很简单,并不意味着它不会因为施虐者绕过它而变得更难绕过。
>>> requests.get('https://rent.591.com.tw', headers={'User-Agent': 'Custom'})
<Response [200]>