我试图遍历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
答案 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()
,您将分别收到404
和400
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