当前位置: 首页 > news >正文

python实战案例——采集二手车数据并分析其价值

前言

嗨喽,大家好呀~这里是爱看美女的茜茜呐

又到了学Python时刻~


环境使用:

  • Python 3.8

  • Pycharm

    • 专业版是付费的 <激活码可以免费用>

    • 社区版是免费的


模块使用:

第三方模块 需要安装的

  • requests >>> pip install requests

  • parsel >>> pip install parsel

  • csv


安装python第三方模块:

  1. win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests) 回车

  2. 在pycharm中点击Terminal(终端) 输入安装命令


爬虫基本流程:

一. 数据来源分析

  1. 明确需求:

    • 明确采集网站是什么?

    • 明确采集数据是什么?

      车辆基本信息

  2. 分析 车辆基本信息数据, 具体是请求那个网址可以得到

    通过开发者工具, 进行抓包分析:

    • 打开开发者工具: F12 / 鼠标右键点击检查选择network

    • 刷新网页: 让本网页数据内容重新加载一遍 <方便分析数据出处>

    • 搜索数据来源: 复制你想要的内容, 进行搜索即可

      车辆信息数据

二. 代码实现步骤

  1. 发送请求, 模拟浏览器对于url地址发送请求

  2. 获取数据, 获取服务器返回响应数据

    开发者工具: response <网页源代码>

  3. 解析数据, 提取我们想要的数据内容

    • 车辆信息
  4. 保存数据, 把车辆信息保存csv表格里面


代码展示

PS:本篇完整源码如有需要的小伙伴可以加下方的群去找管理员免费领取

采集数据

导入模块

# 导入数据请求模块 --> 第三方模块 需要安装 pip install requests
import requests
# 导入数据解析模块 --> 第三方模块 需要安装 pip install parsel
import parsel
# 导入csv模块 --> 内置模块 不需要安装
import csv

创建文件

f = open('data.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=[
    '标题',
    '年份',
    '里程',
    '城市',
    '价格',
    '标签',
    '是否保修',
    '详情页',
])

写入表头

csv_writer.writeheader()

“”"

  1. 发送请求, 模拟浏览器对于url地址发送请求
    • 安装模块: win + R 输入cmd
      输入安装命令: pip install requests

    • 导入模块是灰色, 不是报错, 而是导入模块没有使用

    • 伪装模拟 headers 请求头

      1. 字典数据类型, 要构建完整键值对 <引号位置一定要加对>
      2. 可以直接复制
    • <Response [200]> 响应对象
      200 状态码 表示请求成功

    • 批量替换

      1. 选择替换内容
      2. ctrl + R 输入正则命令即可
        :.*
        ,

“”"

for page in range(1, 51):
    print(f'======================正在采集第{page}页的数据内容======================')

确定请求链接

    # 伪装模拟
    headers = {
        # User-Agent 用户代理 表示浏览器基本身份信息
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
    }
    # 发送请求
    response = requests.get(url=url, headers=headers)
    print(response)

“”"

  1. 获取数据, 获取服务器返回响应数据
    开发者工具: response <网页源代码>
    response.text 获取响应文本数据 <网页源代码>
    html字符串数据 --> re正则

  2. 解析数据, 提取我们想要的数据内容
    - 车辆信息

    css选择器: 根据标签属性提取内容
    选择器对象

“”"

    # 把获取下来 response.text 转成 可解析对象
    selector = parsel.Selector(response.text)
    # 第一次提取, 获取所有li标签 ---> 获取所有车辆信息所在标签
    lis = selector.css('.Content_left .gongge_ul li')
    # for循环遍历, 把列表里面元素一个一个提取出来
    for li in lis:
        """
        提取每一个车辆信息具体的数据内容
        .title --> 定位class类名为title的标签
        attr(title) --> 提取标签里面title属性
        get() --> 提取第一个标签数据, 获取一个, 返回字符串
        getall() --> 提取所有的标签数据, 获取多个, 返回列表
        strip() --> 去除字符串左右两端空格
        replace() --> 字符串替换方法 
        """
        title = li.css('.title::attr(title)').get()  # 标题
        car_info = li.css('.gongge_main p i::text').getall()  # 基本信息
        year = car_info[0].replace('年', '')  # 年份
        mileage = car_info[1].replace('万公里', '')  # 里程
        city = car_info[2].strip()  # 城市
        label = li.css('.car_tag em::text').get().strip()  # 标签
        tag = li.css('.tc_label::text').get()  # 保修
        price = li.css('.Total::text').get()  # 价格
        href = li.css('.title::attr(href)').get()  # 详情页
        # 解析出来的数据保存字典里面
        dit = {
            '标题': title,
            '年份': year,
            '里程': mileage,
            '城市': city,
            '价格': price,
            '标签': label,
            '是否保修': tag,
            '详情页': href,
        }
        # 写入数据
        csv_writer.writerow(dit)
        print(title, year, mileage, city, price, label, tag, href)

