二手车信息爬取教程

爬取某子网二手车信息(附源码)


一、简介

本文通过对某个二手车网站近2000条数据的爬取,本程序突破了字体加密等反爬虫技术的限制,成功获取了JSON格式的数据,并将关键字段如车名、价格、里程数等提取并保存到CSV文件中。随后,程序对里程数和价格列进行数据清洗,去除单位并转换为浮点数类型,为后续的数据分析做好准备。最终,利用Matplotlib库绘制了三种图表,分别为里程数分布散点图、价格分布散点图和里程数与价格之间的散点图,帮助读者直观地了解二手车信息的数据特征,以及里程数和价格之间的关联。

二、思路

  1. 通过观察网页得知,数据被存储在postList下

在这里插入图片描述

  1. 观察表头,获取正确的url地址

在这里插入图片描述

  1. 通过观察发现该网站采用了字体加密的反爬措施

在这里插入图片描述

  1. 解决字体加密反爬

观察每个数字对应的特殊字符

在这里插入图片描述

# 字体解密
font_data = {
    '': '0', '': '2', '': '9', '': '3', '': '4',
    '': '5', '': '1', '': '7', '': '8', '': '6',
}
# 替换源码中数字的密文
for i in font_data:
   if str(i) in content:
        content = content.replace(str(i), font_data[i].replace(';', ''))

三、主要功能点

  1. 数据采集:通过使用Python的爬虫技术,程序自动访问某个二手车网站,模拟浏览器行为,解析网页,成功获取了近2000条的二手车信息。通过破解网页中的字体加密,实现了反爬虫的目的。
import requests
import json
import jsonpath

import pandas as pd

pd.set_option('display.max_columns', None)  # 显示完整的列
pd.set_option('display.max_rows', None)  # 显示完整的行
pd.set_option('display.expand_frame_repr', False)

df = pd.DataFrame()
# 字体解密
font_data = {
    '': '0', '': '2', '': '9', '': '3', '': '4',
    '': '5', '': '1', '': '7', '': '8', '': '6',
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 '
                  'Safari/537.36 Edg/114.0.1823.82'
}

for i in range(1, 100):
    url = 'https://mapi.guazi.com/car-source/carList/pcList?versionId=0.0.0.0&sourceFrom=wap&deviceId=074087ea-e3ca-4c22' \
          '-b627-d88abcd9713a&osv=Windows+10&minor=&sourceType=&ec_buy_car_list_ab=&location_city=&district_id=&tag=-1' \
          '&license_date=&auto_type=&driving_type=&gearbox=&road_haul=&air_displacement=&emission=&car_color=&guobie' \
          '=&bright_spot_config=&seat=&fuel_type=&order=&priceRange=0,' \
          '-1&tag_types=10012&diff_city=&intention_options=&initialPriceRange=&monthlyPriceRange=&transfer_num=&car_year' \
          '=&carid_qigangshu=&carid_jinqixingshi=&cheliangjibie=&page=' + str(
        i) + '&pageSize=20&city_filter=12&city=12&guazi_city=12'

    response = requests.get(url=url, headers=headers)
    response.encoding = 'utf-8'
    content = response.text

    # 替换源码中数字的密文
    for i in font_data:
        if str(i) in content:
            content = content.replace(str(i), font_data[i].replace(';', ''))
    obj = json.loads(content)
    postList = jsonpath.jsonpath(obj, '$..postList.[title,puid,clue_id,license_date,road_haul,thumb_img,price]')
    try:
        dataList = [postList[i:i + 7] for i in range(0, len(postList), 7)]
    except TypeError:
        break
    # df = pd.DataFrame(dataList, columns=['车型', 'puid', 'clue_id', '年份', '公里数', '图片', '首付', '价格'])
    df = df._append(
        pd.DataFrame(dataList, columns=['车型', 'puid', 'clue_id', '上牌时间', '公里数(万)', '图片', '价格(万)']),
        ignore_index=False)

