跳转到内容

使用 Scrapy 和 Selenium 配合 GProxy.net 代理进行价格采集

Инструменты
使用 Scrapy 和 Selenium 配合 GProxy.net 代理进行价格采集

大规模价格采集需要一种混合方案,在原始速度与绕过复杂反机器人机制的能力之间取得平衡。将 Scrapy 的异步爬取框架、Selenium 的浏览器自动化与 GProxy.net 的住宅代理网络结合起来,开发者即可从防护最严密的电商环境中稳定提取实时价格数据。这种组合让您既能处理重度依赖 JavaScript 的渲染,又能通过轮换住宅 IP 保持较低的被检测特征。

高性能价格采集器的架构

搭建价格采集器早已不是发一个 GET 请求再解析 HTML 那么简单。Amazon、Zalando、Walmart 等现代电商平台采用动态价格渲染:商品的真实价格是在页面初次加载后由 JavaScript 注入 DOM 的。这就要求采用两层架构。

Scrapy 是整套流程的骨架。其异步特性可同时处理数千个请求,非常适合爬取分类页并发现商品 URL。但当 Scrapy 遇到由 PerimeterX 或 Akamai 保护的页面,或者需要大量执行 JS 才能显示「Buy Box」价格的页面时,它会把任务交给 Selenium。Selenium 运行真实的浏览器实例(Chrome 或 Firefox),像真人用户一样执行脚本、处理 cookie。

这套架构中缺失的一环是网络身份。电商网站会监控 IP 信誉和请求模式。一旦发现来自数据中心 IP 段的大量请求,就会立即返回 CAPTCHA 或错误的价格数据(ghosting)。GProxy.net 提供掩盖这些自动化请求所需的住宅基础设施。使用 GProxy 的轮换住宅代理时,每个请求看起来都来自一条独立的家庭宽带连接,目标服务器几乎无法把采集程序与真实买家区分开。

使用 Scrapy 和 Selenium 配合 GProxy.net 代理进行价格采集

将 GProxy.net 代理接入 Scrapy

要在 Scrapy 中使用 GProxy.net,您需要实现自定义中间件或使用内置的 HttpProxyMiddleware。由于价格采集涉及高频请求,最佳做法是使用 GProxy 的 backconnect 节点,它们在服务端自动完成轮换。

配置 Scrapy 设置

settings.py 中需要启用代理中间件并填入您的 GProxy 凭据。使用住宅代理可确保请求经由真实用户设备转发,大幅降低大规模爬取时被封的概率。


# settings.py
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 400,
}

# GProxy 住宅代理配置
# 格式:http://username:[email protected]:port
PROXY_URL = "http://user-12345:[email protected]:8000"

在 Spider 中实现代理逻辑

您可以在 scrapy.Request 中直接传入代理 meta 标记。当您需要在不同 GProxy 区域之间切换时(例如为做区域价格对比而从美国代理切到英国代理),这一点尤其有用。


import scrapy

class PriceSpider(scrapy.Spider):
    name = 'gproxy_spider'
    
    def start_requests(self):
        urls = ['https://example-ecommerce.com/product-1']
        for url in urls:
            yield scrapy.Request(
                url=url, 
                callback=self.parse,
                meta={'proxy': 'http://user-12345:[email protected]:8000'}
            )

    def parse(self, response):
        price = response.css('.price-tag::text').get()
        yield {'price': price, 'url': response.url}

用 Selenium 和 GProxy 处理动态内容

当网站使用「Shadow DOM」或复杂的 React/Vue 状态管理来显示价格时,Scrapy 的 Selector 会返回空结果。此时就必须用 Selenium。为保持匿名,Selenium 同样需要配置为使用 GProxy.net 节点。

代理集成推荐使用 selenium-wire,因为它便于修改请求头,并支持带认证的代理——标准 Selenium 驱动在不手动加载扩展的情况下往往难以处理这一点。


from seleniumwire import webdriver
from selenium.webdriver.chrome.options import Options

def get_dynamic_price(url):
    proxy_options = {
        'proxy': {
            'http': 'http://user-12345:[email protected]:8000',
            'https': 'https://user-12345:[email protected]:8000',
            'no_proxy': 'localhost,127.0.0.1'
        }
    }
    
    chrome_options = Options()
    chrome_options.add_argument('--headless') # 无界面运行以提升性能
    
    driver = webdriver.Chrome(options=chrome_options, seleniumwire_options=proxy_options)
    
    try:
        driver.get(url)
        # 等待价格元素通过 JS 渲染出来
        price_element = driver.find_element_by_css_selector('.dynamic-price')
        return price_element.text
    finally:
        driver.quit()