数据分析


from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker

c = (
    Pie()
    .add("", [list(z) for z in zip(year_type, year_num)])
    .set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])
    .set_global_opts(title_opts=opts.TitleOpts(title="年份分布"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
#     .render("pie_set_color.html")
)
c.render_notebook()

df_title = df.apply(lambda x:x['标题'].split(' ')[0], axis=1)
title_list = df_title.value_counts().index.tolist()[:10]
title_num = df_title.value_counts().tolist()[:10]
from pyecharts import options as opts
from pyecharts.charts import Bar

c = (
    Bar()
    .add_xaxis(title_list)
    .add_yaxis("汽车品牌", title_num)
    .set_global_opts(
        xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
        title_opts=opts.TitleOpts(title="汽车品牌数量前十"),
    )

)
c.render_notebook()


from pyecharts import options as opts
from pyecharts.charts import Liquid

c = (
    Liquid()
    .add("lq", [1-per])
    .set_global_opts(title_opts=opts.TitleOpts(title="保修占比"))
    
)
c.render_notebook()

lable_num = df['标签'].value_counts().tolist()
lable_type = df['标签'].value_counts().index.tolist()
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker

c = (
    Pie()
    .add("", [list(z) for z in zip(lable_type, lable_num)])
    .set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])
    .set_global_opts(title_opts=opts.TitleOpts(title="标签分布"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
#     .render("pie_set_color.html")
)
c.render_notebook()

city_num = df['城市'].value_counts().tolist()[:10]
city_type = df['城市'].value_counts().index.tolist()[:10]
from pyecharts import options as opts
from pyecharts.charts import Pie
from pyecharts.faker import Faker

c = (
    Pie()
    .add("", [list(z) for z in zip(city_type, city_num)])
    .set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])
    .set_global_opts(title_opts=opts.TitleOpts(title="城市前十"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
#     .render("pie_set_color.html")
)
c.render_notebook()

from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.faker import Faker

c = (
    Bar()
    .add_xaxis(city_type)
    .add_yaxis("城市", city_num, color=Faker.rand_color())
    .set_global_opts(
        title_opts=opts.TitleOpts(title="城市分布"),
        datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")],
    )
   
)
c.render_notebook()
# print(Faker.days_attrs)
# print(Faker.days_values)
# print(Faker.rand_color())


import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker

c = (
    Line()
    .add_xaxis(price_list)
    .add_yaxis("价格", price_num)
    .set_global_opts(title_opts=opts.TitleOpts(title="车辆价格"))

)
c.render_notebook()



尾语

感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,博主要一下你们的三连呀(点赞、评论、收藏),不要钱的还是可以搞一搞的嘛~

不知道评论啥的,即使扣个6666也是对博主的鼓舞吖 💞 感谢 💐

相关文章:

  • Java EE 程序修改题【太原理工大学】
  • Promise:工作流程、常见API、使用方法、手撕Promise、async/await
  • Vue3 中选项式下的侦听器
  • 有向图的拓扑序列
  • 防御 CSS 黑客——介绍“安全的 CSS hacks”
  • 通信原理与MATLAB(九):DPSK的调制解调
  • Docker安装配置运行Redis
  • 2022 年上海市大学生程序设计竞赛 M. My University Is Better Than Yours
  • 数据结构(陈越、何钦铭)学习笔记
  • pytorch集锦(2)-处理数据DataLoader和Dataset(2)
  • Ant Design入门
  • 网络请求回调的实现方式
  • STM32 使用IQmath实现SVPWM 正弦波无刷电机控制
  • Openstack的安装部署教程
  • 密码学_AES加密算法
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • HTTP 简介
  • IDEA常用插件整理
  • PAT A1050
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • WebSocket使用
  • 机器学习学习笔记一
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (二)hibernate配置管理
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (十一)图像的罗伯特梯度锐化
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)scrum常见工具列表
  • ******之网络***——物理***
  • .net 8 发布了,试下微软最近强推的MAUI
  • .Net FrameWork总结
  • .Net Memory Profiler的使用举例
  • .NET 药厂业务系统 CPU爆高分析
  • .Net(C#)常用转换byte转uint32、byte转float等
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [.NET 即时通信SignalR] 认识SignalR (一)
  • [Android Pro] AndroidX重构和映射
  • [Android] Binder 里的 Service 和 Interface 分别是什么
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [C#]科学计数法(scientific notation)显示为正常数字
  • [C++] Windows中字符串函数的种类
  • [Cesium学习]
  • [cocos2d-x]关于CC_CALLBACK
  • [FUNC]判断窗口在哪一个屏幕上
  • [HDU 3555] Bomb [数位DP]
  • [IE技巧] 如何关闭Windows Server版IE的安全限制
  • [LeetCode] 2.两数相加
  • [leetcode]longest-common-prefix 最长公共前缀