使用BeautifulSoup爬取动态网站时,不规则类名标签无法获取数据
解决动态电商网站爬取时BeautifulSoup返回None的问题
核心问题原因
- 动态页面渲染:你爬取的电商网站依赖JavaScript异步加载商品数据,直接用
requests获取的HTML仅包含页面框架,没有实际商品内容,导致BeautifulSoup无法定位目标元素,返回None。 - 动态生成类名:网站标签的类名是随机生成的动态值,固定类名无法匹配到目标元素,即使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
相关产品推荐
相关产品推荐

