专栏首页小数志瓜子二手车市场分析(Scrapy+Tableau)

瓜子二手车市场分析(Scrapy+Tableau)

00 概要

本文对瓜子网杭州二手车进行了爬取和简单分析,一方面是为了进一步熟练使用Python的Scrapy爬虫框架,另一方面是为了熟悉Tableau强大的数据可视化功能。

  • 数据爬取:Python3.7,Scrapy(requests抓取+xpath解析),MySQL(数据存储)
  • 数据可视化:Tableau2019.4

01 数据爬取

瓜子二手车是一个用爬虫比较容易的网站,除了设置简单的headers(实测至少需要UA和cookie)之外,并不需要其他复杂的反爬手段。目标是爬取杭州市的所有在售二手车信息,那么在限定了地点之后,需要的就是指定车的品牌,而后就可以构造各信息爬取页的url了。

为了应用Scrapy框架,只需指定一个初始页即可实现全站爬虫,但这里个人偷了个懒,所幸直接先写了一小段爬虫将所有品牌的初始页面都写入start_urls列表,以便后续调用。

记录下应用Scrapy爬取流程:

  1. 建立工程文件
  2. 生成爬虫工程及文件 i. scrapy startproject guazi ii. scrapy genspider Myguazi guazi.com
  3. 修改items.py文件信息,增加爬取字段名
  4. 实现MyGuazi.py文件的爬虫核心代码(部分代码见后文)
  5. 设置name 、allowed_domains和start_urls 3部分参数 i. 设计parse解析函数,主要获取item目标信息,并尝试提取下一页链接,递归调用parse
  6. 修改settings中关于cookie和headers的设置 i. 取消cookie_enabled = False的注释,此时表示不适用scrapy默认的cookie,而用settings中的headers信息 ii. 修改Default_request_headers信息,增加必要的请求头
  7. 修改pipelines文件 i. 将爬取的item信息逐条写入MySQL数据库
  8. 运行爬虫:Scrapy Crawl Myguazi
#获取start_urls
url = "https://www.guazi.com/hz/buy/"
html = requests.get(url=url, headers=Headers).text
hrefs = content.xpath("//div[@class='dd-all clearfix js-brand js-option-hid-info']//p/a/@href")
start_urls = ["https://www.guazi.com" + href for href in hrefs]
#解析函数
def parse(self, response):
        lis = response.xpath("//ul[@class='carlist clearfix js-top']/li")
        for li in lis:
            item = GuaziItem()
            item['car'] = li.xpath(".//a/@title").get()
            item['year'] = li.xpath(".//div[@class='t-i']/text()").get()
            item['km'] = li.xpath(".//div[@class='t-i']/text()").getall()[1]
            item['currentPrice'] = "".join(li.xpath(".//div[@class='t-price']/p//text()").getall())
            item['originalPrice'] = li.xpath(".//div[@class='t-price']/em/text()").get()
            yield item

        next_url =  response.xpath("//ul[@class='pageLink clearfix']//a[@class='next']/@href").get()
        if next_url is not None:
            next_url = "https://www.guazi.com" + next_url
            yield scrapy.Request(next_url, callback = self.parse)

注:

  • 爬取总数:41533
  • 全站实有数:112332

之所以Scrapy未实现“全站”爬取的原因在于网站仅列出各车型50页的数据(每页40条),当某一品牌二手车数量大于2000辆时,后续信息无法获得。(暂未找到解决办法)


02 数据可视化

主要是分析2个信息:

  • 杭州二手车市场概况,包括品牌占比、换车时间、行驶里程、原价和现价等;

表达的信息都在仪表盘里

  • 二手车保价率信息,主要是随使用年限和行驶里程的拟合曲线,并重点分析了几种品牌车型的保价率情况。

保价率=现价/原价

2个结论:

  1. 保价率与使用年限和行驶里程呈现高度负相关;
  2. 不同品牌车保价率随使用年限变化曲线略有不同,在列出的8个基数比较大的二手车品牌中,保价率随使用年限呈现3个梯队,以使用5年为参考基准:
  • 保价率在0.5以上的:本田(约0.65)、日产(约0.55),均为日系车
  • 保价率在0.5左右的:奔驰、奥迪、现代,两个德系,一个韩系
  • 保价率在0.5以下的:宝马(约0.45)、长安(约0.45)、哈弗(约0.4),一个德系,两个国产。

二手车市场上,在品牌和质量方面齐名的"奥宝驰"不仅数量差别明显,在保价率上也是高下立判;日系车保价率居然最高;国产车的质量发展和品牌打造仍然任重而道远。

本文分享自微信公众号 - 小数志(Datazhi),作者:luanhz

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 应用scrapy爬虫框架

    scrapy=scrap+python,是python自动化爬虫框架,相当于一个模板。当启动了一个scrapy工程后,会自动生成若干相互关联的文件,用户仅需根据...

    luanhz
  • Python变量并列赋值的疑问

    问题:索引从0开始长度为N的数组A,包含0到N - 1的所有整数。找到并返回最大的集合S,S[i] = {A[i], A[A[i]], A[A[A[i]]], ...

    luanhz
  • 再也不担心用不好二分法了,因为我找到了"作弊"的接口

    导读:算法是程序的灵魂,而复杂度则是算法的核心指标之一。为了降低复杂度量级,可谓是令无数程序员绞尽脑汁、甚至是摧枯秀发。一般而言,若能实现对数阶的时间复杂度,算...

    luanhz
  • 用scrapy爬虫抓取慕课网课程数据详细步骤

    关于如何安装scrapy框架,可以参考这篇文章 史上最完全Mac安装Scrapy指南 http://www.jianshu.com/p/a03aab073...

    机器学习AI算法工程
  • VMware vSAN双活(延伸集群)站点间带宽设计

    笔者之前也分享过vSAN延伸集群的一些资料。在双活的设计中,站点之间带宽预估、脑列处理等问题,都是需要重点考虑的。本次向大家分享一下vSAN带宽带宽的设...

    魏新宇
  • 巧用parallel极速提升数据加载速度(r2第21天)

    并行在平时工作中可能不是很注意,因为有时候即使设定了parallel 相关的hint,感觉性能也好不到哪去。这是我以前的感觉。 今天通过一个案例来分享一下通过p...

    jeanron100
  • 晒下我的vim-看这货是IDE吗?

    今天在公司配了下vim,参考了同事的配置,搞了几个不错的插件,回到家里把环境统一下。上两个图,看看效果如何。 darkblue配色:

    the5fire
  • Python--6 文件操作

    文件通常用于存储数据或应用系统的参数。Python 提供了 OS、 os.path、 shutil 等模块处理文件, 其中包括打开文件、 读写文件、 复制和删除...

    py3study
  • Vue directive中修改v-model值

    最近在重构一个旧项目,这个项目用到了一些bootstrap的插件,我们想保留这些插件,就会遇到一些问题,比如我们把插件封装成了directive,在双向绑定方面...

    javascript.shop
  • Linux私房菜:vi与vim编辑器

    vim还支持同时打开多个文件,用于跨文件操作:vim file1 file2 file*

    happyJared

扫码关注云+社区

领取腾讯云代金券