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

Python爬取关联下拉菜单所有选项问题求助

关联下拉菜单爬取解决方案

问题核心

关联下拉菜单的选项是动态加载的,静态请求初始页面只能拿到第一级数据,后续选项需要依赖上一级选择后通过AJAX请求获取,所以你用BeautifulSoup直接爬静态页面的方式无法拿到完整的关联数据。

解决步骤

  1. 分析网络请求
    打开浏览器开发者工具(F12)→ 切换到「Network」标签,选择「XHR」过滤。当你在页面上选择第一级下拉选项时,观察新出现的请求,找到获取下一级选项的API接口,记录其URL、请求参数和headers。

  2. 模拟请求获取层级数据
    先爬取第一级下拉的所有选项,再遍历每个选项,模拟AJAX请求获取对应的下一级选项,以此类推直到拿到所有层级数据。

  3. 整理并导出数据
    将获取到的层级数据(如品牌、车型、子型号等)整理成结构化格式,再用pandas转成DataFrame并导出为CSV。

代码示例

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time

# 初始页面URL
base_url = "https://www.autodoc.de/"
headers = {
    "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",
    "Referer": base_url,
    "X-Requested-With": "XMLHttpRequest"
}

# 1. 获取第一级(品牌)选项
response = requests.get(base_url, headers=headers)
soup = BeautifulSoup(response.text, "lxml")
brand_select = soup.find("select", {"name": "brand_id"})

brands = []
for optgroup in brand_select.find_all("optgroup"):
    group_label = optgroup.get("label")
    for option in optgroup.find_all("option"):
        brand_val = option.get("value")
        if brand_val:
            brands.append({
                "品牌分组": group_label,
                "品牌ID": brand_val,
                "品牌名称": option.text.strip()
            })

# 2. 遍历品牌,获取第二级(车型)选项
all_data = []
for brand in brands:
    print(f"正在爬取品牌:{brand['品牌名称']}")
    params = {
        "brandId": brand["品牌ID"],
        "catalogId": "1"  # 实际参数需从浏览器请求中确认
    }
    # 模拟获取车型的AJAX请求(URL需替换为实际观察到的接口)
    model_url = "https://www.autodoc.de/ajax/carselector/get-models"
    model_res = requests.get(model_url, headers=headers, params=params)
    model_soup = BeautifulSoup(model_res.text, "lxml")
    
    model_select = model_soup.find("select", {"name": "model_id"})
    if model_select:
        for optgroup in model_select.find_all("optgroup"):
            model_group = optgroup.get("label")
            for option in optgroup.find_all("option"):
                model_val = option.get("value")
                if model_val:
                    all_data.append({
                        "品牌分组": brand["品牌分组"],
                        "品牌ID": brand["品牌ID"],
                        "品牌名称": brand["品牌名称"],
                        "车型分组": model_group,
                        "车型ID": model_val,
                        "车型名称": option.text.strip()
                    })
    time.sleep(1)  # 添加延时,避免请求过于频繁

# 3. 导出为DataFrame和CSV
df = pd.DataFrame(all_data)
df.to_csv("汽车品牌车型数据.csv", index=False, encoding="utf-8-sig")
print("数据已成功导出为CSV文件")

注意事项

  • 务必通过浏览器开发者工具确认实际的API接口URL和请求参数,示例中的接口仅作参考。
  • 若有更深层级的下拉选项(如年份、发动机),需重复上述步骤,继续模拟对应请求获取数据。
  • 可根据需求调整headers和延时时间,避免触发网站反爬机制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 15:05:06