python 爬虫乱码 如何使用Python爬虫获取汽车之家全车型数据

最近,如果你想在工作相关的项目进行技术改进,你需要完整和准确的车辆模型数据,但你可以别找了。所以只能自己丰衣足食,在网上获取(窃取)数据。

它it’是汽车之家的知名汽车网站,就用它吧。(感谢汽车之家的大佬们这么用心做数据,佩服)

常言道,十种爬行动物和九种蟒蛇,作为一只爪哇狗,我拿起Python摇摇欲坠地感受刺儿头的力量。

在写这个爬虫之前,我用urllib2写了一个版本,BeautifulSoup,但是效率太差,有内存溢出问题。作为一个蟒蛇白人感到无能为力,所以使用scrapy是正确的方式。

好吧,让咱们开始吧。

准备工作/即将开始工作

安装python,版本2.7

安装scrapy模块,版本1.4.0。

涉及

汽车之家车型数据爬虫[https://github . com/little lory/code pool/tree/master/python/autohome _ spider]:这是我项目的代码。以下内容需要参考代码理解,所以我赢了不要在这里张贴代码。

Scrapy中文文档:这是Scrapy的中文文档。详情请参考文档。谢谢夏天的翻译。

教程:应该使用Xpath的语法来解析页面数据。简单了解一下就行了,过程中遇到什么问题再去查。

初始化项目

scrapy项目的初始化非常方便。在shell中执行指定目录下的scrapy start startproject项目名,就会自动生成。

我在执行这个步骤时遇到了一个问题,并抛出了一个异常TLS version . TLS v1 _ 1:SSL . op _ no _ TLS v1 _ 1 解决方案是执行sudo pip install twisted==13.1.0,这应该是依赖库的不兼容版本。

目录结构

项目初始化后,scrapy中的所有元素都构建好了,但是构建好的shell需要我们将自己的爬虫逻辑写入其中。

初始化后的目录结构如下所示:

蜘蛛:爬虫目录,爬虫的爬行逻辑放在这个目录下。

Items.py:数据实体类,在这里我们定义了我们所攀爬的数据结构。

Middlewares.py:爬虫中间件(自己翻译的),定义了爬行前后要处理的逻辑。

Pipelines.py:数据管道。被爬网的数据实体将由数据管道处理。

Settings.py:配置文件,可以配置爬虫的爬行速度、中间件、管道是否打开以及顺序、数据输出的格式。

了解了这些文件的功能后,就可以开始写爬虫了。

让走吧!

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

我的目标是获得汽车的品牌、系列和型号的数据,从品牌开始。

搜索汽车之家页,我找到了一个爬虫的突破点,汽车之家模型书。这个页面有所有品牌的数据,这是我的目标。但是在观察的过程中发现,这个页面中的品牌数据在向下滚动页面的过程中是有延迟的,所以我们可以请求此页面无法获得延迟的数据。但是唐别慌,看看延迟装货的方法。

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

复制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,发现页面上的数据很有规律,按照品牌-制造商-汽车系统的层级组织。嗯,那这就是我想要的。让让我们开始攀登。

写蜘蛛

在Spiders目录下,创建一个新的brand_spider.py文件,并在文件中定义BrandSpider类。这个类继承了scrapy。蜘蛛类,也就是scrapy的蜘蛛类。在BrandSpider中,需要声明name变量,也就是这个爬虫的ID;还需要声明start_urls,这是爬虫的起点链接;定义另一个解析方法,实现爬虫的逻辑。

在parse方法的参数中,response是start_urls中链接的请求响应数据。我们要抓取的品牌数据在这里,我们需要从响应中提取它。从响应中提取数据需要xpath语法。请参考上面的xpath教程。

在提取数据之前,您需要为品牌数据定义一个实体类,因为您需要将品牌数据存储在数据实体中并将其放在磁盘上。在Items.py文件中定义BrandItem类。这个类继承了scrapy。Item类,声明抓取的品牌相关数据落地。这是scrapy的项目类。

定义了品牌实体后,在parse方法中声明一个BrandItem实例,然后通过reponse.xpath方法获取想要的品牌ID、品牌url、品牌名称、图标url等数据,并在BrandItem实例中进行设置。最后通过yield聚合抓取的品牌数据并返回,返回的数据将进入管道。

写流水线

然后,由pipeline.py文件中定义的管道类处理检索到的数据。该类通常会对传入项目实体的数据进行清理和重复数据删除,并可以定义多个管道来依次处理项目。由于暂时不需要这方面的东西,所以最好保持默认状态,而不是重写这个文件。经过管道处理后,数据进入数据集。

输出csv格式数据

对于抓取的车辆数据,我想将其以csv格式输出到指定的目录。这时,我需要修改settings.py文件。

Add FEED _ FORMAT=csv 而feed _ uri=data/%(name)s _ %(time)s . CSV 在settings.py中,目的是指定输出格式为csv,将输出到数据目录并命名为爬虫名称_爬行时间. 。

执行爬虫

品牌数据的爬虫已经写好了,scrapy抓取品牌是在项目的根目录下执行的。不出意外的话,Brand的爬虫执行后,数据目录中会出现一个新的csv文件,里面会填充品牌数据。

小心保护。

但是需要注意一个问题,就是当爬虫高频请求网站接口时,可能会被网站识别并屏蔽。因为过高的频率请求会给网站服务器造成压力,所以有必要限制爬虫的速度。

在settings.py中添加DOWNLOAD_DELAY=3来限制爬虫平均请求频率为3秒。

另外,如果爬虫发送的请求头中没有用户代理,就很容易被阻塞,所以需要在请求头中设置用户代理。

在项目根目录下新建一个文件user _ agent _ middlewares.py,在文件中定义UserAgentMiddleware类,继承UserAgentMiddleware类。在UserAgentMiddleware中声明user_agent_list,存储一些常用的用户代理,然后重写process_request方法,在user_agent_list中随机选择用户代理,写入请求头。

用于汽车和模型的履带

汽车爬虫类似于上面的品牌爬虫,在spiders/series _ spider.py中实现。

模型爬虫稍微复杂一点,用spiders/model _ spider.py实现,爬虫要从页面解析车辆数据,同时解析出更多的URL添加到请求队列中。而且汽车爬虫抓取的页面不像品牌数据页面那么规则,要根据URL的特点和页面中的特征来调整解析策略。因此,这里使用了CrawlSpider和规则。有关详细信息,请参考Spider文档。

摘要

上图,汽车之家的一个简单的爬虫车辆数据实现,其中用到scrapy中的一些元素,当然还有很多元素没有涉及到,但是对于一个简单的爬虫来说已经足够了。

小费

当用xpath解析页面时,编写的xpath语句可能不会不符合预期,它调试起来很麻烦。我用以下方法来提高效率:

使用chrome上的XPath Helper插件。安装插件,打开目标页面,按Command Shift X(Mac版快捷键)打开插件面板,在面板中输入xpath语句,可以看到得到的结果:

用scrapy shell调试。在项目目录中执行scrapyshell 3358 www。