Python requests.get 返回404但网址确实存在

5 投票
1 回答
15122 浏览
提问于 2025-04-18 14:29
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /montres_bijoux/671762293.htm  was not found on this server.</p>
</body></html>

我正在尝试打开这个网址:

http://www.leboncoin.fr/montres_bijoux/671762293.htm

当我运行这个脚本时,终端里出现了这个错误:

import requests
s = requests.Session()
s.headers['User-Agent'] = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/34.0.1847.116 Chrome/34.0.1847.116 Safari/537.36'
s.headers['Host'] = 'www.leboncoin.fr'
url = 'http://www.leboncoin.fr/montres_bijoux/671762293.htm'
r = s.get(url)
print r.text

而我可以在浏览器中打开同样的网址,并且能看到内容。

这可能是什么问题呢?

1 个回答

15

在你测试之前,我几乎可以肯定我知道你的bug是什么。

我手动把这个网址放到函数调用里,运行得很好。但是如果我从文件里读取这个网址,然后直接用这个网址调用函数,就会出错。我在读取文件时加了3到4个检查,网址从文件里读出来是完全正确的,甚至我还尝试在被调用的函数里打印这个网址,结果也能收到这个网址。可是我还是不知道发生了什么?

很可能你是用类似 for line in file:file.readline 这样的方式读取网址,这些方法会保留换行符。所以,最后你得到的并不是这个:

url = 'http://www.leboncoin.fr/montres_bijoux/671762293.htm'

而是这个:

url = 'http://www.leboncoin.fr/montres_bijoux/671762293.htm\n'

后者会被 requests 库处理成一个有效的网址,但这个网址指向的资源并不存在,因此会出现404错误。

检查这个问题的最好方法是用 print repr(url) 而不是 print(url)。这样可以发现其他可能的问题,比如嵌入的不可打印字符。虽然它无法找到所有问题,比如看起来像 . 的Unicode字符,但实际上并不是,但这是一个很好的初步测试。(如果这个方法没有找到问题,作为第二个测试,可以把输出结果复制粘贴到你的测试脚本里,包括引号。)

如果这就是问题所在,解决方法很简单:

url = url.rstrip()

撰写回答