我一直在尝试编写Python脚本,该脚本从脚本中的URL下载图像。大约有1400个URL可以打开,但并非全部都存在,有些URL需要特殊访问才能打开。使用下面编写的脚本,我希望该脚本仅打开HTTP响应为200(确定)的URL,并跳过具有不同响应的URL。但是由于某些原因,运行脚本时HTTPError 403仍然会弹出,并终止下载过程。
有人可以帮我确保HTTPError 403(和其他错误)在运行时不会影响脚本吗?(我添加了一个sleep函数,以防脚本由于连续请求过多而停止。)
with open('images.csv') as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
next(csv_reader)
RQs = 0
for row in csv_reader:
basename = os.path.basename(urlparse(row[0]).path)
filename = '{}/{}/{}'.format(row[2], row[1], basename)
if RQs == 200:
time.sleep(1)
print("sleeping for 5 seconds")
RQs = 0
response = requests.get(row[0])
if response.status_code == 200: #could also check == requests.codes.ok
urllib.request.urlretrieve(row[0], filename)
else:
continue
RQs += 1
注意,这样做:
response = requests.get(row[0])
if response.status_code == 200: #could also check == requests.codes.ok
urllib.request.urlretrieve(row[0], filename)
您正在启动2个不同的请求,即使第一个导致403
,第二个也可能导致200
,例如,当站点基于User-Agent禁止访问时。为了避免这种情况并避免多余的重复请求,您可以执行以下操作:
response = requests.get(row[0])
if response.status_code == 200:
with open(filename, 'wb') as f:
f.write(response.content)
通过这种方式,您将从已经完成的请求中获取文件(response.content
只是字节形式的内容,因此我使用写二进制模式),而不是启动下一个,这可能会失败。