page contents

利用Python爬取汽车之家指定数据

汽车之家 python

利用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表格中,完成数据爬取。

 

 

三、Pythonexcel的连接

(一)Pythonexcel的连接

这里我使用的是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')

 

四、Python代码实现及注释

# 需要的包

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()

  • 发表于 2022-08-03 09:09
  • 阅读 ( 1313 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
钟孝武
钟孝武

3 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1470 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章