python - 并非所有容器都使用漂亮的汤装载
问题描述
我正在尝试转储一个网站(网站链接在下面的代码中给出)并且所有容器都没有加载。就我而言,价格容器没有倾销。有关更多详细信息,请参阅屏幕截图。如何解决这个问题?
在这种情况下,“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。
解决方案
正如评论所指出的——这个网站通过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]
来获取这个值。
推荐阅读
- curl - 使用 LexikJWTAuthenticationBundle 和 Symfony 3.4 创建身份验证令牌
- r - x$data[i, j] <- value 中的错误:要替换的项目数不是替换长度的倍数
- c# - 生成的pdf文件的分辨率
- html - 如何最好地创建这个箭头形状的 div/按钮?
- maven - 在不同的 Maven 模块中读取文件内容
- smt - 为什么CVC4产品运营商不适用于套装?
- angular - Angular如何订阅界面更改?
- android - 比较两个列表返回 false (android)
- vba - 从组合框中选择特定选项应该使文本框字段强制输入文本
- windows - Windows FTP 服务器和客户端未将文件行结尾更改为 CR LF