# 重置索引
df.index = range(0, df.shape[0])
df.to_csv('二手车.csv', index=False, header=True, encoding='utf-8')
  1. 数据清洗:爬取到的二手车信息以JSON格式存储。程序将从JSON中提取的车名、价格和里程数等字段存储到CSV文件中,方便后续的数据处理和分析。同时,针对里程数和价格列的数据进行清洗,去除无用单位字符(如“公里”、“万”等),并将文本转换为浮点数类型,确保数据的准确性。
import pandas as pd
df = pd.read_csv('D:\BigData\pythonProject\爬虫\\requests\二手车.csv')
# 对里程数进行处理
for i in range(0, len(df['公里数(万)'])):
    data = df['公里数(万)'][i]
    if len(data) == 5:
        df['公里数(万)'][i] = str(int(data[:-2])/10000) + '万公里'
    df['公里数(万)'][i] = float(df['公里数(万)'][i][:-3])
# 对价格进行处理
for i in range(0, len(df['价格(万)'])):
    df['价格(万)'][i] = float(df['价格(万)'][i][:-1])
  1. 数据分析:通过使用Python的数据分析库,程序对清洗后的数据进行统计和可视化。首先,绘制了里程数分布散点图,帮助读者直观了解二手车里程数的分布情况。接着,绘制了价格分布散点图,展示了二手车价格的分布情况。最后,绘制了里程数与价格之间的散点图,探究二手车里程数与价格之间的关联关系。
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'    #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    #用来显示负号

# 绘制里程数分布散点图
plt.scatter(df.index, df['公里数(万)'])
plt.xlabel('车辆编号')
plt.ylabel('公里数(万)')
plt.title('里程数分布散点图')
plt.show()

# 绘制历程数直方图
plt.hist(df['公里数(万)'], bins=20) # bins的数量可以改变直方图的分组
plt.xlabel('公里数(万)')
plt.ylabel('数量')
plt.title('里程数分布直方图')
plt.show()

# 绘制里程跟价格之间的散点图
plt.scatter(df['公里数(万)'], df['价格(万)'])
plt.xlabel('里程数(万公里)')
plt.ylabel('价格(万元)')
plt.title('里程数和价格散点图')
plt.show()

四、总结

该程序为二手车交易数据提供了全方位的数据采集、清洗和分析能力,为二手车市场的观察和研究提供了有力支持。读者可以通过该程序深入了解二手车市场的行情和特征,同时也可以借鉴和拓展该程序,实现更多数据采集与分析的功能。无论是对于二手车交易者还是研究者,这款二手车信息爬虫程序都是一个非常实用的工具。

五、源代码

import requests
import json
import jsonpath

import pandas as pd

pd.set_option('display.max_columns', None)  # 显示完整的列
pd.set_option('display.max_rows', None)  # 显示完整的行
pd.set_option('display.expand_frame_repr', False)

df = pd.DataFrame()
# 字体解密
font_data = {
    '': '0', '': '2', '': '9', '': '3', '': '4',
    '': '5', '': '1', '': '7', '': '8', '': '6',
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 '
                  'Safari/537.36 Edg/114.0.1823.82'
}

for i in range(1, 100):
    url = 'https://mapi.guazi.com/car-source/carList/pcList?versionId=0.0.0.0&sourceFrom=wap&deviceId=074087ea-e3ca-4c22' \
          '-b627-d88abcd9713a&osv=Windows+10&minor=&sourceType=&ec_buy_car_list_ab=&location_city=&district_id=&tag=-1' \
          '&license_date=&auto_type=&driving_type=&gearbox=&road_haul=&air_displacement=&emission=&car_color=&guobie' \
          '=&bright_spot_config=&seat=&fuel_type=&order=&priceRange=0,' \
          '-1&tag_types=10012&diff_city=&intention_options=&initialPriceRange=&monthlyPriceRange=&transfer_num=&car_year' \
          '=&carid_qigangshu=&carid_jinqixingshi=&cheliangjibie=&page=' + str(
        i) + '&pageSize=20&city_filter=12&city=12&guazi_city=12'

    response = requests.get(url=url, headers=headers)
    response.encoding = 'utf-8'
    content = response.text

    # 替换源码中数字的密文
    for i in font_data:
        if str(i) in content:
            content = content.replace(str(i), font_data[i].replace(';', ''))
    obj = json.loads(content)
    postList = jsonpath.jsonpath(obj, '$..postList.[title,puid,clue_id,license_date,road_haul,thumb_img,price]')
    try:
        dataList = [postList[i:i + 7] for i in range(0, len(postList), 7)]
    except TypeError:
        break
    # df = pd.DataFrame(dataList, columns=['车型', 'puid', 'clue_id', '年份', '公里数', '图片', '首付', '价格'])
    df = df._append(
        pd.DataFrame(dataList, columns=['车型', 'puid', 'clue_id', '上牌时间', '公里数(万)', '图片', '价格(万)']),
        ignore_index=False)

