首页 > 解决方案 > 并非所有容器都使用漂亮的汤装载

问题描述

我正在尝试转储一个网站(网站链接在下面的代码中给出)并且所有容器都没有加载。就我而言,价格容器没有倾销。有关更多详细信息,请参阅屏幕截图。如何解决这个问题?

在此处输入图像描述

在此处输入图像描述

在这种情况下,“I6yQz”类中的容器未加载。

我的代码:

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 个月保修)','Price':'4299','ServicesOffered':'['免费Pick up & drop', '免费安装', '含旧电池价格', '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 而不是 carName 和 cityName,我不知道哪个 carId 映射到什么 carName。

标签: pythonweb-scraping

解决方案


正如评论所指出的——这个网站通过javascript动态加载一些对象,比如价格。

当您连接到该页面时,您可以在后台看到正在发出的请求:

在此处输入图像描述

你需要做的是弄清楚如何在你的 python 代码中复制这个请求:

import requests

headers = {
    # this website sues authroization for all requests
    'Authorization': 'Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiJiNGJjM2NhZjVkMWVhOTlkYzk2YjQzM2NjYzQzMDI0ZTAyM2I0MGM2YjQ5ZjExN2JjMDk5OGY2MWU3ZDI1ZjM2MTU1YWU5ZDIxNjE2ZTc5NSIsInNjb3BlcyI6W10sInN1YiI6IjE2MzM5MzQwNjY5NCIsImV4cCI6MTYzNjUyNjA2Ny4wLCJhdWQiOiIzIiwibmJmIjoxNjMzOTM0MDY3LjAsImlhdCI6MTYzMzkzNDA2Ny4wfQ.QQI_iFpNgONAIp4bfoUbGDtnnYiiViEVsPQEK3ouYLjeyhMkEKyRclazuJ9i-ExQyqukFuqiAn4dw7drGUhRykJY6U67iSnbni0aXzzF9ZTEZrvMmqItHXjrdrxzYCqoKJAf2CYY-4hkO-NXIrTHZEnk-N_jhv30LHuK9A5I1qK8pajt4XIkC7grAn3gaMe3c6rX6Ko-AMZ801TVdACD4qIHb4o73a3vodEMvh4wjIcxRGUBGq4HBgAKxKLCcWaNz-z7XjvYrWhNJNB_iRjZ1YBN97Xk4CWxC0B4sSgA2dVsBWaKGW4ck8wvrHQyFRfFpPHux-6sCMqCC-e4okOhku3AasqPKwvUuJK4oov9tav4YsjfFevKkdsCZ1KmTehtvadoUXAHQcij0UqgMtzNPO-wKYoXwLc8yZGi_mfamAIX0izFOlFiuL26X8XUMP5HkuypUqDa3MLg91f-8oTMWfUjVYYsnjw7lwxKSl7KRKWWhuHwL6iDUjfB23qjEuq2h9JBVkoG71XpA9SrJbunWARYpQ48mc0LlYCXCbGkYIh9pOZba7JGMh7E15YyRla8qhU9pEkgWVYjzgYJaNkhrSNBaIdY56i_qlnTBpC00sqOnHRNVpYMb4gF3PPKalUMMJjbSqzEE2BNTFO5dGxGcz2cKP0smoVi_SK3XcKgPXc',
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) QtWebEngine/5.15.2 Chrome/87.0.4280.144 Safari/537.36',
}

url = 'https://gomechanic.in/api/v1/priceList?city=gurgaon&brand=maruti-suzuki&service=car-battery-replacement'
response = requests.get(url, headers=headers)
print(response.json())

这将导致:

{
  "success": true,
  "data": [
    {
      "id": 1,
      "name": "800 Petrol",
      "price": 3400,
      "savings": "25%"
    },
    {
      "id": 2,
      "name": "800 CNG",
      "price": 3400,
      "savings": "25%"
    },
    {
      "id": 3,
      "name": "Alto Petrol",
      "price": 3400,
      "savings": "25%"
    },
    {
      "id": 4,
      "name": "Alto CNG",
      "price": 3400,
      "savings": "25%"
    },
    {
      "id": 5,
      "name": "Alto 800 Petrol",
      "price": 3400,
      "savings": "25%"
    },
    {
      "id": 6,
      "name": "Alto 800 CNG",
      "price": 3400,
      "savings": "25%"
    }
  ]
}

这整个过程称为逆向工程,更深入的介绍可以在这里查看我的教程博客:https ://scrapecrow.com/reverse-engineering-intro.html

至于在这些后端 API 请求中使用的参数 - 它们很可能在初始 html 文档初始状态 json 对象中。如果您喜欢view page source html 页面和ctrl+f参数名称city_id,可以看到它隐藏在一些 json 中。您可以提取整个 JSON 并对其进行解析,也可以使用正则表达式re.findall('"city_id":(\d+)', html)[0]来获取这个值。


推荐阅读