一、Scrapy简介

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。

其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。

二、架构概览

1. Scrapy Engine

引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。 详细内容查看下面的数据流(Data Flow)部分。此组件相当于爬虫的“大脑”,是整个爬虫的调度中心。

2. 调度器(Scheduler)

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

初始的爬取URL和后续在页面中获取的待爬取的URL将放入调度器中,等待爬取。同时调度器会自动去除重复的URL(如果特定的URL不需要去重也可以通过设置实现,如post请求的URL)

3. 下载器(Downloader)

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

4. Spiders

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

5. Item Pipeline

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

当页面被爬虫解析所需的数据存入Item后,将被发送到项目管道(Pipeline),并经过几个特定的次序处理数据,最后存入本地文件或存入数据库。

6. 下载器中间件(Downloader middlewares)

下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。通过设置下载器中间件可以实现爬虫自动更换user-agent、IP等功能。

7. Spider中间件(Spider middlewares)

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

8. 数据流(Data flow)

1) 引擎打开一个网站(open a domain),找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。

2) 引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。

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

4) 调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。

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

6) 引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。

7) Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。

8) 引擎将(Spider返回的)爬取到的Item给Item Pipeline,将(Spider返回的)Request给调度器。

9) (从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。

三、创建项目

在开始抓取之前,你必须建立一个新的零碎项目。输入要在其中存储代码并运行的目录:

创建了一个tutorial目录包含以下内容:

四、创建第一只sipder

爬行器是定义的类,Scrapy使用它从一个网站(或一组网站)中抓取信息。它们必须是子类 Spider 并定义要做出的初始请求,可选的是如何跟随页面中的链接,以及如何解析下载的页面内容以提取数据。
       创建第一只spider的代码。将其保存在tutorial/spiders 项目命名文件为quotes_spider.py中:

Spider子类 scrapy.Spider 并定义了一些属性和方法:

name :标识spider。它在一个项目中必须是唯一的,即不能为不同的爬行器设置相同的名称。

start_requests() :必须返回请求的可迭代(可以返回请求列表或编写生成器函数),爬行器将从该请求开始爬行。后续请求将从这些初始请求中相继生成。

parse() :将被调用以处理为每个请求下载的响应的方法。Response参数是 TextResponse 它保存页面内容,并具有进一步有用的方法来处理它。

这个 parse() 方法通常解析响应,将抓取的数据提取为字典,还查找要遵循的新URL并创建新请求 (Request )。

运行创建的sipder,此命令运行我们刚刚添加的spider quotes,这将发送一些 quotes.toscrape.com 领域。您将得到类似于以下内容的输出:

现在,检查当前目录中的文件。您应该注意到已经创建了两个新文件: quotes-1.html 和 quotes-2.HTML, 将各个URL的内容作为 parse 方法指示。

五、提取数据

scrappy提取数据的最佳方法是使用 Scrapy shell :

使用shell,可以尝试使用 CSS 对于响应对象:

要从上述标题中提取文本,可以执行以下操作:

这里有两件事需要注意:一是我们已经添加了 ::text 对于CSS查询,意味着我们只想直接选择内部的文本元素 <title> 元素。如果我们不指定 ::text ,我们将获得完整的title元素,包括其标记:

另一件事是呼叫的结果 .getall() 是一个列表:选择器可能返回多个结果,因此我们提取所有结果。只想要第一个结果时,如本例所示:

作为替代,可以写下:

使用 .get() 直接在A上 SelectorList 实例避免了 IndexError 回报 None 当它找不到任何与所选内容匹配的元素时。
       除 getall() 和 get() 方法以外,也可以使用 re() 提取方法 regular expressions :

除 CSS外 ,scrapy选择器也支持使用 XPath 表达

XPath表达式是非常强大的,是抓取选择器的基础。实际上,CSS选择器在引擎盖下转换为xpath。xpath表达式提供了更多的功能,因为除了导航结构之外,它还可以查看内容。使用xpath,您可以选择如下内容:*选择包含文本“下一页”*的链接,这使得xpath非常适合于抓取任务。

六、提取引用和作者

编写代码从网页中提取引号来完成spider程序。http://quotes.toscrape.com中的每个引号都由如下所示的HTML元素表示:

打开Scrapy Shell并提取所需数据:

得到了一个quote HTML元素的选择器列表,其中包括:

上面查询返回的每个选择器都允许对其子元素运行进一步的查询。将第一个选择器分配给一个变量,这样我们就可以直接在特定的引号上运行CSS选择器:

提取 text , author以及 tags,其中tags是字符串列表,我们可以使用 .getall() 方法获取所有这些参数:

提取每个位之后,迭代所有的quotes元素,并将它们放在Python字典中:

在spider中提取数据,使用 yield 回调response中的python关键字,如下所示:

存储抓取的数据,最简单方法是使用 Feed exports ,使用以下命令:

这将生成一个 quotes.json 包含所有抓取的项目的文件,序列化在 JSON 。

这个 -O 命令行开关覆盖任何现有文件;使用 -o 而是将新内容附加到任何现有文件中。但是,附加到JSON文件会使文件内容无效JSON。附加到文件时,请考虑使用不同的序列化格式,例如 JSON Lines ::

JSON Lines 类似于流,可以很容易地向它附加新记录。当运行两次时,它不存在相同的JSON问题。另外,由于每个记录都是单独的一行,可以处理大文件,而不必将所有内容都放入内存中,因此有如下工具: JQ以帮助在命令行中执行此操作。

从网站上所有页面的引用抓取内容。从页面中跟踪链接第一件事是提取到要跟踪的页面的链接。检查页面,可以看到有一个链接指向下一个带有以下标记的页面:

在外壳中提取:

获取到anchor元素,但需要该属性href ,Scrapy支持CSS扩展,允许选择属性内容,如下所示:

还有一个 attrib 可用属性

将spider被修改为递归地跟踪下一页的链接,从中提取数据:

在提取数据之后, parse() 方法查找到下一页的链接,并使用 urljoin() 方法(因为链接可以是相对的),并生成对下一页的新请求,将自身注册为回调,以处理下一页的数据提取,并保持爬行在所有页中进行。

scrapy的以下链接机制:在回调方法中生成一个请求时,scrapy将计划发送该请求,并注册一个回调方法,以便在该请求完成时执行。

使用它可以构建复杂的爬虫程序,这些爬虫程序根据定义的规则跟踪链接,并根据所访问的页面提取不同类型的数据。

示例中,创建了一种循环,跟踪到下一页的所有链接,直到找不到一个为止——这对于爬行博客、论坛和其他带有分页的站点很方便。

七、创建请求的快捷方式

作为创建请求对象的快捷方式,可以使用 response.follow ::

不像Scrapy.Request, response.follow 直接支持相对URL-无需调用URLJOIN。注意response.follow 只返回一个请求实例;仍然需要生成这个请求。
       也可以将选择器传递给 response.follow 而不是字符串;此选择器应提取必要的属性:

为了 <a> 元素有一个快捷方式: response.follow 自动使用其href属性。因此代码可以进一步缩短:

要从iterable创建多个请求,可以使用 response.follow_all 取而代之的是:

进一步缩短:

另一个spider,演示回调和以下链接,抓取作者信息:

这个spider将从主页开始,跟踪所有指向作者页面的链接,调用 parse_author 它们的回调,以及与 parse 像我们以前看到的那样回拨。

在这里,我们将回调传递给 response.follow_all 作为位置参数,以使代码更短;它还适用于 Request 。

这个 parse_author 回调定义了一个助手函数,用于从CSS查询中提取和清理数据,并用作者数据生成python dict。

这个spider展示的另一个有趣的事情是,即使同一作者引用了很多话,我们也不需要担心多次访问同一作者页面。默认情况下,scrapy过滤掉对已经访问过的URL的重复请求,避免了由于编程错误而太多地访问服务器的问题。这可以通过设置进行配置 DUPEFILTER_CLASS .

八、使用spider参数

通过使用 -a 运行它们时的选项:

这些论点被传给spider __init__ 方法并默认成为spider属性。
       在本例中,为 tag 参数将通过 self.tag 。可以使用它的spider只获取带有特定标记的引号,并基于以下参数构建URL::

如果你通过 tag=humor 对于这个spider,您会注意到它只访问来自 humor 标记,如 http://quotes.toscrape.com/tag/humor .

Scrapy介绍及入门相关推荐

  1. 崔老哥python scrapy爬虫框架入门

    Scrapy 爬虫框架入门案例详解 Scrapy入门 创建项目 创建Spider 创建Item 解析Response 使用Item 后续Request 保存到文件 使用Item Pipeline 源代 ...

  2. Python Scrapy中文教程,Scrapy框架快速入门!

    谈起爬虫必然要提起 Scrapy 框架,因为它能够帮助提升爬虫的效率,从而更好地实现爬虫. Scrapy 是一个为了抓取网页数据.提取结构性数据而编写的应用框架,该框架是封装的,包含 request ...

  3. linux scrapy 定时任务_2019Python学习教程(全套Python学习视频):Scrapy爬虫框架入门...

    Scrapy爬虫框架入门 Scrapy概述 Scrapy是Python开发的一个非常流行的网络爬虫框架,可以用来抓取Web站点并从页面中提取结构化的数据,被广泛的用于数据挖掘.数据监测和自动化测试等领 ...

  4. .NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(一)

    原文:.NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(一) 在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下F ...

  5. RStudio介绍及入门

    RStudio介绍及入门 1 R Studio 介绍 2 函数与对象 2.1 函数 2.2 数据输入 2.3 元素引用 3 R语言绘图 4 数据保存 5 学习建议 6 唠唠叨叨 Hello, 这里是行 ...

  6. 干货|以太坊全景介绍及入门学习路径(分享实录)

    2019独角兽企业重金招聘Python工程师标准>>> 本次分享主要是针对以太坊的基本概念的介绍,属于入门级别,主要目的是帮助大家快速认识和了解以太坊. 自我介绍 大纲 1 交易所那 ...

  7. Dubbo系列(一)dubbo介绍和入门

    Dubbo系列(一)dubbo介绍和入门 学习Dubbo 之前,先了解一下这几个问题: Dubbo是什么? 互联网发展的背景 Dubbo介绍 Dubbo的优势在哪里? 了解了dubbo之后,让我们从零 ...

  8. 7-Zip 解/压缩软件的介绍及入门使用

    7-Zip 解/压缩软件的介绍及入门使用 7-Zip中文官方网站 百度网盘地址: 链接:https://pan.baidu.com/s/16cO-qbNi2aINiKa8kOibFQ 提取码:CSDN ...

  9. Poco的介绍和入门教学

    Poco的介绍和入门教学 前言 前面我们已经介绍了基于图像识别的测试框架Airtest,通过图像识别,已经可以编写大部分的测试脚本.但是在某些特殊情况下,例如对于游戏或App里的动态元素,通过图像识别 ...

最新文章

  1. Docker 容器的网络连接
  2. 招聘一周 | 腾讯、华为、微软、中科院自动化所等12家公司热招职位汇总
  3. Java学习日报—Swagger介绍 与 布隆过滤器详解—2021/12/01
  4. 使用HTML5 WebStorage API构建与.NET对应的会话机制
  5. CloudStack 4.4+KVM之CloudStack配置过程
  6. Windows PowerShell | 错误: 740 需要提升权限才能运行 DISM
  7. reactos操作系统实现(109)
  8. HP喷墨打印机墨盒清零
  9. 【学习随记】Gyro,Btn,filters_addClass
  10. 鼠标悬浮图片上下颤抖的问题
  11. android dbm模式判断,手机信号强弱判断即【dBm/asu】知识普及
  12. 台式计算机启用时间查看,win7系统如何查看电脑的开关机时间想知道是否有他人使用...
  13. MathPage.wll not found
  14. SQL server SSMS图形界面实现(创建表、约束、关系图)
  15. 树莓派 Raspberry 4B 刷机、上网、录音外设、文件传输、电脑投屏问题汇总
  16. 没有躲过的坑--string中的c_str()陷阱
  17. 苹果展开新显示器带动高阶需求:Mini LED背光技术
  18. 技术人员如何写好一封邮件
  19. 【开源WebGIS】07-Openlayers+Vue 测量功能-02
  20. 我赌你没有了解过——Python 图像加密

热门文章

  1. JS 之 数据类型转换
  2. QTP自动化测试框架的基础知识
  3. hdu 2612(bfs)Find a way
  4. MVC核心功能组件和简介
  5. DirectShow学习
  6. python hello world重复_从hello world开始学Python
  7. 前端(一)——HTML之基本标签、图片标签、超链接、锚链接
  8. js 返回上一页面_构建大型 Vue.js 项目的10条建议
  9. 可视化日历(Java实现)
  10. 当前计算机领域中 有关计算机的性能指标,计算机文化基础真题(十七)