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

Scrapy二级下拉多选项爬取失败及多级提取方案咨询

问题分析

原脚本没法抓到部分场景下的二级/三级下拉选项,主要问题出在:

  • 目标页面的下拉选项靠JavaScript动态生成——选特定Size(比如6ft 4in)后,对应的Capacity、Pack Pieces选项才会通过JS加载出来。但Scrapy默认只爬静态HTML,触发不了JS交互,自然拿不到动态加载的内容。
  • 原parse_button方法只从静态响应里提取option标签,碰到需要JS渲染的选项就抓空了。
解决方案:结合Playwright模拟交互抓取

要实现「点击button_url后提取动态下拉选项」,需要用浏览器自动化工具(如Playwright)模拟用户交互,触发JS渲染后再提取数据。以下是完整实现代码:

from scrapy import Spider
from scrapy.crawler import CrawlerProcess
from playwright.sync_api import sync_playwright

class BcfSpider(Spider):
    name = 'product_spider'
    start_urls = ['https://www.bcf.com.au/p/daiwa-23-td-black-spinning-rod/M675158.html']

    def parse(self, response):
        # 获取所有Size按钮的URL
        button_urls = response.css('.swatchanchor::attr(href)').getall()
        
        with sync_playwright() as p:
            # 启动浏览器,headless=True可改为无头模式
            browser = p.chromium.launch(headless=False)
            page = browser.new_page()
            
            for button_url in button_urls:
                page.goto(button_url)
                # 等待下拉菜单元素加载完成
                page.wait_for_selector('.variation-select')
                
                dropdown_data = {}
                # 遍历每个下拉菜单(Size、Capacity、Pack Pieces)
                for select in page.query_selector_all('.variation-select'):
                    # 获取下拉菜单的分类标签
                    label = select.query_selector('..').text_content().strip()
                    # 提取该菜单下的所有有效选项
                    options = []
                    for opt in select.query_selector_all('option'):
                        opt_value = opt.get_attribute('value')
                        opt_text = opt.text_content().strip()
                        if opt_value and opt_text:
                            options.append({'text': opt_text, 'value': opt_value})
                    dropdown_data[label] = options
                
                yield dropdown_data
            
            browser.close()

if __name__ == "__main__":
    process = CrawlerProcess(settings={
        'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    })
    process.crawl(BcfSpider)
    process.start()
关键改进点
  • 用Playwright启动真实浏览器,模拟完整的页面加载和JS渲染流程,确保动态生成的下拉选项能被抓取到。
  • 按下拉菜单的分类(Size、Capacity等)整理选项数据,避免原脚本用选项文本当字典key导致的内容覆盖问题。
  • 增加空值过滤逻辑,剔除无效的空选项数据。
注意事项
  1. 先安装依赖:pip install scrapy playwright,再运行playwright install chromium安装浏览器驱动。
  2. 若不需要可视化浏览器,可将launch(headless=False)改为launch(headless=True)。
  3. 页面加载慢时,可添加page.wait_for_timeout(1000)(单位毫秒)确保内容完全渲染。

内容的提问来源于stack exchange,提问作者Patrick Flores

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:22:35