如何稳定爬取React+jQuery构建站点的商品数据,解决Selenium返回结果不稳定问题
问题根因
- 等待逻辑无效:现有代码的
WebDriverWait没有传入具体的目标元素定位参数,相当于没有设置等待条件,页面未完成渲染就直接读取源码,自然会出现元素提取不稳定的情况 - 站点为客户端渲染架构:商品数据由JavaScript异步请求后动态渲染到页面,requests、Scrapy直接发送请求只能拿到未填充数据的初始HTML模板,无法获取目标元素
解决方案1:修正Selenium实现(无需调整现有技术栈)
正确设置等待条件,等待三个目标元素全部加载完成后再提取内容,参考代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup as soup browser = webdriver.Firefox() browser.get('https://shop.mango.com/gb/women/skirts-midi/midi-satin-skirt_17042020.html?c=99') wait = WebDriverWait(browser, 20) # 等待所有目标元素加载完成 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.product-name'))) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.product-sale'))) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.colors-info'))) s = soup(browser.page_source, 'html.parser') name = s.select_one('.product-name').getText().strip() price = s.select_one('.product-sale').getText().strip() color = s.select_one('.colors-info').getText().strip() print(name, price, color) browser.quit()
小提示:用
select_one替代select[0]写法更简洁,也可以直接用Selenium自带的元素提取方法,无需额外引入BeautifulSoup。
解决方案2:直接抓取数据接口(效率更高,性能更好)
绕过前端渲染逻辑,直接请求站点的商品数据接口,仅需构造符合要求的请求头即可获取完整的结构化商品数据,无需启动浏览器,运行速度更快,稳定性更高。
- 接口请求需带和浏览器一致的
User-Agent、Accept等请求头,避免被反爬拦截 - 可通过浏览器开发者工具的网络面板,过滤Fetch/XHR请求找到返回商品详情数据的接口,直接解析响应的JSON数据即可提取所需字段
内容的提问来源于stack exchange,提问作者Seyadin
相关产品推荐
相关产品推荐

