Scrapy实战—爬取汽车之家车型价格

lxmanutd 2018-12-17

一、框架简介

Scrapy是一款由Python语言编写实现的开源爬虫框架,主要用于抓取Web网页并从其中提取相应数据。Scrapy采用了异步网络库Twisted来实现与管理网络通讯模块,它可以方便完成各种需求,同时包含丰富接口,用户可以对其进行扩展并完成一个网络爬虫的定制。

Scrapy框架是由Engine(引擎) ,Scheduler(调度器), Downloader(下载器), Spiders(爬虫), Item Pipeline(项目管道), Downloader middlewares(下载器中间件), Spider middlewares(爬虫中间件)七个模块构成,其框架如图所示:

Scrapy实战—爬取汽车之家车型价格

各部分的具体功能是:

1.引擎:负责控制与协调数据在框架各个模块中流动,并在相应事件发生时触发特定的函数处理事件。

2.调度器:负责接受来自擎接的请求,并将他们入队,以便之后引擎请求URL。实质上就是对爬取队列进行管理。

3.下载器:负责获取页面数据并提供给引擎,而后提供给爬虫程序,以供爬虫函数对网页进行解析。

4.爬虫:由用户自行编写,用于对请求所得到得回应(response)进行分析,以便得到所需要的数据或得到更深一步的URL,每个爬虫负责处理一个特定(或一些)网站。

5.项目管道:按照一定顺序,负责处理被爬虫提取出来的数据。典型的处理有数据清理、 合法化验证及持久化(例如存取到数据库中)。

6.下载器中间件:其是在引擎及下载器之间的桥梁,处理下载器传递给引擎的回应。 其提供了一个简便的机制,通过自定义代码来扩展Scrapy功能。Scrapy框架中有一些已经写好的中间件,例如CookiesMiddleware可以用来处理对cookies有要求的网站,保存网站发送的cookies,像浏览器一样在网站其他页面需要的时候将cookies发送。

7.爬虫中间件是在引擎及爬虫函数之间的桥梁,处理爬虫的输入和输出。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。其同样内置了部分爬虫中间件,例如DepthMiddleware,是可以用于追踪每个Request在爬取的网站中深度的中间件,其可以用来限制爬取的最大深度。

二、爬虫的数据流向

Scrapy中的数据流由引擎进行控制,如图中的绿色箭头,代表了在Scrapy中的数据流向,其过程可以总结为:

1.引擎打开一个网站,定位到处理该网站的爬虫,并向该爬虫中请求第一个要爬取的URL(s)。

2.引擎从爬虫中获取到第一个要爬取的URL并将其作为一个请求发送给调度器,将其加入待爬队列。

3.引擎向调度器请求下一个要爬取的URL。

4.调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件传递给给下载器。

5.一旦页面下载完毕,下载器生成一个该页面的回应(Response),并将其通过下载中间件返还给引擎。

6.引擎从下载器中接收到Response并通过爬虫中间件发送给爬虫处理。

7.爬虫处理Response并返回爬取到的数据及新的URL给引擎。

8.引擎将爬取到的数据给项目管道,将爬虫返回的URL给调度器。

9.重复第3步到第8步,直到调度器中没有待爬队列,引擎关闭该页面。

从Scrapy框架的数据流向中,我们可以总结出,这个框架核心首先在于定义初始URL,这样程序才能从该URL为起始点不断地获取所需的URL和数据。其次在于对用户自定爬虫的编写,在其中定义我们对于下载到网页的解析。

爬虫解析并返回的结果有两种:一种是新的URL,需要将其放回调度器,加入待爬队之中等待进一步爬取;另一种是解析出的数据,则会被送到项目管道,项目管道负责清洗数据,验证解析出来的数据,检查数据是否和已存储的数据重复,有则丢弃,最终将清洗后的数据存储到数据库中。

三、解析网页方法

1、BeautifulSoup

BeautifulSoup是一个可以从HTML或XML文件中提取数据的python库。它基于HTML代码的结构来构造一个Python对象,提供了一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

BeautifulSoup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。其已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

2、Xpath

Xpath是一门用来在XML(标准通用标记语言的子集)文件中选择节点的语言,也可以用在HTML上。XPath基于XML的树状结构,提供在数据结构中寻找节点的能力。而Scrapy利用选择器(selectors)来提取数据,可以通过特定的Xpath表达式来“选择”HTML文件中的某个部分。

XPath使用路径表达式来选取XML文档中的节点或节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。除此之外,XPath含有超过100个内建的函数。这些函数用于字符串值、数值、日期和时间比较、节点和QName处理、序列处理、逻辑值等。

四、安装scrapy

Windows平台安装:

a. pip3 install wheel

b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted

c. 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl

d. pip3 install pywin32

e. pip3 install scrapy

Linux:

pip3 install scrapy

五、scrapy简单使用

现在写一个利用scrapy爬虫框架爬取最新美剧的项目。

准备工作:

目标地址:https://car.autohome.com.cn/

爬取项目:汽车之家网站的各个品牌下的车型名称和指导价格

Scrapy基础使用步骤:

1.创建项目:scrapy startproject 项目名称

Scrapy实战—爬取汽车之家车型价格

scrapy.cfg 项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中)

items.py 设置数据存储模板,用于结构化数据,如:Django的Model

pipelines 数据持久化处理

settings.py 配置文件,如:递归的层数、并发数,延迟下载等

spiders 爬虫目录,如:创建文件,编写爬虫解析规则

2.创建爬虫应用程序:

cd project_name(进入项目目录)

scrapy genspider 应用名称 爬取网页的起始url (例如:scrapy genspider car_price car.autohome.com.cn/)

3.编写爬虫文件:在步骤2执行完毕后,会在项目的spiders中生成一个应用名的py爬虫文件,文件源码如下:

Scrapy实战—爬取汽车之家车型价格

4.设置爬取项目(items.py)

Scrapy实战—爬取汽车之家车型价格

5.编写爬取脚本(car_price.py)

Scrapy实战—爬取汽车之家车型价格

6.对爬取结果的处理

Scrapy实战—爬取汽车之家车型价格

7.设置settings.py

Scrapy实战—爬取汽车之家车型价格

8.启动爬虫:scrapy crawl car_price

9.采集结果:

Scrapy实战—爬取汽车之家车型价格

Scrapy实战—爬取汽车之家车型价格

[ShareSDK] 轻松实现社会化功能 强大的社交分享

[SMSSDK] 快速集成短信验证 联结通讯录社交圈

[MobLink] 打破App孤岛 实现Web与App无缝链接

[MobPush] 快速集成推送服务 应对多样化推送场景

[AnalySDK] 精准化行为分析 + 多维数据模型 + 匹配全网标签 + 垂直行业分析顾问

BBSSDK | ShareREC | MobAPI | MobPay | ShopSDK | MobIM | App工厂

截止2018 年4 月,Mob 开发者服务平台全球设备覆盖超过84 亿,SDK下载量超过3,300,000+次,服务超过380,000+款移动应用

相关推荐