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

使用Beautiful Soup爬取网页时部分容器未加载 无法提取价格数据如何解决

爬虫问题说明

尝试爬取站点https://gomechanic.in/gurgaon/car-battery-replacement/maruti-suzuki-versa/petrol时,发现class为I6yQz的容器内的价格等数据无法被抓取,使用的初始代码如下:

import requests
from bs4 import BeautifulSoup

url = "https://gomechanic.in/gurgaon/car-battery-replacement/maruti-suzuki-versa/petrol"
page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')
print(soup.prettify())

需要提取的字段包含城市名、车型、服务名称、价格、附赠服务等,目标输出格式示例如下:

data = {
    'CityName' : 'Gurgaon',
    'CarName' : 'Versa-Petrol',
    'serviceName' : 'Excide (55 Months Warranty)',
    'Price' : '4299',
    'ServicesOffered' : [
        'Free pickup & drop',
        'Free Installation',
        'Old Battery Price Included',
        'Available at Doorstep'
    ]
}

目前已找到承载全量数据的API接口,地址为https://gomechanic.app/api/v2/oauth/customer/get-services-details-by-category?car_id=249&city_id=1&category_id=-4&user_car_id=null,该接口可在浏览器开发者工具的网络面板中通过名称get-services-details-by-category查询到,但接口要求传入carId和cityId参数,不清楚ID与城市名称、车型名称的映射关系,需要实现数据抓取需求。

解决方案
  • 首先明确静态页面抓取失败的原因:你用requests直接请求得到的是未经过前端渲染的原始静态HTML,价格等数据是页面加载完成后通过异步接口请求、前端动态渲染到页面上的,所以原始HTML里不存在class为I6yQz的容器,BeautifulSoup自然解析不到对应内容。
  • 优先选择API方案实现抓取,效率远高于解析页面:
    1. 获取cityId与城市名的映射表:打开站点首页,切换不同城市时在网络面板抓包,找到返回城市列表的公共接口,接口返回内容会同时包含每个城市的名称和对应的cityId,爬取这个接口即可拿到完整的映射关系。
    2. 获取carId与车型的映射表:在站点选择车型的操作流程中抓包,选择品牌、车系、燃料类型时触发的请求会返回对应层级的车型数据,数据中包含每个车型对应的carId,按层级爬取所有车型数据即可得到车型名称和carId的完整映射。
    3. 批量请求服务详情接口:根据你需要的城市、车型组合,用映射表匹配得到对应的cityId和carId,拼接参数后请求你已经找到的服务详情接口,接口返回的是结构化JSON数据,直接按字段提取就能得到你需要的所有内容,不需要解析DOM。
  • 小批量抓取可选模拟浏览器方案:如果只需要少量城市、车型的数据,不想梳理映射关系,可以用Selenium、Playwright这类模拟浏览器的工具,启动浏览器加载完整页面后等待动态内容渲染完成,再定位I6yQz容器提取对应数据即可,不需要处理API参数问题。

内容的提问来源于stack exchange,提问作者mukul dhiman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:54:02