如何加速基于Selenium的Python Coolblue.nl商品爬虫?Selenium是否适用?
关于Coolblue.nl爬虫提速及Selenium适用性的解决方案
一、Selenium是否为合适方案?
结论:不是最优选择。Selenium需要完整启动浏览器实例,即便开启无头模式,也会加载大量浏览器底层组件,天然比直接HTTP请求慢很多。如果能通过普通HTTP请求(如requests)获取数据,优先选择这种方案,速度能提升数倍甚至数十倍。
二、解决requests访问Coolblue.nl失败的问题
你之前用requests访问失败,大概率是请求头不完整或触发了网站反爬机制。可以通过以下方式修复:
- 完善请求头:模拟真实浏览器的请求字段,包括User-Agent、Accept、Accept-Language等
- 使用会话保持Cookie:部分网站需要先请求首页获取Cookie,再请求商品页
- 控制请求频率:避免短时间内大量请求,降低被封禁风险
以下是可用的requests版本代码示例:
import requests from bs4 import BeautifulSoup import json def get_price_with_requests(url): 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', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'nl-NL,nl;q=0.8,en-US;q=0.5,en;q=0.3', 'Referer': 'https://www.coolblue.nl/', 'Connection': 'keep-alive' } # 用会话维持Cookie,先请求首页初始化 session = requests.Session() session.get('https://www.coolblue.nl/', headers=headers) # 请求目标商品页 response = session.get(url, headers=headers) response.raise_for_status() # 抛出请求错误,方便排查问题 # 用lxml解析(需先安装:pip install lxml),速度远快于默认html.parser parser = BeautifulSoup(response.text, 'lxml') json_str = parser.find('script', {'type': 'application/ld+json'}).get_text(strip=True) data = json.loads(json_str) name = data['name'] price = data['offers']['price'] return str(name), float(price)
三、如果必须使用Selenium,如何提速?
如果Coolblue有强反爬(比如Cloudflare人机验证)导致必须用Selenium,可通过以下优化大幅提升速度:
- 复用浏览器实例:不要每次调用函数都新建driver,将driver初始化放在函数外部,重复使用同一个会话
- 禁用非必要资源加载:关闭图片、CSS、非必要JavaScript加载,减少浏览器渲染负担
- 使用新版无头模式:
--headless=new比旧版headless参数更高效稳定 - 用显式等待替代全局等待:只等待目标元素加载完成,避免无意义的等待
- 更换更快的解析器:用
lxml代替默认的html.parser
优化后的Selenium代码示例:
from bs4 import BeautifulSoup 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 import json # 初始化driver放在函数外,复用会话 options = webdriver.ChromeOptions() options.add_argument('--headless=new') options.add_argument('--disable-gpu') options.add_argument('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') options.add_argument('--disable-images') options.add_argument('--disable-css') options.add_argument('--no-sandbox') options.add_argument('--disable-extensions') options.add_argument('--blink-settings=imagesEnabled=false') driver = webdriver.Chrome(options=options) def get_price_with_selenium(url): driver.get(url) # 显式等待目标脚本加载完成,超时5秒 WebDriverWait(driver, 5).until( EC.presence_of_element_located((By.CSS_SELECTOR, 'script[type="application/ld+json"]')) ) data_source = driver.page_source parser = BeautifulSoup(data_source, 'lxml') json_str = parser.find('script', {'type': 'application/ld+json'}).get_text(strip=True) data = json.loads(json_str) name = data['name'] price = data['offers']['price'] return str(name), float(price) # 爬取完成后记得关闭driver # driver.quit()
额外建议
- 批量爬取时,requests可搭配
aiohttp实现异步请求;Selenium建议用多进程(注意控制浏览器实例数量,避免资源耗尽) - 遵守网站
robots.txt规则,合理设置请求间隔,降低IP被封禁的风险
内容的提问来源于stack exchange,提问作者stilts15
相关产品推荐
相关产品推荐

