爬虫分类总结——Scrapy总结与实战

 

img

首先祭出中文Scrapy文档,较枯燥,但是很有用。

Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。

流程图如下:

 

img

 

① Scrapy Engine

引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。 详细内容查看下面的数据流(Data Flow)部分

② 调度器(Scheduler)

调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎

③ 下载器(Downloader)

下载器负责获取页面数据并提供给引擎,而后提供给spider

④ Spiders

Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。 每 个spider负责处理一个特定(或一些)网站

⑤ Item Pipeline

Item Pipeline负责处理被spider提取出来的item。典型的处理有清理、 验证及持久化(例如存取到数 据库中)

⑥ 下载器中间件(Downloader middlewares)

下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的 response。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能

⑦ Spider中间件(Spider middlewares)

Spider中间件是在引擎及Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出 (items及requests)。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能

⑧ 数据流(Data flow)

Scrapy中的数据流由执行引擎控制,其过程如下:

引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的 URL(s)。 引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。 引擎向调度器请求下一个要爬取的URL。 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载 器(Downloader)。 一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方 向)发送给引擎。 引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。 Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。 引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。 (从第二步)重复直到调度器中没有更多地request,引擎关闭该网站

流程归纳:

1.首先下载器下载request回执的html等的response 2.然后下载器传给爬虫解析 3.接着爬虫解析后交给调度器过滤,查重等等 4.最后交给管道,进行爬取数据的处理

实战应用

第一步:首先打开CMD,进入我们要保存项目的路径,新建爬虫项目

文件夹PATH列表如下:

 

img

第二步编辑items.py文件(定义Item)

Items是将要装载抓取的数据的容器,它工作方式像 python 里面的字典,但它提供更多的保护,比如对未定义的字段填充以防止拼写错误。

通过创建scrapy.Item类, 并且定义类型为 scrapy.Field 的类属性来声明一个Item. 我们通过将需要的item模型化,来控制从 dmoz.org 获得的站点数据,比如我们要获得站点的名字,url 和网站描述,我们定义这三种属性的域。在 tutorial 目录下的 items.py 文件编辑

第三步编写spider(制作爬虫)

先爬后取(获取整个网页内容,再取出有用部分)

第一招:

Spider 是用户编写的类, 用于从一个域(或域组)中抓取信息, 定义了用于下载的URL的初步列表, 如何跟踪链接,以及如何来解析这些网页的内容用于提取items。

要建立一个 Spider,继承 scrapy.Spider 基类,并确定三个主要的、强制的属性:

name:爬虫的识别名,它必须是唯一的,在不同的爬虫中你必须定义不同的名字.

start_urls:包含了Spider在启动时进行爬取的url列表。因此,第一个被获取到的页面将是其中之一。后续的URL则从初始的URL获取到的数据中提取。我们可以利用正则表达式定义和过滤需要进行跟进的链接。

parse():是spider的一个方法。被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。 这个方法负责解析返回的数据、匹配抓取的数据(解析为 item )并跟踪更多的 URL。

创建doubnaspider.py,保存在douban\spiders目录下。

在douban目录下按住shift右击,在此处打开命令窗口,输入:scrapy crawl douban

运行结果为:

最后一句INFO: Closing spider (finished)表明爬虫已经成功运行并且自行关闭了。

再看看此时的文件夹PATH列表

 

img

其实在douban目录下的main.py我们可以事先创建,并写入:

在pycharm里运行main.py,可以得到相同的结果。


若出现:

DEBUG: Ignoring response <403 http://movie.douban.com/top250>: HTTP status code is not handled or not allowed

在settings.py写入:

第二招:

http://movie.douban.com/top250 按F12:

 

img

每一部电影的信息都在一个<li>...<li>里(包括图片),我们需要的都在<div class=info>...<div>里面。利用Xpath来解析:

这里面有两个小问题,title包括两个,而quote有的电影没有,所以我们调整一下,完整代码如下:

运行结果截取一部分(setting没有设置USER_AGENT可能出现403错误):

 

img

接下来就是处理自动处理自动抓取下一页的内容。看下图:

 

img

里面关于rel="next"的介绍看这个链接:SEO:分页使用rel=“next” 和 rel=“prev”

我们把它抓出来补成完整的URL,就可以循环抓取了。

这里我们要引入Request。 from scrapy.http import Request

获取链接的代码如下:

下面是完整代码:(http改为了https,不然出现301重定向错误)

第四步存储内容(Pipline)

要用到Scrapy自带的Feed exports功能。

常用的就四种输出格式:JSON,JSON lines,CSV,XML。

我们导出为JSON格式:

导出为csv格式则为:

其实我们可以直接在settings.py文件中设置输出的位置和文件类型:

FEED_URL是必须的。然后file后面的三斜杠是标准文档规定的,最好这么写吧。

 

img

标准文档用的三斜杠

在pycharm中运行main.py,就可以看到所有的电影信息。

补充:

1.item的使用

Item对象是自定义的python字典,可以使用标准的字典语法来获取到其每个字段的值(字段即是我们之前用Field赋值的属性)

一般来说,Spider将会将爬取到的数据以 Item 对象返回, 最后修改爬虫类,使用 Item 来保存数据

列一段示例代码:

2.Item Pipeline(条目管道)的使用

参考标准文档

当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。 每个item pipeline组件(有时称之为ItemPipeline)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。 以下是item pipeline的一些典型应用:

编写你自己的item pipeline很简单,每个item pipeline组件是一个独立的Python类,同时必须实现以下方法:

具体应用时参考标准文档即可。


参考文章链接:Scrapy爬取豆瓣电影

 

https://www.jianshu.com/p/0f9671e583eb