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

如何加速基于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,可通过以下优化大幅提升速度:

  1. 复用浏览器实例:不要每次调用函数都新建driver,将driver初始化放在函数外部,重复使用同一个会话
  2. 禁用非必要资源加载:关闭图片、CSS、非必要JavaScript加载,减少浏览器渲染负担
  3. 使用新版无头模式:--headless=new比旧版headless参数更高效稳定
  4. 用显式等待替代全局等待:只等待目标元素加载完成,避免无意义的等待
  5. 更换更快的解析器:用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:35:20