新能源汽车可视化大屏数据展示系列之三爬虫并存储

举报
tea_year 发表于 2024/12/19 18:18:14 2024/12/19
【摘要】 任务:         打印数据操作实践:一、爬虫项目搭建搭建1.1在carShow项目下创建spiderMain的目录1.2在目录spiderMan下创建spider.py文件,先创建目录结构import requestsfrom lxml import etreeimport csvimport osimport timeimport jsonimport reimport django...

任务:

         打印数据

操作实践:

一、爬虫项目搭建搭建

1.1在carShow项目下创建spiderMain的目录
1.2在目录spiderMan下创建spider.py文件,先创建目录结构
import requests
from lxml import etree
import csv
import os
import time
import json
import re
import django
import pandas as pd

#代码编写
class spider(object):
    def __init__(self):
        pass
    def init(self):
        pass
    def main(self):
        pass

#调用
if __name__ == '__main__':
    spiderObj = spider()   

二、数据分析

需要数据网址,对网址进行分析,右键“检查”之后,点击“Network",最终出现rank_data?id=xxx为准:

点击Headers,里面的Request URL:就是目标的网址

#链接如下:注意count是每页条数10条;offset是起始位置:0
https://www.dongchedi.com/motor/pc/car/rank_data?aid=1839&app_name=auto_web_pc&city_name=%E9%83%91%E5%B7%9E&
count=10&offset=0&month=&new_energy_type=&rank_data_type=11&brand_id=&
price=&manufacturer=%E8%87%AA%E4%B8%BB&series_type=&nation=0

三、本地csv文件的创建

在spider.py文件下,完善init()函数和调用之

def init(self):
    if not os.path.exists('./temp.csv'):
        with open('./temp.csv', 'a', newline='', encoding='utf-8') as wf:
            write = csv.writer(wf)
            write.writerow(["brand", "carName", "carImg", "saleVolume", "price", "manufacturer", "rank", "carModel",
                            "energyType", "marketTime", "insure"])
#调用
if __name__ == '__main__':
    spiderObj = spider()
    spiderObj.init()

在spiderMan下执行spider.py,生成temp.csv文件,并查看其文件结构和内容。

如果格式和上面不符合,可以设置Transpose(转置),有三种模式:Table(表格)、Tree(树形)、Text(文本),设置为Table格式即可。

四、数据获取

4.1通过完善下面代码,可以获取汽车列表的信息

class spider(object):
    def __init__(self):
        self.spiderUrl=('https://www.dongchedi.com/motor/pc/car/rank_data?aid=1839&app_name=auto_web_pc&city_name=%E9%83%91%E5%B7%9E&count=10&offset=10&month=
&new_energy_type=&rank_data_type=11&brand_id=&price=&manufacturer=&series_type=&nation=0')
        self.headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36'}
    #代码未更改
    def init(self):
        if not os.path.exists('./temp.csv'):
            with open('./temp.csv', 'a', newline='', encoding='utf-8') as wf:
                write = csv.writer(wf)
                write.writerow(["brand", "carName", "carImg", "saleVolume", "price", "manufacturer", "rank", "carModel",
                                "energyType", "marketTime", "insure"])
    def main(self):
        pageJson=requests.get(self.spiderUrl, headers=self.headers).json()
        pageJson=pageJson["data"]["list"]
        print(pageJson)

#调用
if __name__ == '__main__':
    spiderObj = spider()
    # spiderObj.init()
    spiderObj.main()

4.2 读取单个汽车信息

在主类里面增加两个函数,代码如下

#定义两个函数,设置页和读取页
def set_page(self,newPage):
    with open('./spiderPage.txt','a',encoding='utf-8') as a_f:
        a_f.write('\n'+str(newPage))
def get_page(self):
    with open('./spiderPage.txt','r',encoding='utf-8') as r_f:
        return r_f.readlines()[-1].strip()

def main(self):
    #定义变量count
    count=self.get_page()
    params={'offset':int(count)}
    print("数据从{}开始爬取".format(int(count)+1))

    #pageJson=requests.get(self.spiderUrl, headers=self.headers).json()
    pageJson=requests.get(self.spiderUrl, headers=self.headers,params=params).json()
    pageJson=pageJson["data"]["list"]
    print(pageJson)
    #测试设置数据值
    #self.set_page(int(count)+10)

在spiderMan下添加文件spiderPage.txt,且设置值为0

执行上述代码,会发现有第一条数据

#测试设置数据值,用于像spiderPage.txt添加数据值。0+10=10
self.set_page(int(count)+10)

增加一个对于循环遍历的测试:

#循环遍历
for index,car in enumerate(pageJson):
    print('正在爬取第%d'%(index+1)+'数据')
    print(car['brand_name'])
    break

    #测试设置数据值
#self.set_page(int(count)+10)

4.3 打印汽车数据信息

#循环遍历,代码演示中,只写了打印!其他没有写!
for index,car in enumerate(pageJson):   
    print('正在爬取第%d'%(index+1)+'数据')
    #品牌名 
    print(car['brand_name'])
   
    #车名  
    print(car['series_name'])
    
    #打印图片链接
    print(car['image'])
    
    #销量
    print(car['count'])
    #价格,需要拼接最低价格和最高价格;
    price=[]
    price.append(car['min_price'])
    price.append(car['max_price'])
    print(price)

    #厂商  
    print(car["sub_brand_name"])
    # 排名
    print(car['rank'])

最终,在控制台打印各个汽车信息如下图所示:



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。