循环时request.get返回400响应-即使URL仍然相同

时间:2019-07-05 09:32:23

标签: python python-3.x python-requests

我试图遍历URL列表以获取所有页面的图像URL。但是,使用循环时,请求返回400。当我测试单个URL时,它可以正常工作(200)。自首次通话以来失败。

尝试添加时间延迟,但仍然无法正常工作。

f = open(url_file)

lineList = f.readlines()
print(lineList[0]) # Test
i = 1
for url in lineList:
    print(url) # Test -- the url is the same as lineList[0] above
    res = requests.get(url) # works when copied the printed url in but not as a variable

预期为200-错误为400

3 个答案:

答案 0 :(得分:1)

说明

如果您的url_file具有换行符(\n字符)作为行分隔符,则它可能会 导致服务器的响应不稳定。这是因为\n不会自动从每一行的末尾剥离f.readlines()。某些服务器将忽略URL中的此字符并返回200 OK,而有些服务器则不会。

例如:

f = open(r"C:\data\1.txt")  # text file with newline as line separator
list_of_urls = f.readlines()
print(list_of_urls)

输出

['https://habr.com/en/users/\n', 'https://stackoverflow.com/users\n']

如果您在上述这些确切的网址上运行requests.get(),您将分别收到404400 HTTP状态代码。最后没有\n,它们是有效的现有网页-您可以自己检查。

您没有在代码中注意到这些多余的\n,因为您在每个项目上使用了print(),而该符号不会“显式”显示为{{1} }。

如何修复

使用\n而不是splitlines()来摆脱readlines()的结尾:

\n

答案 1 :(得分:0)

使用urllib2并更改存储网页的txtfile的地址:

示例网址来源:http://mign.pl/ver.txt

import requests
import urllib.request as urllib2

response = urllib2.urlopen('http://mign.pl/ver.txt')
x=response.read().decode("utf-8")
d=x.split("\n")
print(d)

for u in d:
    res = requests.get(u)
    print(res.status_code)

输出:

200
200

答案 2 :(得分:0)

使用生成器的另一个选项: 网址示例:http://mign.pl/ver.txt

import requests
import urllib.request as urllib2

print(*(requests.get(u).status_code for u in urllib2.urlopen('http://mign.pl/ver.txt').read().decode("utf-8").split("\n")))

输出:

200 200