手动可保存图片但脚本无法爬取?原因与解决办法咨询
Yupoo图片下载错误:占位图替代真实图片的问题解决
你遇到的这个问题其实是Yupoo网站的反爬检测机制在搞鬼,我来帮你拆解原因和解决办法:
问题原因
Yupoo这类图片分享网站会识别请求的User-Agent(请求头里的客户端标识):
- 你用
urllib.request.urlretrieve发起请求时,默认的User-Agent是类似Python-urllib/3.10这类标识,网站一眼就能看出这是程序发起的请求,就会返回占位图而非真实图片。 - 而手动右键保存图片时,是浏览器发起的请求,浏览器会自动带上正常的User-Agent(比如Chrome的
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...),网站识别为合法的浏览器访问,就会返回真实图片。
解决方法
只需要给请求添加模拟浏览器的User-Agent请求头,让网站误以为是浏览器发起的访问即可。修改你的脚本如下:
import urllib.request def Save_Image(url, file_path, file_name): full_path = file_path + file_name + '.jpg' # 模拟Chrome浏览器的User-Agent,你也可以换成Firefox等其他浏览器的标识 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } # 创建带请求头的Request对象 req = urllib.request.Request(url, headers=headers) # 发起请求并写入文件 with urllib.request.urlopen(req) as response, open(full_path, 'wb') as out_file: out_file.write(response.read()) url = 'http://photo.yupoo.com/evakicks/05269e07/7bd1fc86.png' file_name = 'Image1' # 请确保脚本同目录下已创建imageFolder文件夹 Save_Image(url, 'imageFolder/', file_name)
补充说明
- 你可以根据自己常用的浏览器,替换成对应的User-Agent(比如在浏览器的开发者工具里查看Network请求的Request Headers就能找到)。
- 这种添加请求头模拟浏览器的方式,是应对简单反爬机制的常用手段,很多图片、内容网站都会用类似的检测逻辑。
内容的提问来源于stack exchange,提问作者NapoleonB




