024.(7.15-7.16)Scrapy框架 初步学习

参考书籍:《Python 3网络爬虫开发实战》


Scrapy 是一个基于 Twisted 的异步处理框架,是纯 Python 实现的爬虫框架,其架构清晰,可扩展性极强,可以灵活完成各种需求。我们只需要定制开发几个模块就可以轻松实现一个爬虫。

介绍

架构

在这里插入图片描述
在这里插入图片描述

数据流

在这里插入图片描述
注意!只有当调度器中不存在任何request了,整个程序才会停止,(也就是说,对于下载失败的URL,Scrapy也会重新下载。)

通过多个组件的相互协作、不同组件完成工作的不同部分、组件对异步处理的支持。Scrapy最大限度地利用了网络带宽,大大提高了数据爬取和处理的效率。

项目结构

scrapy startproject mySpider # 创建一个名为mySpider的项目

Scrapy 框架pyspider不同,它是通过命令行(!)来创建项目的,代码编写还是需要 IDE。
在这里插入图片描述
这些文件分别是:

scrapy.cfg: 项目的配置文件。其内定义了项目的配置文件路径、部署相关信息等内容。
mySpider/: 项目的Python模块,将会从这里引用代码。
mySpider/items.py: 项目的目标文件。
mySpider/pipelines.py: 项目的管道文件,定义 Item Pipeline 的实现。
mySpider/settings.py: 项目的设置文件。
mySpider/spiders/: 存储爬虫代码目录。其内包含 个个 Spide 的实现,每个 Spider 都有一个文件。

Scrapy 爬取流程

创建项目

前面已经提到了基本步骤。

创建Spider

Spider 是向己定义的类,Scrapy 用它来从网页里抓取内容,并解析抓取的结果。不过这个类必须继承 Scrapy 提供的 Spider scrapy.Spider,还要定义 Spider 的名称和起始请求,以及怎样处理爬取的结果的方法。

当然,一般常用命令行方法自动创建:
在这里插入图片描述
parse()方法中response参数即返回的响应。

创建Item

Item 是保存爬取数据的容器,它的使用方法和字典类似。不过,相比字典, Item 多了额外的保护机制,可以避免拼写错误或者定义字段错误。

创建 Item需要继承 scrapy.Item 类,并且定义类型为 scrapy.Field 字段。(观察目标网站,我们可以获取到的内容,变量关联上述字段)

打开 mySpider 目录下的 items.py,定义 Item ,此时将 items.py 修改如下:
在这里插入图片描述

解析Response

前面我们看到, 在parse ()方法中,我们可以直接对链接爬取得到的response 变量(参数)所包含的内容进行解析,比如浏览请求结果的网页源代码,或者进一步分析源代码内容,或者找出结果中的链接而得到下一个请求。

一般来说,网页中既有我们想要的结果,又有下一页的链接,这两部分内容我们都要进行处理。可通过CSS选择器、正则表达式或XPath提取我们想要的内容。

使用Item

上文定义了 Item ,接下来就要使用它了。 Item 可以理解为字典,不过在声明的时候需要实例化,然后依次用刚才解析的结果赋值 Item 的每一个字段, 后将 Item 返回即可。
在这里插入图片描述
图示:在Spider中使用Item,以及yiled生成器的使用

如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
Python yield 使用浅析

后续Request

从当前页面中找到信息来生成下一个请求,然后在下一个请求的页面里找到信息再构造再下以个请求。这样往复迭代,从而实现整站的爬取。

构造请求时需要用到 scrapy.Request 这里我们传递两个参数——url 和callback ,这两个参数的说明如下:
在这里插入图片描述
在这里插入图片描述
(一个追加Spider中爬取方法后的例子,这样爬虫能进入一个循环,直到最后一页。注意这个例子是针对每一页内容格式相同的情况!)

运行

# 进入目录,命令行输入命令
scrapy crawl quotes          # quotes为例子中爬虫的名字,注意不是项目名

# 然后就可以看到 Scrapy 运行结果了,其中还包含Scrapy版本号、settings.py配置、整个抓取过程的信息统计等信息

保存到文件

# Scrapy 提供的 Feed Exports 可以轻松将抓取结果输出

scrapy crawl quotes -o quotes.json   # 保存成 JSON 文件
scrapy crawl quotes -o quotes.jsonlines #(jsonlines=jl)每一个 Item 输出一行 JSON

# 输出格式还支持很多种,例如 csv xml pickle marsha 等,还支持 ftp(需正确配置),s3 等远程输出
# 另外还可以通过自定义 ItemExporter 来实现其他的输出

通过 Scrapy 提供的 Feed Export,我们可以轻松地输出抓取结果到文件。对于一些小型项目来说,这应该足够了。不过如果想要更复杂的输出,如输出到数据库等,我们可以使用 Item Pileline 完成。

使用Item Pipeline

Item Pipeline 为项目管道。当Item 生成后,它会自动被送到 Item Pipeline 进行处理。我们常用 ItemPipeline 来做如下操作:

  • 清理 HTML 数据
  • 验证爬取数据,检查爬取字段
  • 查重井丢弃重复内容
  • 将爬取结果保存到数据库

要实现 Item Pipeline 很简单,只需要定义一个类并实现 process item()方法即可。启用 Item Pipeline 后, Item Pipeline 会自动调用这个方法。 process item ()方法必须返回包含数据的字典或 Item 对象,或者抛出 Dropltem 异常

process_item ()方法有两个参数,一个参数是 item ,每次 Spider 生成的Item 都会作为参数传递过来。另一个参数是 spider ,就是 Spider 实例。

例子:
在这里插入图片描述
pipelines.py中,我们可以定义多个类,实现流水线中的不同工作。

前面提到,实现 Item Pipeline ,必须要定义 process item()方法。而除了它,还有其他方法供选择。比如open spider, 当Spider 开启时,这个方法被调用;close spider,当Spider关闭时,这个方法会调用等等方法。最主要的 process item()方法则执行了数据插入操作。

定义好Item Pipeline中的类后,我们需要在 settings.py 中使用它们。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u013598957/article/details/107369560