利用Python爬取汽车之家指定数据
(一)目标网址:https://k.autohome.com.cn/suva1/#pvareaid=2099126
(二)获取目标网址下所有车辆的信息(车名、价格、特点、评分)
(一)打开网址,按下F12打开开发者工具,使用资源定位符定位一辆车的信息,然后点击href链接进入车辆二级目录网址;发现二级目录下有我们需要的所有信息
(二)在一级目录下,开发者工具中选中network>刷新页面>第一个包>在response响应框中搜索想要的内容>发现可以找到数据,说明抓包抓对了,同理在二级目录下也可以找到对应的数据;
(三)切换到Headers标签,查看包的url和请求方式等参数
(四)对抓到的包的url发起请求获取响应
response = requests.get(url=url, headers=self.headers).text
(五)数据清洗获取二级目录网址和车名;
(六)再对二级目录网址进行请求,清洗数据,获取需要的字段;
(七)将每辆车所有需要的字段封装起来,添加到一个列表中;
(八)将所有的车辆数据写入excel表格中,完成数据爬取。
(一)Python与excel的连接
这里我使用的是xlwt包,导包代码cmd>pip install xlwt
(二)首先创建一个excel对象和sheet表单
# 定义一个excel表格
self.book = xlwt.Workbook(encoding='utf-8')
# 定义一个excel表格的sheet表单 '紧凑型SUV'为表单名,'cell_overwrite_ok=True'为覆盖原表格数据
self.sheet = self.book.add_sheet('紧凑型SUV', cell_overwrite_ok=True)
(三)在excel中写入数据
# 定义一个元组,用于写入excel的表头
col = ('序号', '车名', '价格', '特点', '评分')
# 写入表头
for i in range(5):
self.sheet.write(0, i, col[i])
# 定义一个变量,用于写入excel是换行
cout = 1
# 遍历所有的车辆数据,每一个data就是一辆车的数据
for data in self.datas:
# excel写入序号
self.sheet.write(cout, 0, cout)
# excel写入车名
self.sheet.write(cout, 1, data['name'])
# excel写入价格
self.sheet.write(cout, 2, data['car_price'])
# excel写入特点
self.sheet.write(cout, 3, data['car_tags'])
# excel写入评分
self.sheet.write(cout, 4, data['car_star'])
# 换行
cout += 1
# 保存excel
self.book.save('汽车之家.xls')
# 需要的包
import requests # 网页请求
from lxml import etree # 源代码解析
import xlwt # 导入excel表格
# 汽车之家类
class QiCheZhiJia(object):
def __init__(self):
# UA请求头
self.headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
# 定义一个空列表用于存储数据
self.datas = []
# 定义一个excel表格
self.book = xlwt.Workbook(encoding='utf-8')
# 定义一个excel表格的sheet表单 '紧凑型SUV'为表单名,'cell_overwrite_ok=True'为覆盖原表格数据
self.sheet = self.book.add_sheet('紧凑型SUV', cell_overwrite_ok=True)
# 获取网页响应数据
def get_page_info(self):
# 抓包抓到需要的url
url = 'https://k.autohome.com.cn/suva1/'
# 发起请求,获取响应
response = requests.get(url=url, headers=self.headers).text
# 调用get_href方法
self.get_href(response)
# 获取汽车网页链接
def get_href(self, response):
# 实例化一个网页的etree对象,及用lxml来解析html
tree = etree.HTML(response)
# 每辆汽车的li标签,
li_list = tree.xpath('/html/body/div[2]/div[2]/div/div/div[2]/dl/dd/ul/li')
# 遍历每辆汽车的li标签
for li in li_list:
# 获取每辆汽车链接,这里需要拼接一下
href = 'https://k.autohome.com.cn/series' + li.xpath('./div[1]/a/@href')[0]
# 获取每辆汽车车名
car_name = li.xpath('./div[2]/a/text()')[0]
# 调用get_data方法
self.get_data(href, car_name)
# 所有车辆信息获取完成后调用save_data方法将数据存储到excel表格
self.save_data()
# 获取每辆汽车的价格、特点、评分信息
def get_data(self, href, car_name):
# 提示信息
print(f'正在获取<{car_name}>的数据。。。')
# 对每辆汽车url发起请求,获取响应
response = requests.get(url=href, headers=self.headers).text
# lxml解析响应数据
tree = etree.HTML(response)
# 获取汽车价格
car_price = tree.xpath('//*[@id="__next"]/div[2]/div[1]/div[1]/ul[1]/li[2]/div[1]/div/text()')[0]
# 获取汽车特点
car_tag_li_list = tree.xpath('//*[@id="__next"]/div[2]/div[1]/div[1]/ul[2]/li')
# 这里特点有多个,定义一个空列表用于暂存汽车特点
car_tags = []
# 遍历汽车特点,由于网页只显示了前面六个,这里就只取前六个特点,如果需要的话可以全部取
for tag in car_tag_li_list[0:6]:
# 获取每一个汽车特点
car_tag = tag.xpath('./div/text()')[0]
# 添加到car_tags列表中
car_tags.append(car_tag)
# 获取完每辆车的特点后,由于是一个列表类型,下面将他转化为字符串类型,方便写入excel
car_tags = ','.join(car_tags)
# 获取汽车评分
car_star = tree.xpath('//*[@id="__next"]/div[2]/div[1]/div[1]/ul[1]/li[1]/div/div/em/text()')[0]
# 数据封装,方便传递
item = {
'name': car_name,
'car_price': car_price,
'car_tags': car_tags,
'car_star': car_star
}
# 将封装好的数据添加到self.datas中
self.datas.append(item)
# 保存数据的方法
def save_data(self):
# 定义一个元组,用于写入excel的表头
col = ('序号', '车名', '价格', '特点', '评分')
# 写入表头
for i in range(5):
self.sheet.write(0, i, col[i])
# 定义一个变量,用于写入excel是换行
cout = 1
# 遍历所有的车辆数据,每一个data就是一辆车的数据
for data in self.datas:
# excel写入序号
self.sheet.write(cout, 0, cout)
# excel写入车名
self.sheet.write(cout, 1, data['name'])
# excel写入价格
self.sheet.write(cout, 2, data['car_price'])
# excel写入特点
self.sheet.write(cout, 3, data['car_tags'])
# excel写入评分
self.sheet.write(cout, 4, data['car_star'])
# 换行
cout += 1
# 保存excel
self.book.save('汽车之家.xls')
# 提示爬取完成
print('over.....')
# 实例化类对象,开始执行
qichezhijia = QiCheZhiJia()
qichezhijia.get_page_info()
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!