使用 Selenium 时,资源管理至关重要。单个 Chrome 实例可能占用 200MB 到 500MB 内存。若要采集 10,000 个价格,不应启动 10,000 个实例。应改用 worker 池,或把 Selenium 集成进 Scrapy 中间件(如 scrapy-selenium),以便在多个请求间复用驱动实例。

使用 Scrapy 和 Selenium 配合 GProxy.net 代理进行价格采集

Scrapy 与 Selenium 在价格提取上的对比

选择哪种工具取决于目标站点的复杂度。下表对比了二者与 GProxy.net 住宅代理配合使用时的表现。

特性 Scrapy + GProxy Selenium + GProxy
速度 高(异步) 低(浏览器开销)
资源占用 低(内存高效) 高(CPU/内存密集)
JS 渲染 否(需 Splash/Playwright) 原生支持
绕过反机器人 中(依赖请求头/IP) 高(模拟真实用户)
最佳适用场景 目录/分类页采集 结算页/动态价格逻辑

进阶代理策略:地理定位与粘性会话

价格采集常常需要看到特定地区用户所看到的内容。例如 Amazon 会根据访客的 IP 地址展示不同的运费和本地化价格。GProxy.net 支持精细的地理定位,这对准确的竞品情报至关重要。

实现粘性会话

在某些场景下,您需要在多个请求间保持同一个 IP 地址——例如把商品加入购物车以查看含税的最终价格。GProxy 通过在用户名后追加会话 ID 来支持「粘性会话」。这样在该会话有效期内(例如 10–30 分钟),您的所有请求都会经由同一个住宅出口节点。

粘性会话字符串示例:user-12345-session-uniqueid789:[email protected]:8000。修改其中的 uniqueid789 部分,即可在业务逻辑需要时触发新的 IP。

区域价格对比

如果您在监控某个全球品牌的价格,就必须核对不同市场的定价。使用 GProxy 时,可在代理凭据中指定国家代码。这对于在不同司法辖区核查最低广告价格(MAP)合规性、同时避免被重定向到全球落地页非常关键。

  • 美国定价:在 GProxy 配置中使用 country-us
  • 欧盟定价:使用 country-decountry-fr 查看以欧元计价的价格。
  • 亚太地区:针对 Rakuten、Shopee 等区域电商,定位 country-jpcountry-sg

应对反机器人系统与指纹识别

代理是第一道防线,但成熟的站点还会检查浏览器指纹。使用 Selenium 时,必须把 navigator.webdriver 属性改为 undefined。站点会检查这个标记,以判断浏览器是否受自动化软件控制。

此外还要注意 User-Agent。如果您用了 GProxy 的住宅 IP,却发送 Scrapy 的默认 User-Agent(Scrapy/2.x (+https://scrapy.org)),会被立刻封锁。请始终使用 python-user-agents 之类的库生成真实、现代且与您在 Selenium 中模拟的浏览器版本相匹配的字符串。

  1. 轮换 User-Agent:确保 User-Agent 与代理所呈现的设备类型(移动端或桌面端)一致。
  2. 管理 cookie:除非在多步骤流程中使用粘性会话,否则应在会话之间清除 cookie。
  3. 随机化延迟:在 Selenium 中使用 time.sleep(random.uniform(1, 5)) 模拟人类阅读节奏。
  4. 监控响应码:看到 403 或 427 时,立即轮换您的 GProxy 会话 ID。

要点总结

大规模成功采集价格,是效率与隐蔽性之间的平衡。把 Scrapy、Selenium 与 GProxy.net 结合起来,您就能构建一条稳健的流水线,跨过网页采集中最常见的障碍。

  • 混合方案:用 Scrapy 做大批量 URL 发现,只在必须执行 JavaScript 才能显示价格的页面上使用 Selenium。
  • 住宅代理的优势:最终数据提取阶段务必使用 GProxy.net 的住宅代理;数据中心 IP 太容易被电商 CDN 过滤器标记。
  • 会话管理:当您需要在多步骤的价格获取流程(例如加入购物车、填写邮编)中保持一致身份时,请使用粘性会话。

实用建议 1:务必按代理区域监控「成功率」。如果发现某个地区的成功提取量下降,请立即轮换 GProxy 会话 ID,或从数据中心节点切换到住宅节点。

实用建议 2:在 Scrapy 中实现一个专门捕捉 429(Too Many Requests)和 403(Forbidden)错误的「Retry Middleware」。将其配置为自动使用新的 GProxy 住宅 IP 重试该请求,确保爬取不会因临时封锁而停滞。

support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.