基于Python bs4抓取网站多选搜索栏全部可选值的技术求助
如何抓取动态加载的"TYPE DE BIENS"选项列表
这个多选搜索栏的选项是动态加载的——不会在页面初始HTML中直接渲染,而是通过前端JS根据输入内容请求后端数据,所以直接用BeautifulSoup爬静态页面拿不到完整选项。以下是几个实用的解决方法:
方法1:提取页面内嵌的JS变量
很多网站会把这类下拉选项的完整数据集提前存在页面的JS代码里,你可以这么操作:
- 打开目标页面的开发者工具(F12),切换到
Console标签,搜索已知选项的关键词(比如"Tabac - Presse - Loto"),找到存储所有选项的JS数组(比如可能命名为biensTypes、propertyTypes之类的)。 - 用Python自动提取这个数组:
import requests import re import json target_url = "https://www.cessionpme.com/annonces,fonds-de-commerce-entreprise-tabac-presse-loto,45,1,offres.html" page_source = requests.get(target_url).text # 正则匹配存储选项的JS数组(需根据实际变量名调整) pattern = re.compile(r'var biensTypes = (\[.*?\]);', re.DOTALL) match_result = pattern.search(page_source) if match_result: options_data = json.loads(match_result.group(1)) # 提取选项文本(字段名如label/name需根据实际结构调整) for item in options_data: print(item.get('label', item.get('name')))
方法2:直接调用AJAX接口
当你在搜索栏输入字符时,网站会发送AJAX请求到后端获取匹配选项,你可以直接调用这个接口获取全量数据:
- 打开开发者工具的
Network标签,输入任意字母(比如"a"),过滤XHR请求,找到返回选项的接口(URL通常包含search、autocomplete等关键词)。 - 查看请求参数:有些接口允许传入空字符串或特定参数返回所有选项;如果必须传关键词,也可以遍历字母组合,但优先找全量返回的方式。
- 用Python请求接口:
import requests # 替换为你找到的AJAX接口URL api_endpoint = "https://www.cessionpme.com/xxx/autocomplete-biens-types" # 根据接口要求传参,比如空关键词返回全量 request_params = {'query': ''} response = requests.get(api_endpoint, params=request_params) options_list = response.json() for option in options_list: print(option.get('label')) # 字段名根据实际返回调整
备选:用Selenium模拟交互
如果前两种方法无法实现,用Selenium模拟用户输入,收集所有弹出的选项:
from selenium import webdriver from selenium.webdriver.common.by import By import time driver = webdriver.Chrome() driver.get(target_url) # 定位搜索栏(需替换为实际的CSS选择器/XPath) search_box = driver.find_element(By.CSS_SELECTOR, "input[name='type_biens']") all_options = set() # 遍历所有大小写字母,触发选项加载 all_chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' for char in all_chars: search_box.clear() search_box.send_keys(char) time.sleep(0.6) # 等待选项渲染 # 定位所有弹出的选项元素(替换为实际选择器) option_elements = driver.find_elements(By.CSS_SELECTOR, ".autocomplete-item") for elem in option_elements: opt_text = elem.text.strip() if opt_text: all_options.add(opt_text) # 输出去重后的所有选项 for opt in sorted(all_options): print(opt) driver.quit()
注意事项
- 操作时要根据页面实际的HTML结构、JS变量名、AJAX接口参数调整代码细节。
- 注意网站的反爬机制,不要频繁请求,必要时添加请求头、设置延迟。
内容的提问来源于stack exchange,提问作者Sam06
相关产品推荐
相关产品推荐

