Python爬取关联下拉菜单所有选项问题求助
关联下拉菜单爬取解决方案
问题核心
关联下拉菜单的选项是动态加载的,静态请求初始页面只能拿到第一级数据,后续选项需要依赖上一级选择后通过AJAX请求获取,所以你用BeautifulSoup直接爬静态页面的方式无法拿到完整的关联数据。
解决步骤
分析网络请求
打开浏览器开发者工具(F12)→ 切换到「Network」标签,选择「XHR」过滤。当你在页面上选择第一级下拉选项时,观察新出现的请求,找到获取下一级选项的API接口,记录其URL、请求参数和headers。模拟请求获取层级数据
先爬取第一级下拉的所有选项,再遍历每个选项,模拟AJAX请求获取对应的下一级选项,以此类推直到拿到所有层级数据。整理并导出数据
将获取到的层级数据(如品牌、车型、子型号等)整理成结构化格式,再用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
相关产品推荐
相关产品推荐

