如何用Jsoup提取JavaScript中的链接?爬虫获取手机图片遇动态加载问题
搞定动态加载的手机图片爬虫方案
嘿,这种JS异步替换图片源的情况太常见了!我之前爬电商网站的手机品类时,也碰到过一模一样的问题——普通爬虫拿的都是占位图,真实图片得等页面加载完才会被JS替换。给你分享几个亲测有效的解决办法:
1. 用无头浏览器模拟真实渲染
这是最省心的方法,直接模拟真人打开浏览器的过程,让JS跑完再拿数据。推荐用Playwright(比Selenium更轻量),代码大概是这样:
from playwright.sync_api import sync_playwright with sync_playwright() as p: # 启动无头浏览器(headless=True就是不显示窗口) browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto("你的目标网站URL") # 等手机图片元素加载完成,比如假设图片的class是"product-phone-img" page.wait_for_selector(".product-phone-img") # 批量获取所有手机图片的真实链接 phone_imgs = page.query_selector_all(".product-phone-img") for img in phone_imgs: real_img_url = img.get_attribute("src") print(real_img_url) browser.close()
这种方法不用抠JS逻辑,缺点就是比纯HTTP请求慢一点,但胜在稳,几乎能处理所有动态渲染的内容。
2. 直接扒网站的API接口
很多网站的真实图片是通过AJAX接口拉取的,你可以用浏览器开发者工具抓包找接口:
- 按F12打开开发者工具,切换到「Network」标签,过滤「XHR/Fetch」请求
- 刷新页面,找带「image」「product」这类关键词的请求,点进去看响应内容,大概率能找到手机图片的URL列表
- 然后直接用爬虫请求这个API,把参数(比如商品ID、页码)拼对,就能拿到干净的图片链接了
这种方法效率最高,不用渲染页面,但需要你稍微分析下接口的参数规则,要是有签名验证的话可能得花点功夫破解。
3. 从页面的全局JS变量里抠数据
有些网站会把商品图片数据直接嵌在页面的全局JS变量里,比如window.productDetail之类的。你可以用正则从初始HTML里提取:
import requests import re import json resp = requests.get("目标网站URL") # 假设全局变量是window.phoneGallery = {...} pattern = re.compile(r'window\.phoneGallery\s*=\s*(.*?);') match_result = pattern.search(resp.text) if match_result: img_data = json.loads(match_result.group(1)) # 假设图片链接存在imageUrls字段里 print(img_data["imageUrls"])
这种方法速度快,也不用渲染页面,适合那些把数据直接塞在页面JS里的网站。
最后提个醒
不管用哪种方法,记得遵守目标网站的robots.txt规则,别爬太猛,必要的时候加个请求头(比如User-Agent模拟真实浏览器)、用代理轮换IP,避免被封。
内容的提问来源于stack exchange,提问作者Constantin N.
相关产品推荐
相关产品推荐

