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

基于Python bs4抓取网站多选搜索栏全部可选值的技术求助

如何抓取动态加载的"TYPE DE BIENS"选项列表

这个多选搜索栏的选项是动态加载的——不会在页面初始HTML中直接渲染,而是通过前端JS根据输入内容请求后端数据,所以直接用BeautifulSoup爬静态页面拿不到完整选项。以下是几个实用的解决方法:

方法1:提取页面内嵌的JS变量

很多网站会把这类下拉选项的完整数据集提前存在页面的JS代码里,你可以这么操作:

  1. 打开目标页面的开发者工具(F12),切换到Console标签,搜索已知选项的关键词(比如"Tabac - Presse - Loto"),找到存储所有选项的JS数组(比如可能命名为biensTypes、propertyTypes之类的)。
  2. 用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请求到后端获取匹配选项,你可以直接调用这个接口获取全量数据:

  1. 打开开发者工具的Network标签,输入任意字母(比如"a"),过滤XHR请求,找到返回选项的接口(URL通常包含search、autocomplete等关键词)。
  2. 查看请求参数:有些接口允许传入空字符串或特定参数返回所有选项;如果必须传关键词,也可以遍历字母组合,但优先找全量返回的方式。
  3. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:10:37