如何跳过 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 只是字节内容,所以我使用写入二进制模式)而不是启动下一个,这可能会失败。