使用BeautifulSoup爬取网站图片src仅返回2个结果如何解决
问题根因
- 原生
urllib.request发起请求时默认携带的User-Agent会被站点识别为爬虫,Imgur反爬策略会对这类请求返回仅包含统计追踪像素的极简初始页,和正常浏览器访问拿到的完整页面内容完全不同,这是仅拿到2个追踪链接的核心原因。 - 目前主流站点普遍使用图片懒加载方案,图片真实地址不会直接写入
src属性,而是暂存在data-src、data-original、data-lazy-src等自定义属性中,待页面滚动到对应位置时才会通过JS替换到src上,仅提取src属性会漏掉绝大多数图片。 - 站点的瀑布流、动态推荐内容均由前端JS渲染生成,静态HTTP请求获取的原始HTML中不包含这部分DOM节点。
可运行修改代码
先安装依赖:pip install beautifulsoup4 html5lib requests
对应代码:
from bs4 import BeautifulSoup import requests # 模拟正常浏览器请求头,绕过基础反爬校验 headers = { "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" } # Imgur已强制HTTPS协议,HTTP请求会被跳转 html_page = requests.get("https://imgur.com", headers=headers).text soup = BeautifulSoup(html_page, features="html5lib") images = [] # 覆盖所有可能存储图片真实地址的标签属性 img_attrs = ["src", "data-src", "data-original", "data-lazy-src", "data-srcset"] for img in soup.find_all("img"): for attr in img_attrs: img_url = img.get(attr) if img_url: # 补全相对路径地址 if img_url.startswith("//"): img_url = "https:" + img_url elif img_url.startswith("/"): img_url = "https://imgur.com" + img_url # 过滤统计追踪类无效像素链接 if any(track_domain in img_url for track_domain in ["facebook.com/tr", "scorecardresearch.com"]): continue images.append(img_url) break # 结果去重 images = list(set(images)) print(images)
补充说明
上述静态爬取代码仅能提取首屏非懒加载的图片,如果需要获取全量页面图片,有两种可选方案:
- 抓包分析站点的前端接口,直接调用返回图片列表的后端API,爬取效率最高
- 使用Playwright、Selenium等可模拟浏览器执行JS的工具,等待页面渲染完成、懒加载资源触发后再提取DOM内容
内容的提问来源于stack exchange,提问作者mmalagocki
相关产品推荐
相关产品推荐

