如何跳过HTTPError 403 Forbidden

问题描述 投票:0回答:1

我一直在尝试编写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
python scripting http-error
1个回答
0
投票

注意,这样做:

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只是字节形式的内容,因此我使用写二进制模式),而不是启动下一个,这可能会失败。

© www.soinside.com 2019 - 2024. All rights reserved.