Python爬取‘某车之家’车型数据:成果(requestsBeautifulSoup,含代码)及问题(Scrapy)

本文主要是介绍Python爬取‘某车之家’车型数据:成果(requestsBeautifulSoup,含代码)及问题(Scrapy),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、背景
1、目的: 爬取【某车之家】全部车型数据,用于车贷业务系统的车型选项。
2、结果:
(1)数据内容:共43401条数据,包括【某车之家】全部在售(即将销售)及停售车型;

在这里插入图片描述
(2)数据结构
在这里插入图片描述

二、说明
1、通过requests&BeautifulSoup爬取成功,但耗时较长(约3.5小时),且中途有断掉
2、Scrapy框架爬取不成功,待解决;【请大神们帮助解决】

三、成果(含代码)
1、网页结构
在这里插入图片描述
2、爬取思路
在这里插入图片描述

3、代码【贡献已有成果】
备注:代码中的url有关键字用XXX代替

import requests
from bs4 import BeautifulSoup
import json
import re
import openpyxlclass Cars():#【初始函数:获取目录树】:目录树包含了【品牌-厂商-车系-车型】的多层结构def __init__(self):self.headers={'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'}url_tree='https://car.XXX.com.cn/javascript/NewSpecCompare.js?20131010'rs_tree=requests.get(url_tree,headers=self.headers)rs_tree.encoding='gbk'content=rs_tree.textself.menu=content.replace('var listCompare$100= ', '').replace(';', '')       self.JS=json.loads(self.menu)print(self.menu)#运行结果:(非完整)#[{"I":279,"N":"领克","L":"L","List":[{"I":463,"N":"领克","List":[{"I":4221,"N":"领克01"},{"I":4840,"N":"领克01新能源"},{"I":4616,"N":"领克02"},{"I":5014,"N":"领克02新能源"},{"I":4402,"N":"领克03"},{"I":5113,"N":"领克03新能源"},{"I":5194,"N":"领克05"},{"I":5555,"N":"领克06"},{"I":5557,"N":"领克06新能源"}]}]}]#【主函数:遍历目录树】def Main(self):for i in self.JS:self.bid=i['I']self.Brand=i['N']self.Brand_id='b'+str(self.bid)for a in i['List']:self.aid=a['I']self.Auto=a['N']self.Auto_id='fct_'+str(self.aid)for b in a['List']:self.sid=b['I']self.Series=b['N']self.Series_id='series_'+str(self.sid)self.tid='1'self.cid='110100' self.SSeries() #车系函数self.Price() #车型函数-价格self.Model_sale() #车型函数-在售self.Model_pre_sale() #车型函数-即将销售self.Model_halt() #车型函数-停售self.Result() #结果函数-合并及存储#【车系函数:提取品牌、厂商、车系】def SSeries(self):       self.brand_list=[]self.brand_list.append(str(self.Brand_id))self.brand_list.append(self.Brand)self.brand_list.append(str(self.Auto_id))self.brand_list.append(self.Auto)self.brand_list.append(str(self.Series_id))self.brand_list.append(self.Series)print('【品牌厂商车系】-------------------------------------------------------------------')print(self.brand_list)#运行结果:['b279', '领克', 'fct_463', '领克', 'series_4221', '领克01']#【车型函数C:单独提取在售车型销售价】                def Price(self):real_url_4='https://carif.api.XXX.com.cn/dealer/LoadDealerPrice.ashx?'params4={'_callback': 'LoadDealerPrice','type': self.tid,'seriesid': str(self.sid),'city': self.cid }rs4=requests.get(real_url_4,headers=self.headers,params=params4)rs4.encoding='gbk'js=json.loads(re.match(".*?({.*}).*",rs4.text,re.S).group(1))self.price_dic={}prices=js['body']['item']for price in prices:K=str(price['SpecId'])V=round(price['Price']/10000,2)Value_price=str(V)+'万元'self.price_dic[K]=Value_priceprint('【销售价】----------')print(self.price_dic)#运行结果:(非完整)#{'38980': '16.88万元', '38982': '19.18万元', '38977': '14.98万元', '38981': '17.28万元', '43004': '17.58万元', '46007': '15.18万元', '48423': '19.98万元', '48975': '17.98万元', '38978': '15.88万元', '48424': '20.18万元', '48976': '18.38万元', '38976': '14.38万元'}#【车型函数A:提取在售车型信息】def Model_sale(self):real_url_2='https://car.XXX.com.cn/price/series-'+str(self.sid)+'.html'rs2=requests.get(real_url_2,headers=self.headers)print('///在售码///'+str(rs2.status_code))rs2.encoding='gbk'bs2=BeautifulSoup(rs2.text,'html.parser')S=bs2.find('div',class_='tab-nav border-t-no').find_all('li')[0]['class']if S[0] != 'disabled':self.car_list_2=[]sale_status='在售'A=bs2.find('div',id='divSeries') lines=A.find_all('li') #车型列表for line in lines:list_temp=[]Model_id=line.find('div',class_='interval01-list-cars').find('p')['id'] #车型编号list_temp.append(Model_id)Model=line.find('div',class_='interval01-list-cars').find('p').find('a').text #车型list_temp.append(Model)Configuration=line.find('div',class_='interval01-list-cars').find_all('p')[2].text #配置list_temp.append(Configuration)Guid_price=line.find('div',class_='interval01-list-guidance').find('div').text #指导价list_temp.append(Guid_price)if self.price_dic: key_li=[]for key in self.price_dic:key_li.append(key)if Model_id[1:] in key_li:for keyy in self.price_dic:if keyy==Model_id[1:]:Sale_price=self.price_dic[keyy]else:continueelse:Sale_price='暂无报价'else:Sale_price='暂无报价'list_temp.append(Sale_price)list_temp.append(sale_status)self.car_list_2.append(list_temp)print('【在售车型】---------------------------------------------------------------')print(self.car_list_2)else:self.car_list_2=[]print('【在售车型】--------------------------------------------------------------')print(self.car_list_2)#运行结果:(非完整)#[['p48975', '2021款 2.0TD 两驱型Pro', '前置前驱8挡手自一体', ' 17.98万', '17.98万元', '在售'], ['p48976', '2021款 2.0TD 两驱耀Pro', '前置前驱8挡手自一体', ' 18.38万', '18.38万元', '在售'], ['p48423', '2021款 2.0TD 四驱劲Halo', '前置四驱8挡手自一体', ' 19.98万', '19.98万元', '在售']]#【车型函数D:提取即将销售车型信息】def Model_pre_sale(self):real_url_5='https://car.XXX.com.cn/price/series-'+str(self.sid)+'-0-2-0-0-0-0-1.html'rs5=requests.get(real_url_5,headers=self.headers)print('///即将销售码'+str(rs5.status_code))rs5.encoding='gbk'bs5=BeautifulSoup(rs5.text,'html.parser')self.car_list_5=[]Pre_sale_status='即将销售'A=bs5.find('div',id='divSeries') lines=A.find_all('li') #车型列表for line in lines:list_temp=[]Model_id=line.find('div',class_='interval01-list-cars').find('p')['id'] #车型编号list_temp.append(Model_id)Model=line.find('div',class_='interval01-list-cars').find('p').find('a').text #车型list_temp.append(Model)Configuration=line.find('div',class_='interval01-list-cars').find_all('p')[2].text #配置list_temp.append(Configuration)Guid_price=line.find('div',class_='interval01-list-guidance').find('div').text #指导价list_temp.append(Guid_price)if self.price_dic:key_li=[]for key in self.price_dic:key_li.append(key)if Model_id[1:] in key_li:for keyy in self.price_dic:if keyy==Model_id[1:]:Pre_sale_price=self.price_dic[keyy]else:continueelse:Pre_sale_price='暂无报价'else:Pre_sale_price='暂无报价'list_temp.append(Pre_sale_price)list_temp.append(Pre_sale_status)self.car_list_5.append(list_temp)print('【即将销售车型】--------------------------------------------------------------------')print(self.car_list_5)#运行结果:与Model_sale结构相同   #【车型函数B:提取停售车型信息】def Model_halt(self):self.car_list_3=[]real_url_3='https://car.XXX.com.cn/price/series-'+str(self.sid)+'-0-3-0-0-0-0-1.html'rs3=requests.get(real_url_3,headers=self.headers)print('///停售码'+str(rs3.status_code))rs3.encoding='gbk'bs3=BeautifulSoup(rs3.text,'html.parser')J=bs3.find('div',class_='price-page02')if J is None:L=2else:L=17for z in range(1,L):real_url_3_2='https://car.XXX.com.cn/price/series-'+str(self.sid)+'-0-3-0-0-0-0-'+str(z)+'.html'rs3_2=requests.get(real_url_3_2,headers=self.headers)rs3_2.encoding='gbk'bs3_2=BeautifulSoup(rs3_2.text,'html.parser')sale_status='停售'A=bs3_2.find('div',id='divSeries')lines=A.find_all('li') #车型列表for line in lines:list_temp=[]Model_id=line.find('div',class_='interval01-list-cars').find('p')['id'] #车型编号list_temp.append(Model_id)Model=line.find('div',class_='interval01-list-cars').find('p').find('a').text #车型list_temp.append(Model)Configuration=line.find('div',class_='interval01-list-cars').find_all('p')[2].text #配置list_temp.append(Configuration)Guid_price=line.find('div',class_='interval01-list-guidance').find('div').text #指导价list_temp.append(Guid_price)Sale_price='待链接'list_temp.append(Sale_price)list_temp.append(sale_status)self.car_list_3.append(list_temp)print('【停售车型】------------------------------------------------------------------')print(self.car_list_3)#运行结果:(非完整)#[['p38840', '2019款 2.0T 两驱纯Lite版 国V', '前置前驱6挡手自一体', ' 15.08万 ', '待链接', '停售'], ['p38841', '2019款 2.0T 两驱纯版 国V', '前置前驱6挡手自一体', ' 15.68万 ', '待链接', '停售'], ['p38842', '2019款 2.0T 两驱型版 国V', '前置前驱6挡手自一体', ' 16.58万 ', '待链接', '停售'], ['p38843', '2019款 2.0T 两驱型Pro版 国V', '前置前驱6挡手自一体', ' 17.58万 ', '待链接', '停售']]#【结果函数:数据整理】    def Result(self):car_list=self.car_list_2+self.car_list_5+self.car_list_3lists=[]for m in car_list:n=self.brand_list+mlists.append(n)print('【车系列表——存储】')print(lists) web=openpyxl.load_workbook(r'D:\Python\Test_file\cars3.xlsx')sheetnames=web.get_sheet_names()sheet=web.get_sheet_by_name(sheetnames[0])sheet=web.activenrows=sheet.max_rowfor i in range(1, len(lists)+1):for j in range(1, len(lists[i-1])+1):sheet.cell(nrows+i, j).value=lists[i-1][j-1]web.save(r'D:\Python\Test_file\cars3.xlsx')#运行结果:(非完整)#[['b279', '领克', 'fct_463', '领克', 'series_5113', '领克03新能源', 'p47091', '2021款 1.5T PHEV', '电动前置前驱7挡双离合', ' 17.67万', '17.67万元', '在售'], ['b279', '领克', 'fct_463', '领克', 'series_5113', '领克03新能源', 'p47092', '2021款 1.5T PHEV Pro', '电动前置前驱7挡双离合', ' 19.67万', '19.67万元', '在售'], ['b279', '领克', 'fct_463', '领克', 'series_5113', '领克03新能源', 'p46416', '2020款 1.5T PHEV Lite', '电动前置前驱7挡双离合', ' 16.87万 ', '待链接', '停售']]DO=Cars()
DO.Main()      

