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

使用BeautifulSoup爬取动态网站时,不规则类名标签无法获取数据

解决动态电商网站爬取时BeautifulSoup返回None的问题

核心问题原因

  1. 动态页面渲染:你爬取的电商网站依赖JavaScript异步加载商品数据,直接用requests获取的HTML仅包含页面框架,没有实际商品内容,导致BeautifulSoup无法定位目标元素,返回None。
  2. 动态生成类名:网站标签的类名是随机生成的动态值,固定类名无法匹配到目标元素,即使HTML中有数据也无法提取。

可靠解决思路

放弃解析HTML,直接抓取网站加载数据的API接口:

  • 通过浏览器抓包找到返回商品数据的JSON接口,这类接口返回的数据结构稳定清晰,无需依赖不稳定的HTML标签。
  • 用requests直接请求该接口,解析JSON提取商品名称、价格等所需字段。

操作步骤与代码示例

1. 抓包找API接口

  • 打开浏览器开发者工具(F12),切换到「网络」面板,勾选「XHR」选项。
  • 刷新目标页面,找到名称包含product、list等关键词的请求,查看其URL、请求头和参数。

2. 编写接口请求代码

以你提供的Carrefour网站为例,参考如下代码(需替换为抓包得到的真实接口信息):

import requests
import pandas as pd

# 替换为抓包获取的真实API地址
api_url = "https://mercado.carrefour.com.br/api/products/list"
headers = {
    'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36",
    'Accept': 'application/json',
    # 若抓包发现需要其他请求头(如Referer、Cookie),在此补充
}
# 替换为抓包得到的请求参数
params = {
    'category-1': 'mercearia,3002077',
    'category-2': 'acucar-e-adocante',
    'facets': 'category-1,category-2',
    'sort': 'score_desc',
    'page': '0'
}

# 请求接口并解析JSON
response = requests.get(api_url, headers=headers, params=params)
data = response.json()

# 提取商品名称和价格(根据实际JSON结构调整字段名)
product_list = []
for item in data.get('products', []):
    name = item.get('name')
    current_price = item.get('price', {}).get('current')
    product_list.append({'商品名称': name, '价格': current_price})

# 转为DataFrame查看结果
df = pd.DataFrame(product_list)
print(df)

3. 针对Paodeacucar网站的适配

操作逻辑完全一致:打开对应页面抓包,找到商品数据接口,替换代码中的api_url、headers和params即可。

注意事项

  • 部分接口可能需要携带Cookie或其他验证信息,若请求失败,检查抓包得到的完整请求头并补充到代码中。
  • 不要频繁请求接口,可适当添加请求间隔,避免触发网站反爬机制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 11:42:42