如何跳过 HTTPError 403 Forbidden
How to skip over HTTPError 403 Forbidden
我一直在尝试编写一个 Python 脚本来从脚本中的 URL 下载图像。大约有 1400 个 URL 可以打开,但并非所有 URL 都存在,有些需要特殊访问权限才能打开。使用下面编写的脚本,我希望脚本仅打开 HTTP 响应为 200(确定)的 URL,并跳过具有不同响应的 URL。但由于某些原因,HTTPError 403 仍然在 运行 脚本并终止下载过程时不断弹出。
有人可以帮助我确保 HTTPError 403(和其他错误)在 运行 时不会影响脚本吗?
(我添加了一个睡眠功能,以防脚本因连续请求太多而停止。)
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
,例如,当站点基于用户代理禁止访问时。为避免这种情况并避免多余的双重请求,您可以这样做:
response = requests.get(row[0])
if response.status_code == 200:
with open(filename, 'wb') as f:
f.write(response.content)
这样你将从已经完成的请求中获取你的文件(response.content
只是字节内容,所以我使用写入二进制模式)而不是启动下一个,这可能会失败。
我一直在尝试编写一个 Python 脚本来从脚本中的 URL 下载图像。大约有 1400 个 URL 可以打开,但并非所有 URL 都存在,有些需要特殊访问权限才能打开。使用下面编写的脚本,我希望脚本仅打开 HTTP 响应为 200(确定)的 URL,并跳过具有不同响应的 URL。但由于某些原因,HTTPError 403 仍然在 运行 脚本并终止下载过程时不断弹出。
有人可以帮助我确保 HTTPError 403(和其他错误)在 运行 时不会影响脚本吗? (我添加了一个睡眠功能,以防脚本因连续请求太多而停止。)
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
,例如,当站点基于用户代理禁止访问时。为避免这种情况并避免多余的双重请求,您可以这样做:
response = requests.get(row[0])
if response.status_code == 200:
with open(filename, 'wb') as f:
f.write(response.content)
这样你将从已经完成的请求中获取你的文件(response.content
只是字节内容,所以我使用写入二进制模式)而不是启动下一个,这可能会失败。