从CSV文件读取URL下载图片出现HTTP 403错误,如何解决?可使用Selenium吗?
HTTP 403报错解决方案
报错原因
HTTP 403是服务器拒绝了你的访问请求,绝大多数情况下是目标站点的反爬机制识别到你当前的请求来自爬虫程序,而非真实浏览器,你的原始代码没有携带任何浏览器标识信息,很容易被拦截。
方案1:添加请求头(优先选择,轻量高效)
只需要给你的urllib请求添加模拟浏览器的请求头即可解决绝大多数403问题,修改后的代码如下:
import urllib.request from urllib.error import HTTPError import sys def url_to_jpg(i, url, FILE_PATH): try: url_basename = url.split("/")[-1] filename = '{}.jpg'.format(url_basename.rsplit( ".", 1 )[ 0 ]) full_path = '{}{}'.format(FILE_PATH, filename) # 构造模拟浏览器的请求头 opener = urllib.request.build_opener() opener.addheaders = [ # 可自行替换为你自己浏览器的真实User-Agent,在浏览器F12控制台的网络请求中可查询 ('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'), # 若目标站点校验请求来源,可添加Referer字段,值为目标站点的域名或你跳转至该图片的上级页面地址 # ('Referer', 'https://目标站点域名.com') ] urllib.request.install_opener(opener) urllib.request.urlretrieve(url, full_path) print('{} saved.'.format(full_path)) return None except HTTPError as err: print(err) except: e = sys.exc_info()[0] print(e)
如果添加User-Agent后仍有403报错,可检查目标站点是否需要携带cookies、请求签名等特殊参数,复杂场景下可选择方案2。
方案2:使用Selenium解决
可以用Selenium解决403问题,Selenium调用真实浏览器发起请求,所有环境特征、请求参数都和普通用户浏览完全一致,能绕过绝大多数反爬校验,示例代码如下:
from selenium import webdriver import os import time def url_to_jpg(i, url, FILE_PATH): # 需提前安装对应Chrome版本的chromedriver chrome_options = webdriver.ChromeOptions() # 无需可视化可开启无头模式 # chrome_options.add_argument("--headless=new") driver = webdriver.Chrome(options=chrome_options) try: url_basename = url.split("/")[-1] filename = '{}.jpg'.format(url_basename.rsplit( ".", 1 )[ 0 ]) full_path = os.path.join(FILE_PATH, filename) driver.get(url) time.sleep(0.5) driver.save_screenshot(full_path) print('{} saved.'.format(full_path)) except Exception as e: print(e) finally: driver.quit()
注意:Selenium的资源占用更高、批量下载速度更慢,仅推荐普通请求无法绕过反爬时使用。
内容的提问来源于stack exchange,提问作者carpeta94
相关产品推荐
相关产品推荐

