只是学习交流使用,并不商用和买卖
第一步:先获取A-F标签下的所有的品牌的一个链接:结构如下:
url = "https://www.dongchedi.com/auto/library-energy/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-"+ str(i)+"-x-x"
第二部:从每个品牌的获取所有符合条件的车型的一个链接
第三步:车型连接有车型编号,根据该编号就可以获取该车型的基本信息
url = "https://www.dongchedi.com/auto/params-carIds-x-" + str(i)
整体实现代码:
import json
import requests
import pandas as pd
from parsel import Selector
from bs4 import BeautifulSoup
import time
# 搜索汽车名称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'
}
car_info =[]
car_id = []
with open(r'D:\123.txt','w',encoding='utf-8', errors='replace') as f:
#car_list该列表是为了获取A-Z所有车型的一个链接
car_list= {2, 4, 870, 70,392,7,40,59,165,426,142,62,45,200,75,329,109,198,48,159,348,289,39,535,67,28}
for i in car_list:
url = "https://www.dongchedi.com/auto/library-energy/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-"+ str(i)+"-x-x"
# 发送页面请求
# 判定是否请求成功
# 获取需要进一步加工的网页数据
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('ul', class_='brand_brands__1VgjE')
if trs==None:
continue
else:
trs1=trs.find_all('span', class_='brand_name__1-UUM')
trs2=trs.find_all('a',class_='brand_link__3F8eK')
for tr in trs1:
infos = tr.text
car_info.append(infos)
for tr in trs2:
infos =tr['href']
car_id.append(str(infos))
a=infos.replace("'",'').replace("[",'').replace("]",'')
# print(df)
for item in car_id:
# 将列表的每一个元素写入文件,每个元素后面跟一个换行符
f.write("%s\n" % item)
f.close() # 升级了Python,writer.save()会报错
return car_id
def get_car_pp_sub(url):
car_id=[]
with open(r'D:\234.txt','w',encoding='utf-8', errors='replace') as f:
for i in url:
sub_url = "https://www.dongchedi.com"+i
html = requests.get(sub_url, headers=headers)
# 设置系统默认编码为UTF-8,防止乱码
html.encoding = 'utf-8'
# 使用BeautifulSoup解析这段代码,得到一个BeautifulSoup对象
soup = BeautifulSoup(html.text, 'lxml')
# 按照标准的缩进格式的结构输出
#print(soup.prettify())
trs = soup.find('ul', class_='car-list_root__3bcdu')
if trs==None:
continue
else:
trs2=trs.find_all('a',class_='series-card_name__3QIlf')
for tr in trs2:
infos =tr['href']
infos=infos.split('/')[-1]
car_id.append(infos)
for item in car_id:
# 将列表的每一个元素写入文件,每个元素后面跟一个换行符
f.write("%s\n" % item)
print(item,'写入成功')
f.close()
return car_id
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('''.swiper-slide div::attr(data-log-click)''').get()
car_message = json.loads(car_message)
car_id = car_message.get('params').get('car_series_id')
return car_id
# 获取车辆详情
def get_car_detail(car_id):
# 汽车详情页url
j=0
for i in car_id:
time.sleep(2)
url = "https://www.dongchedi.com/auto/params-carIds-x-" + str(i)
print(url)
# 发送页面请求
response = requests.get(url, headers)
# 判定是否请求成功
if response.status_code == 200:
html = requests.get(url, headers=headers)
# 设置系统默认编码为UTF-8,防止乱码
html.encoding = 'utf-8'
# 使用BeautifulSoup解析这段代码,得到一个BeautifulSoup对象
soup = BeautifulSoup(html.text, 'lxml')
# 按照标准的缩进格式的结构输出
# print(soup.prettify())
car_info = []
car_info_sub=[]
car_info_sub.append('车型')
trs = soup.find_all('div', class_='table_row__yVX1h')
if trs==None:
continue
else:
b=trs[0].find_all('a',class_='cell_car__28WzZ')
for i in range(len(b)):
car_info_sub.append(b[i].next)
car_info.append(car_info_sub)
print(car_info)
trs = soup.find_all('div', class_='table_row__yVX1h')[3:]
char_to_remove = '●'
char_to_remove2='○'
char_to_remove3='图示'
for tr in trs:
infos = list(tr.stripped_strings)
new_list = [item for item in infos if char_to_remove not in item and char_to_remove2 not in item and char_to_remove3 not in item ]
car_info.append(new_list)
df = pd.DataFrame(car_info)
writer = pd.ExcelWriter(r"D:\234.xlsx", mode='a', if_sheet_exists='new') # mode如果不写则只会保留最后一次数据
new_list2 = [item.replace(']', '').replace('[', '').replace('?', '').replace('*', '').replace(':', '').replace('/', '').replace(':', '').replace('\\', '') for item in car_info_sub]
df.to_excel(writer, sheet_name=new_list2[1], index=False)
# 升级了Python,writer.save()会报错
j+=1
print('第',j,'写入成功')
writer.close()
else:
time.sleep(1)
# 获取需要进一步加工的网页数据
html = requests.get(url, headers=headers)
# 设置系统默认编码为UTF-8,防止乱码
html.encoding = 'utf-8'
# 使用BeautifulSoup解析这段代码,得到一个BeautifulSoup对象a
soup = BeautifulSoup(html.text, 'lxml')
car_info = []
car_info_sub=[]
car_info_sub.append('车型')
trs = soup.find_all('div', class_='table_row__yVX1h')
if trs==None:
continue
else:
b=trs[0].find_all('a',class_='cell_car__28WzZ')
for i in range(len(b)):
car_info_sub.append(b[i].next)
car_info.append(car_info_sub)
print(car_info)
trs = soup.find_all('div', class_='table_row__yVX1h')[4:]
char_to_remove = '●'
char_to_remove2='○'
char_to_remove3='图示'
for tr in trs:
infos = list(tr.stripped_strings)
new_list = [item for item in infos if char_to_remove not in item and char_to_remove2 not in item and char_to_remove3 not in item ]
print (new_list)
car_info.append(new_list)
df = pd.DataFrame(car_info)
writer = pd.ExcelWriter(r"D:\234.xlsx", mode='a', if_sheet_exists='new') # mode如果不写则只会保留最后一次数据
new_list2 = [item.replace(']', '').replace('[', '').replace('?', '').replace('*', '').replace(':', '').replace('/', '').replace(':', '').replace('\\', '') for item in car_info_sub]
df.to_excel(writer, sheet_name=new_list2[1], index=False)
# 升级了Python,writer.save()会报错
j+=1
print('第',j,'写入成功')
writer.close()
return car_info
# 启动函数
def main():
car_id = get_car_pingpai()
car_info = get_car_pp_sub(car_id)
get_car_detail(car_info)
if __name__ == '__main__':
car_list = ["奥迪", '埃安', 'AITO', '阿斯顿·马丁', '阿尔法·罗密欧', '阿维塔', '爱驰', '安凯客车', 'AUXUN傲旋', 'AM晓奥', 'ALPINA', 'ABT', 'AC Schnitzer', '艾康尼克', 'Apollo', 'Arash', 'Aria', 'AEV ROBOTICS', 'Aurus', 'Agile Automotive', 'ATS', 'Abarth', 'Aspark', 'Ariel', 'Atlis', 'AEHRA', 'Alpha Motor', 'AIM', 'APEX', '阿尔特', 'AC Cars', 'AFEELA', 'Alpine', '阿莫迪罗', 'Aviar', 'Aznom', '奔驰', '宝马', '本田', '别克', '比亚迪', '保时捷', '奔腾', '宾利', '宝骏', '标致', '北京', '北京汽车', '北汽新能源', '北汽制造', '北汽昌河', '北汽瑞翔', '北汽幻速', '北汽雷驰', '北汽威旺', '宝沃', '博速', '比速汽车', 'Bowler', '百智新能源', '宝能汽车', 'Bertone', '北汽道达', '比德文汽车', '比克汽车', '北京清行', '博郡汽车', '布加迪', '巴菲特', '拜腾', '宾尼 法利纳', '宝腾汽车', '北汽泰普', '保斐利', '百度Apollo', 'Bollinger', '博世', 'BAC', '宝骐汽车', 'BeyonCa', 'Bizzarrini', ' 丰田', '福特', '飞凡汽车', '方程豹', '法拉利', '福田', '菲亚特', '福迪', '飞碟汽车', 'Fisker', 'Faraday Future', 'Foxtron','FM Auto', '弗那萨利', '法诺新能源', 'Fresco ', 'Elemental', 'Elektron', 'E-Legend', 'EdisonFuture', 'Electra Meccanica', 'e.GO', '凯迪拉克', '克莱斯勒', '凯翼', '开瑞', '卡威', '卡升', 'KTM', '开沃汽车', '焜驰 ', '卡尔森', '开云汽车', '克蒂汽车', '克慕勒','科尼赛克', 'Karma', '凯佰赫', 'Kimera', 'Karlmann King', '开利', 'KHANN', '凯马汽车', '小米汽车', '雪佛兰', '现代','小鹏汽车', '雪铁龙', '星途', '享界', '新凯', '星驰', '新龙马汽车', 'SRM鑫源', '新特汽车', '谢尔比', '西雅特', '西尔贝', '小虎', '新吉奥汽车', '小跑车', 'XEV', '小鹏汇天', '中兴', '中华', '中国重汽VGV', '知豆', '之诺', '智己汽车', '正道汽车', 'Zenvo', '众泰', '智界', '自游家', '智点汽车', '智行盒子', '中国重汽', '中植汽车', '特斯拉', '坦克', '天际汽车', '腾势', '泰卡特', '塔塔', '泰克鲁斯·腾风', 'TVR', 'Tramontana', 'TOGG', 'TOROIDION', 'Troller', 'Triton', 'TopCar', '途柚汽车', 'Theon Design', 'THK', 'Touring Superleggera', '拓锐斯特', 'Venturi', 'Vinfast', 'VLF Automotive', 'VANTAS', 'Vanda Electric', 'Vega Innovations', 'Vanwall', 'VIRITECH', 'iCAR', 'Icona', 'Italdesign', 'Inferno', 'IED', 'INKAS', 'INEOS', 'IZERA', 'INDI', '五菱汽车', '沃尔沃', '蔚来', '魏牌', '威马汽车', '五十铃', '威麟', 'WALD', '伟昊汽车', '威兹曼', '沃克斯豪尔', 'W Motors', '瓦滋', '未奥汽车', 'WayRay', '万象汽车', '高合', '广汽传祺', '广汽集团', '国金汽车', '国机智骏', '国新新能源', '观致', '广通客车', '广汽吉奥', '光冈', 'GMC', 'GYON', 'GFG Style', 'Ginetta', 'GTA', 'Gumpert', 'GAZ', '格罗夫', '谷歌', 'GLM', 'GMA', 'G-POWER', 'GUNTHER WERKS', 'GEMBALLA', 'G&B Design', '国吉商用车', '吉利汽车', '吉利银河', '极氪', '捷途', '捷豹', '捷达', '吉利几何', '捷尼赛思', 'Jeep', '江铃', 'ARCFOX极狐', '江铃晶马汽车', '江淮汽车', '江淮瑞风', '江淮钇为', '江汽集团', '金杯', 'Polestar极星', '钧天汽车', '江铃集团新能源', '极越', '九龙', '江南汽车', '金龙', '金旅', '金杯新能源', '极石汽车', '吉祥汽车', '君马汽车', '嘉远汽车', '奇点汽车', '金冠汽车', '金琥新能源', 'Jannarelly', '佳跃', '马自达', '名爵', '玛莎拉蒂', 'MINI', '迈凯伦', '迈迈', '迈莎锐', '摩根', '敏安汽车', 'Mazzanti', 'Mole', '摩登汽车', '猛士', 'MELKUS', '迈巴赫', '米高', 'MAGNA', 'Mahindra', 'Manhart', 'Mobilize', 'Moke', '迈越', 'Micro', 'MILITEM', 'Meyers Manx', 'Munro', 'Mullen', '斯柯达', '三菱', '上汽大通MAXUS', 'smart', '深蓝汽车', '思皓', 'SERES赛力斯', '斯巴鲁', '世极', 'SWM斯威汽车', '沙龙汽车', '双龙', '思铭', '速达', '陕汽通家', '上喆', '世爵', '斯达泰克', '神州', '赛麟', '双环', '萨博', '上汽集团', '申龙客车', '水星', 'Scion', 'SONY', 'Sono Motors', '首望', 'Share2Drive', '松散机车', '777 Motors', '盛唐', '3D Design', 'Silence', '斯太尔', 'SIN CARS', 'SPIRRA', 'Spofec', '上海', 'STI', 'Spyros Panopoulos', '哈弗', '红旗', '昊铂', '合创汽车', '海马', '汉腾汽车', '华晨新日', '华泰', '华泰新能源', '恒驰', '华颂', '黄海', '海格', '汉龙汽车', '恒天', '华凯', '华骐', '红星汽车', '悍马', '哈飞', '华普', 'Hennessey', '霍顿', '华梓汽车', '华夏领舰', 'Hopium', '活越', '恒信致远', 'Hispano Suiza', '华利', 'Hudson', 'HOFELE', 'Hyperion', '宏远汽车', '恒润汽车', '华人运通', '路虎', '雷克萨斯', '林肯', '理想汽车', '领克', '零跑汽车', '雷诺', '劳斯莱斯', '兰博基尼', '岚图', '雷达汽车', '铃木', '猎豹汽车', '路特斯', '乐道', '灵悉', '陆风', '理念', '雷丁', '蓝电', 'Lorinser', '罗夫哈特', '领途汽车', '陆地方舟', '龙程汽车', '莱茵汽车', 'Lightyear', '菱势汽车', '罗孚', '凌宝汽车', '蓝旗亚', '力帆汽车', 'LUMMA', 'LEVC', '拉达', '莲花汽车', 'LeSEE', '绿驰', '雷诺三星', '拉共达', 'LOCAL MOTORS', '领志', '朗世', 'Lucid', 'Lordstown Motors', 'LIMGENE凌际', 'LIUX', '英菲尼迪', '一汽', '仰望', '烨', '野马汽车', '云度', '依维柯', '驭胜', '宇通客车', '远程汽车', '御捷', '英致汽车', '永源', '裕路', '云雀汽车', '雅升汽车', '银隆新能源', '远航汽车', '一汽凌河', '英飒', 'YAMAHA', '游侠', '易电易行', '悠跑科技', '悠宝利', '颐驰', '怡亚通', '越界', '大众', '东风风行', '东风风神', '道奇', 'DS', '东南', '东风风光', '东风奕派', '东风小康', '大乘汽车', '电咖', '东风', '东风风度', '东风纳米', '东风·瑞泰特', '东风富康', '大运', '电动屋', '大发', 'Dacia', 'Datsun', 'De Tomaso', 'Donkervoort', 'Dianchè', 'DeLorean', 'Drako', 'DAVID BROWN', 'DEUS Automobiles', '东风氢舟', 'Delage', '大力牛魔王', '戴姆勒', 'dÄHLer', '日产', '荣威', '睿蓝汽车', '瑞驰', '容大智造', '如虎', '瑞麒', 'Rezvani', 'Rimac', 'Rinspeed', 'RIVIAN', 'RENOVO', 'Radical', 'Radford', 'REVO ZERO', '瑞腾汽车', '哪吒汽车', '纳智捷', 'NEVS国能汽车', 'Noble', 'nanoFLOWCELL', 'Neuron EV', 'Nikola', 'NamX', 'Novitec', 'NEXT LEVEL', '朋克汽车', '帕加尼', '佩奇奥', 'Puritalia', 'Piëch', 'Pogea Racing', '庞蒂亚克', 'Posaidon', 'Praga', '欧拉', '讴歌', '欧朗', '欧宝', '欧联', 'OBBIN', 'Ultima', 'Uniti', '长安', '长安启源', '长安欧尚', '长城', '长安凯程', '长安跨越', '创维汽车', '成功汽车', '橙仕', '车驰汽车', 'Cupra', '刺猬汽车', '昶洧', '长江·EV', '曹操汽车', 'Corbellati', 'Conquest', 'Caterham', 'Canoo', 'Czinger', 'Continental', '奇瑞', '奇瑞新能源', '起亚', '启辰', '前途', '全球鹰', '乔治·巴顿', '骐铃汽车', '清源汽车', '奇鲁汽车'] # , "欧萌达", "瑞虎5X"
main()