python爬取汽车之家数据_Python神技能 | 使用爬虫获取汽车之家全车型数据
最近想在工作相关的项目上做技术改进,需要全而准的车型数据,寻寻觅觅而不得,所以就只能自己动手丰衣足食,到网上获(窃)得(取)数据了。
汽车之家是大家公认的数据做的比较好的汽车网站,所以就用它吧。(感谢汽车之家的大大们这么用心地做数据,仰慕)
俗话说的好,“十爬虫九python”,作为一只java狗,我颤颤巍巍地拿起了python想要感受一下scrapy的强大。。。
在写这个爬虫之前,我用urllib2,BeautifulSoup写了一个版本,不过效率太差,而且还有内存溢出的问题,作为python小白感觉很无力,所以用scrapy才是正道。
嗯,开搞。
准备工作
安装python,版本是2.7
安装scrapy模块, 版本是1.4.0
参考
汽车之家车型数据爬虫[https://github.com/LittleLory/codePool/tree/master/python/autohome_spider]:这是我工程的代码,以下内容需要参照着代码来理解,就不贴代码在这里了。
Scrapy中文文档:这是Scrapy的中文文档,具体细节可以参照文档。感谢Summer同学的翻译。
Xpath教程:解析页面数据要用到xpath的语法,简单了解一下,在做的过程中遇到问题去查一下就可以了。
初始化工程
scrapy工程的初始化很方便,在shell中的指定目录下执行scrapy start startproject 项目名称,就自动化生成了。
执行这步的时候遇到了一个问题,抛出了异常"TLSVersion.TLSv1_1: SSL.OP_NO_TLSv1_1",解决方法是执行sudo pip install twisted==13.1.0,应该是依赖库版本不兼容。
目录结构
工程初始化后,scrapy中的各个元素就被构建好了,不过构建出来的是一副空壳,需要我们往里边写入我们的爬虫逻辑。
初始化后的目录结构是这样的:
spiders:爬虫目录,爬虫的爬取逻辑就放在个目录下边
items.py:数据实体类,在这里定义我们爬到的数据结构
middlewares.py:爬虫中间件(我自己翻译的哈),在这里定义爬取前、爬取后需要处理的逻辑
pipelines.py:数据管道,爬取后的数据实体会经过数据管道的处理
settings.py:配置文件,可以在这里配置爬虫的爬取速度,配置中间件、管道是否开启和先后顺序,配置数据输出的格式等。
了解过这些文件的作用后就可以开始写爬虫了。
开始吧!
首先,确定要爬取的目标数据。
我的目标是获取汽车的品牌、车系、车型数据,先从品牌开始。
在汽车之家的页面中寻觅一番后,找到了一个爬虫的切入点,汽车之家车型大全。这个页面里有所有品牌的数据,正是我的目标。不过在观察的过程中发现,这个页面里的品牌数据是在页面向下滚动的过程中延迟加载的,这样我们通过请求这个页面不能获取到延迟加载的那部分数据。不过不要慌,看一下延迟加载的方式是什么样的。
打开浏览器控制台的网络请求面板,滚动页面来触发延迟加载,发现浏览器发送了一个异步请求:
复制请求的URL看看:
http://www.autohome.com.cn/grade/carhtml/B.html
http://www.autohome.com.cn/grade/carhtml/C.html
http://www.autohome.com.cn/grade/carhtml/D.html
找到规律了,每一次加载的URL,都只是改变了对应的字母,所以对A到Z分别请求一次就取到了所有的品牌数据。
打开http://www.autohome.com.cn/grade/carhtml/B.html看下,发现页面的数据很规整,是按照品牌-厂商-车系的层级组织的。嗯,正合我意,那就开爬吧。
编写Spider
在spiders目录下边,新建一个brand_spider.py文件,在文件中定义BrandSpider类,这个类继承了scrapy.Spider类,这就是scrapy的Spider类。在BrandSpider中,需要声明name变量,这是这个爬虫的ID;还需要声明start_urls,这是爬虫的起点链接;再定义一个parse方法,里面实现爬虫的逻辑。
parse方法的入参中,response就是对start_urls中的链接的请求响应数据,我们要爬取的品牌数据就在这里面,我们需要从response中提取出来。从response提取数据需要使用xpath语法,参考上边的xpath教程。
提取数据之前,需要先给品牌数据定义一个实体类,因为需要把品牌数据存到数据实体中并落地到磁盘。在items.py文件中定义一个BrandItem类,这个类继承了scrapy.Item类,类中声明了爬取到的、要落地的品牌相关数据,这就是scrapy的Item类。
定义好品牌实体后,在parse方法中声明一个BrandItem实例,然后通过reponse.xpath方法取到想要的品牌ID、品牌url、品牌名称、图标url等数据,并设置到BrandItem实例中,最后通过yield来聚合爬取到的各个品牌数据并返回,返回的数据会进入pipeline。
编写Pipeline
爬取到的数据接着被pipeline.py文件中定义的Pipeline类处理,这个类通常是对传入的Item实体做数据的清洗、排重等工作,可以定义多个Pipeline,依次对Item处理。由于暂时没有这方面的需要,就不改写这个文件,保持默认状态就好。经过pipeline的处理后,数据进入数据集。
输出csv格式数据
对于爬取到的车型数据,我想以csv的格式输出,并且输出到指定目录下,此时需要修改settings.py文件。
在settings.py中添加FEED_FORMAT = 'csv'和FEED_URI = 'data/%(name)s_%(time)s.csv'两项,目的是指定输出格式为csv,输出到data目录下,以”爬虫名称_爬取时间.csv“格式命名。
执行爬虫
品牌数据的爬虫编写完成了,在项目根目录下执行scrapy crawl brand,不出意外的话,在执行了brand爬虫后,会在data目录下出现一个新的csv文件,并且装满了品牌数据。
小心被屏蔽
不过需要注意一个问题,就是当爬虫高频地请求网站接口的时候,有可能会被网站识别出来并且屏蔽掉,因为太高频的请求会对网站的服务器造成压力,所以需要对爬虫限速。
在settings.py中添加DOWNLOAD_DELAY = 3,限制爬虫的请求频率为平均3秒一次。
另外,如果爬虫发送的请求头中没有设置user agent也很容易被屏蔽掉,所以要对请求头设置user agent。
在项目根目录下新建user_agent_middlewares.py文件,在文件中定义UserAgentMiddleware类,继承了UserAgentMiddleware类。在UserAgentMiddleware中声明user_agent_list,存放一些常用的user agent,然后重写process_request方法,在user_agent_list中随机选取user agent写入请求头中。
车系、车型爬虫
车系爬虫与上边的品牌爬虫类似,实现在spiders/series_spider.py中。
车型爬虫稍微复杂一些,实现在spiders/model_spider.py中。车型爬虫要从页面中解析出车型数据,同时要解析出更多的URL添加到请求队列中。而且,车型爬虫爬取的页面并不像品牌数据页面那么规整,所以要根据URL的特征以及页面中的特征来调整解析策略。因此在这里用到了CrawlSpider和Rules,具体参照Spider文档。
总结
以上就实现了一个简单的汽车之家的车型数据爬虫,其中用到了scrapy中的部分元素,当然还有很多元素没有涉及到,不过对于一个简单爬虫来说足矣。
Tip
在用xpath解析页面的时候,写出来的xpath语句很可能与预期不符,而且调试起来很麻烦,我是用以下方式来提高效率的:
使用chrome上的XPath Helper插件。安装好插件,打开目标页面,按command+shift+x(mac版的快捷键)打开插件面板,在面板里输入xpath语句,就能看到取到的结果了:
使用scrapy shell调试。在工程目录下执行scrapy shell http://www.xxxxx.xx,之后就会进入python的交互终端,这时就可以进行调试了。执行print response.xpath('xxxxx')来验证xpath语句是否符合预期。
作者:littlelory
来源:http://www.jianshu.com/p/792e19ed9e1
*声明:推送内容及图片来源于网络,部分内容会有所改动,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。
- 结束 -
python爬取汽车之家数据_Python神技能 | 使用爬虫获取汽车之家全车型数据相关推荐
- python怎么爬虫理数据_Python神技能 | 使用爬虫获取汽车之家全车型数据
最近想在工作相关的项目上做技术改进,需要全而准的车型数据,寻寻觅觅而不得,所以就只能自己动手丰衣足食,到网上获(窃)得(取)数据了. 汽车之家是大家公认的数据做的比较好的汽车网站,所以就用它吧.(感谢 ...
- python 写csv scrapy_Python神技能 | 使用爬虫获取汽车之家全车型数据
最近想在工作相关的项目上做技术改进,需要全而准的车型数据,寻寻觅觅而不得,所以就只能自己动手丰衣足食,到网上获(窃)得(取)数据了. 汽车之家是大家公认的数据做的比较好的汽车网站,所以就用它吧.(感谢 ...
- python爬取新闻并归数据库_Python爬取数据并写入MySQL数据库操作示例
Python爬取数据并写入MySQL数据库的实例 首先我们来爬取 http://html-color-codes.info/color-names/ 的一些数据. 按 F12 或 ctrl+u 审查元 ...
- python爬取app中的音频_Python爬取喜马拉雅音频数据详解
码农公社 210.net.cn 210是何含义?10月24日是程序员节,1024 =210.210既 210 之意. Python爬取喜马拉雅音频数据详解 一.项目目标 爬取喜马拉雅音频数据 受害 ...
- python爬取股票大单历史记录_python爬取股票实时数据,python爬虫与股票分析
内容导航: Q1:怎么学python爬取财经信息 本程序使用Python 2.7.6编写,扩展了Python自带的HTMLParser,自动根据预设的股票代码列表,从Yahoo Finance抓取列表 ...
- python爬取网页书籍名称代码_python爬取亚马逊书籍信息代码分享
我有个需求就是抓取一些简单的书籍信息存储到mysql数据库,例如,封面图片,书名,类型,作者,简历,出版社,语种. 我比较之后,决定在亚马逊来实现我的需求. 我分析网站后发现,亚马逊有个高级搜索的功能 ...
- python爬取饿了么评论_python爬取饿了么的实例
python爬取饿了么的实例 发布时间:2020-11-17 10:55:40 来源:亿速云 阅读:85 作者:小新 小编给大家分享一下python爬取饿了么的实例,相信大部分人都还不怎么了解,因此分 ...
- python爬取微博热搜显示到折线图_微博热搜榜前20信息数据爬取进行数据分析与可视化...
一.设计方案 1.主题式网络爬虫名称:微博热搜榜前20信息数据爬取进行数据分析与可视化 2.爬取内容与数据特征分析:爬取微博热搜榜前20热搜事件.排名与热度,数据呈一定规律排序. 3.设计方案概述:思 ...
- python爬取一张图片并保存_python爬取网页图片并保存到本地
先把原理梳理一下:首先我们要爬取网页的代码,然后从中提取图片的地址,通过获取到的地址来下载数据,并保存在文件中,完成. 下面是具体步骤: 先确定目标,我挑选的是国服守望先锋的官网的英雄页面,我的目标是 ...
- python爬取数据分析淘宝商品_python爬取并分析淘宝商品信息
python爬取并分析淘宝商品信息 Tip:本文仅供学习与交流,切勿用于非法用途!!! 背景介绍 有个同学问我:"XXX,有没有办法搜集一下淘宝的商品信息啊,我想要做个统计".于是 ...
最新文章
- webpack url-loader limit 转换部分资源为base64格式 其余不转换
- setBackgroundDrawable和setBackgroundColor的用法(转)
- mysql+显示表ddl_MySQL_DDL_数据库和表的操作
- 直接在Dao层进行测试的问题
- MFC_自定义事件响应
- quill鼠标悬浮 出现提示_jQuery实现鼠标悬停显示提示信息窗口的方法
- ArrayList 与linkedlist区别
- 必知必会 | WebView 的一切都在这儿
- JVM学习-操作数栈(Operand Stack-官方翻译)
- imagej边缘提取
- LwIP协议栈之数据包pbuf
- 中国统计年鉴2021(各省份经济指标,人口规模,工农业数据,主要社会经济指标)
- 学习笔记之——针孔相机模型及单应性矩阵
- kafka集群开启sasl认证
- Robot Framework RIDE工具闪退处理
- 未来的世界是,方向比努力重要,能力比知识重要,健康比成绩重要,生活比文凭重要,情商比智商重要!
- Label 标签使用
- Python3基础教程
- Block的简单理解
- Win10_X64远线程注入dll(非CreateRemoteThread)
热门文章
- 简单的数据库group by后要进行某字段拼接
- php session auto_start,PHP出现 Warning: session_start()的解决方法
- C#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件
- 结对-结对编程项目作业名称-需求分析
- Javascript单例模式概念与实例
- 阿里云数据盘分区并挂载
- 2018-2019-1 20189218《Linux内核原理与分析》第二周作业
- 小程序开发之单页面生命周期
- QT虚拟小键盘设计--qt事件循环,事件发送的理解
- linux的守护进程init.d和xinetd.d