Python代码下载网页图片匹配0条链接下载失败问题求解
问题根因
代码匹配不到图片链接是以下几个问题导致的:
- 正则匹配逻辑完全不符合当前站点结构:
- 正则限定匹配
http://数字.bp.inaturalist.org开头的地址,该域名是站点早年使用的CDN地址,目前所有图片资源已迁移至https://static.inaturalist.org域名,且强制使用HTTPS协议 - 正则从
<a>标签的href属性提取地址,实际图片直链存放在<img>标签的src属性中,<a>标签内是图片详情页跳转地址,并非图片文件地址
- 正则限定匹配
- 请求未携带合法User-Agent:urllib默认的请求标识会被站点反爬规则拦截,返回的页面内容不包含正常的图片列表数据
- 统计逻辑错误:最终打印下载数量时误用了总链接数
total变量,无法正确统计实际成功下载的文件数,且原代码里打印匹配数量时把links拼写成了lnks
修改后可运行代码
import urllib.request import re import os # 图片保存目录 DIRECTORY = "book" # 目标页面地址 URL = "https://www.inaturalist.org/taxa/56061-Alliaria-petiolata/browse_photos" # 修正后的正则:匹配static.inaturalist.org域名下的图片直链 REGEX = r'(?<=src=")https://static\.inaturalist\.org/photos/[^"]+\.(?:jpg|jpeg)' # 文件名前缀 PREFIX = 'page_' if not os.path.isdir(DIRECTORY): os.mkdir(DIRECTORY) # 构造带合法User-Agent的请求,绕过反爬拦截 req = urllib.request.Request( URL, headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36' } ) contents = urllib.request.urlopen(req).read().decode('utf-8') links = re.findall(REGEX, contents) # 去重,避免同一张图重复下载 links = list(set(links)) print(f"Found {len(links)} links") print("Starting download...") page_number = 1 total = len(links) downloaded = 0 for link in links: filename = f"{DIRECTORY}/{PREFIX}{page_number}.jpg" if not os.path.isfile(filename): # 下载时同样携带请求头,避免CDN拦截 img_req = urllib.request.Request(link, headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36' }) with urllib.request.urlopen(img_req) as resp, open(filename, 'wb') as f: f.write(resp.read()) downloaded += 1 print(f"done: {filename} ({downloaded}/{total})") else: print(f"skip: {filename} ({downloaded}/{total})") page_number += 1 print(f"Downloaded {downloaded} files")
额外说明
- 代码增加了链接去重逻辑,避免页面中重复出现的同一张图片被多次下载
- 如果需要下载更高分辨率的原图,可以把匹配到的链接里的尺寸后缀(比如
square.jpg、small.jpg)替换为original.jpg即可 - 该站点的图片页是滚动加载的,当前代码只会下载首屏加载的30张左右图片,如果需要爬取全量图片需要额外处理分页/滚动加载的接口逻辑
内容的提问来源于stack exchange,提问作者Murad Ali
相关产品推荐
相关产品推荐

