热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【scrapy】爬取汽车车型数据

汽车最近想在工作相关的项目上做技术改进,需要全而准的车型数据,寻寻觅觅而不得,所以就只能自己动手丰衣足食,到网上获(窃)得(取)数据了。汽车之家是大家公认的数据做的比较好的汽车网站

《【scrapy】爬取汽车车型数据》 汽车

最近想在工作相关的项目上做技术改进,需要全而准的车型数据,寻寻觅觅而不得,所以就只能自己动手丰衣足食,到网上获(窃)得(取)数据了。

汽车之家是大家公认的数据做的比较好的汽车网站,所以就用它吧。(感谢汽车之家的大大们这么用心地做数据,仰慕)

俗话说的好,“十爬虫九python”,作为一只java狗,我颤颤巍巍地拿起了python想要感受一下scrapy的强大。。。

在写这个爬虫之前,我用urllib2,BeautifulSoup写了一个版本,不过效率太差,而且还有内存溢出的问题,作为python小白感觉很无力,所以用scrapy才是正道。

嗯,开搞。

准备工作

  1. 安装python,版本是2.7
  2. 安装scrapy模块, 版本是1.4.0

参考

汽车之家车型数据爬虫:这是我工程的代码,以下内容需要参照着代码来理解,就不贴代码在这里了。

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:配置文件,可以在这里配置爬虫的爬取速度,配置中间件、管道是否开启和先后顺序,配置数据输出的格式等。

了解过这些文件的作用后就可以开始写爬虫了。

开始吧!

首先,确定要爬取的目标数据。

我的目标是获取汽车的品牌、车系、车型数据,先从品牌开始。

在汽车之家的页面中寻觅一番后,找到了一个爬虫的切入点,汽车之家车型大全。这个页面里有所有品牌的数据,正是我的目标。不过在观察的过程中发现,这个页面里的品牌数据是在页面向下滚动的过程中延迟加载的,这样我们通过请求这个页面不能获取到延迟加载的那部分数据。不过不要慌,看一下延迟加载的方式是什么样的。

打开浏览器控制台的网络请求面板,滚动页面来触发延迟加载,发现浏览器发送了一个异步请求:

《【scrapy】爬取汽车车型数据》 控制台

复制请求的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的特征以及页面中的特征来调整解析策略。因此在这里用到了CrawlSpiderRules,具体参照Spider文档。

总结

以上就实现了一个简单的汽车之家的车型数据爬虫,其中用到了scrapy中的部分元素,当然还有很多元素没有涉及到,不过对于一个简单爬虫来说足矣。

Tip

在用xpath解析页面的时候,写出来的xpath语句很可能与预期不符,而且调试起来很麻烦,我是用以下方式来提高效率的:

  1. 使用chrome上的XPath Helper插件。安装好插件,打开目标页面,按command+shift+x(mac版的快捷键)打开插件面板,在面板里输入xpath语句,就能看到取到的结果了:
    《【scrapy】爬取汽车车型数据》 xpath helper
  2. 使用scrapy shell调试。在工程目录下执行scrapy shell http://www.xxxxx.xx,之后就会进入python的交互终端,这时就可以进行调试了。执行print response.xpath('xxxxx')来验证xpath语句是否符合预期。

推荐阅读
  • 本文介绍了三种方法来实现在Win7系统中显示桌面的快捷方式,包括使用任务栏快速启动栏、运行命令和自己创建快捷方式的方法。具体操作步骤详细说明,并提供了保存图标的路径,方便以后使用。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • IntelliJ IDEA 卡成球了?
    在和同事的一次讨论中发现,对IntelliJIDEA内存采用不同的设置方案,会对IDE的速度和响应能力产生不同的影响。Don’tbeaScroogeandgiveyourIDEso ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 解决github访问慢的问题的方法集锦
    本文总结了国内用户在访问github网站时可能遇到的加载慢的问题,并提供了解决方法,其中包括修改hosts文件来加速访问。 ... [详细]
  • 解决IDEA配置xml文件头报错的方法
    本文介绍了解决IDEA配置xml文件头报错的方法,包括了具体的解决方案和步骤。通过本文的指导,读者可以轻松解决这个问题并正常使用IDEA进行开发工作。 ... [详细]
  • 本文总结了使用不同方式生成 Dataframe 的方法,包括通过CSV文件、Excel文件、python dictionary、List of tuples和List of dictionary。同时介绍了一些注意事项,如使用绝对路径引入文件和安装xlrd包来读取Excel文件。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • 随笔142  文章0  评论2294 一步一步教你使用AgileEAS.NET基础类库进行应用开发WinForm应用篇演示使用报表构建UI入库业务查询模块...
    回顾与说明前面我们把“商品字典”、“商品入库”、“商品库存查询”三个模块已经概括或者详细的演示完了,这些模块涉及到简单数据的增、删、修,也涉及到复杂业务 ... [详细]
author-avatar
骏天天在线
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有