You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python代码下载网页图片匹配0条链接下载失败问题求解

问题根因

代码匹配不到图片链接是以下几个问题导致的:

  • 正则匹配逻辑完全不符合当前站点结构:
    1. 正则限定匹配http://数字.bp.inaturalist.org开头的地址,该域名是站点早年使用的CDN地址,目前所有图片资源已迁移至https://static.inaturalist.org域名,且强制使用HTTPS协议
    2. 正则从<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 10:18:19