# 重置索引
df.index = range(0, df.shape[0])
df.to_csv('二手车.csv', index=False, header=True, encoding='utf-8')

import pandas as pd
df = pd.read_csv('D:\BigData\pythonProject\爬虫\\requests\二手车.csv')
# 对里程数进行处理
for i in range(0, len(df['公里数(万)'])):
    data = df['公里数(万)'][i]
    if len(data) == 5:
        df['公里数(万)'][i] = str(int(data[:-2])/10000) + '万公里'
    df['公里数(万)'][i] = float(df['公里数(万)'][i][:-3])
# 对价格进行处理
for i in range(0, len(df['价格(万)'])):
    df['价格(万)'][i] = float(df['价格(万)'][i][:-1])

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'    #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    #用来显示负号

# 绘制里程数分布散点图
plt.scatter(df.index, df['公里数(万)'])
plt.xlabel('车辆编号')
plt.ylabel('公里数(万)')
plt.title('里程数分布散点图')
plt.show()

# 绘制历程数直方图
plt.hist(df['公里数(万)'], bins=20) # bins的数量可以改变直方图的分组
plt.xlabel('公里数(万)')
plt.ylabel('数量')
plt.title('里程数分布直方图')
plt.show()

# 绘制里程跟价格之间的散点图
plt.scatter(df['公里数(万)'], df['价格(万)'])
plt.xlabel('里程数(万公里)')
plt.ylabel('价格(万元)')
plt.title('里程数和价格散点图')
plt.show()

文末:本文仅供学习使用,不支持任何商业或投资用途!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
爬取58同城二手车信息的一般步骤如下: 1. 对58同城二手车页面进行分析,找出需要爬取信息所在的HTML标签和属性; 2. 使用Python的爬虫框架(如Scrapy或BeautifulSoup)编写爬虫程序,模拟浏览器向58同城服务器发送请求,并获取服务器返回的HTML页面; 3. 解析HTML页面,提取需要的二手车信息,并存储到本地的数据库或文件中。 以下是一个简单的Scrapy爬虫程序示例,可以爬取58同城二手车信息: ```python import scrapy class SecondHandCarSpider(scrapy.Spider): name = "second_hand_car" start_urls = [ 'https://bj.58.com/ershouche/', ] def parse(self, response): for car in response.css('ul.carlist li'): yield { 'title': car.css('h2 a::text').get(), 'price': car.css('.col-1 .priType-s b::text').get(), 'mileage': car.css('.col-1 .kilometer::text').get(), 'year': car.css('.col-1 .carinfo span:first-child::text').get(), 'brand': car.css('.col-1 .carinfo span:nth-child(2)::text').get(), 'model': car.css('.col-1 .carinfo span:nth-child(3)::text').get(), 'location': car.css('.col-2 p:nth-child(1) a::text').get(), 'publish_time': car.css('.col-2 p:nth-child(2)::text').get(), } next_page = response.css('.pager a.next::attr(href)').get() if next_page is not None: yield response.follow(next_page, self.parse) ``` 该程序使用了Scrapy框架,通过CSS选择器提取了每辆二手车的标题、价格、里程、年份、品牌、型号、地点和发布时间等信息,并翻页继续爬取下一页的数据。您可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jony..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值