四、问题
问题(一):由于存在以下两种情况,不知道如何设置Scrapy下从[start urls]开始的队列:
(1)、类下的函数存在业务逻辑上的【包含关系】:即“品牌–对应–多个厂商–再对应–多个车系–再对应–多个车型–再对应–多个销售状态‘’。(Scrapy的多url队列为平行执行,如果将车系函数def SSeries(self)、车型函数def Model_sale(self)/def Model_pre_sale(self)/def Model_halt(self)设置为url队列则会失去业务上需要的逻辑对应关系)
在这里插入图片描述

(2) 车型函数(def Model_sale(self) & def Model_pre_sale)需引用价格函数(def Price(self))的输出结果。
在这里插入图片描述
问题(二):爬取的结果数据为列表格式:[[‘b279’, ‘领克’, ‘fct_463’, ‘领克’, ‘series_5113’, ‘领克03新能源’, ‘p47091’, ‘2021款 1.5T PHEV’, ‘电动前置前驱7挡双离合’, ’ 17.67万’, ‘17.67万元’, ‘在售’], [‘b279’, ‘领克’, ‘fct_463’, ‘领克’, ‘series_5113’, ‘领克03新能源’, ‘p47092’, ‘2021款 1.5T PHEV Pro’, ‘电动前置前驱7挡双离合’, ’ 19.67万’, ‘19.67万元’, ‘在售’]],如何通过item传输到pipline中?

请大神们不吝赐教啊!!!

这篇关于Python爬取‘某车之家’车型数据:成果(requestsBeautifulSoup,含代码)及问题(Scrapy)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/162196

相关文章

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

Python中提取文件名扩展名的多种方法实现

《Python中提取文件名扩展名的多种方法实现》在Python编程中,经常会遇到需要从文件名中提取扩展名的场景,Python提供了多种方法来实现这一功能,不同方法适用于不同的场景和需求,包括os.pa... 目录技术背景实现步骤方法一:使用os.path.splitext方法二:使用pathlib模块方法三

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解