自学小白,今天试着爬取懂车帝的某些车型的详情配置信息。
看了很多大佬的文章,很多都是直接调用的API数据接口,但是我没找到完整参数的数据接口,就用传统的方法获取基本信息了,欢迎大家批评指正!
先说一句,懂车帝懂车帝你人还怪好的叻!(目前没啥反爬措施)
思路
整体的思路是先获取到车型的id,再获取页面信息,然后处理HTML,导出数据到excel。
因为所有车型信息页面都需要车型id作为参数,所有我们首先要获取到车型id
以海豚为例,我们其实仔细观察网址链接就能发现5008就是海豚的车型id,当然观察法只是说说而已,具体方法参考文章①。
完整代码
1、参考代码
该代码会依次爬取"海豚", "荣放", "普拉多", "兰德酷路泽"这些车型信息,并输出到excel中;
import json
import requests
import pandas as pd
from parsel import Selector
from bs4 import BeautifulSoup
# 搜索汽车名称url
get_car_id_url = "https://www.dongchedi.com/search?keyword={car_name}&currTab=1&city_name={city_name}&search_mode=history"
# headers必须要有
headers = {
'pragma': 'no-cache',
'accept-language': 'zh-CN,zh;q=0.9',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
'accept': '*/*',
'cache-control': 'no-cache',
'authority': 'www.dongchedi.com'
}
# 获取车辆id的函数,最后返回id
def get_car_id(car_name, city_name):
carid_url = get_car_id_url.format(car_name=car_name, city_name=city_name)
response = requests.get(url=carid_url, headers=headers).text
selector = Selector(text=response)
car_message = selector.css('''.dcd-car-series a::attr(data-log-click)''').get()
car_message = json.loads(car_message)
car_id = car_message.get("car_series_id")
return car_id
# 获取车辆详情
def get_car_detail(car_id):
# 汽车详情页url
url = "https://www.dongchedi.com/auto/params-carIds-x-" + str(car_id)
# 发送页面请求
response = requests.get(url, headers)
# 判定是否请求成功
if response.status_code == 200:
print('请求成功(*^▽^*)')
else:
print('请求网页失败┭┮﹏┭┮')
# 获取需要进一步加工的网页数据
html = requests.get(url, headers=headers)
# 设置系统默认编码为UTF-8,防止乱码
html.encoding = 'utf-8'
# 使用BeautifulSoup解析这段代码,得到一个BeautifulSoup对象
soup = BeautifulSoup(html.text, 'lxml')
# 按照标准的缩进格式的结构输出
# print(soup.prettify())
trs = soup.find_all('div', class_='table_row__yVX1h')[3:12]
car_info = []
for tr in trs:
infos = list(tr.stripped_strings)
car_info.append(infos)
# print(car_info)
return car_info
# 启动函数
def main(car_name, city_name):
car_id = get_car_id(car_name=car_name, city_name=city_name)
car_info = get_car_detail(car_id=car_id)
df = pd.DataFrame(car_info)
# print(df)
writer = pd.ExcelWriter(r"D:\work\临时\result.xlsx", mode='a', if_sheet_exists='new') # mode如果不写则只会保留最后一次数据
df.to_excel(writer, sheet_name=car_name, index=False)
writer.close() # 升级了Python,writer.save()会报错
if __name__ == '__main__':
car_list = ["海豚", "荣放", "普拉多", "兰德酷路泽"] # , "欧萌达", "瑞虎5X"
for i in car_list:
main(i, "重庆")
输出结果
2、重点
1、用request请求数据,headers必须要有!
2、详情页里我只取了基本信息先关的前几行,想获取全部信息去掉后面的切片器
trs = soup.find_all('div', class_='table_row__yVX1h')
3、升级了Python,writer.save()会报错 ,要用writer.close()
参考文章
(排名不分先后)