Scrapy介绍及入门

2023-11-05

 

 一、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 .

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scrapy介绍及入门 的相关文章

随机推荐

  • 第十七课,帧缓存(创建和使用方法)

    OpenGL允许我们定义我们自己的帧缓冲 也就是说我们能够定义我们自己的颜色缓冲 甚至是深度缓冲和模板缓冲 创建一个帧缓冲 1 创建一个帧缓冲对象 Framebuffer Object FBO 创建语法同VAO VBO unsigned i
  • C#实现DLT直接线性变换(Direct Linear Transform)算法

    C 实现DLT直接线性变换 Direct Linear Transform 算法 参考资料 1 武大版 工业测量技术与数据处理 P100 P106 2 转载博文 MATLAB实现DLT Direct Linear Transform 算法
  • 蓝桥杯每日一题(15):莱布尼茨计算圆周率(python)

    Topic 历史上有许多计算圆周率pai的公式 其中 格雷戈里和莱布尼茨发现了下面的公式 pai 4 1 1 3 1 5 1 7 参见图 这个公式简单而优美 但美中不足 它收敛的太慢了 如果我们四舍五入保留它的两位小数 那么 累积1项是 4
  • android Q支持的EAP方法配置

    1 supplicant external wpa supplicant 8 wpa supplicant android config CONFIG EAP MD5 y CONFIG EAP MSCHAPV2 y CONFIG EAP T
  • HTML <thead> 标签

    实例 带有 thead tbody 以及 tfoot 元素的 HTML 表格 table border 1 thead tr th Month th th Savings th tr thead tfoot tr td Sum td td
  • Tomcat多实例和负载均衡动静分离

    目录 一 Tomcat多实例部署 二 负载均衡动静分离 2 1 动静分离 2 11 nginx负载均衡 192 168 30 203 2 22 Tomcat服务器 192 168 30 200 2 23 Tomcat服务器 192 168
  • java g1垃圾收集器_深入理解G1垃圾收集器

    G1 GC是Jdk7的新特性之一 Jdk7 版本都可以自主配置G1作为JVM GC选项 作为JVM GC算法的一次重大升级 DK7u后G1已相对稳定 且未来计划替代CMS 所以有必要深入了解下 不同于其他的分代回收算法 G1将堆空间划分成了
  • Ubuntu22.10 安装微信方法

    Ubuntu22 10 安装微信方法 Ubuntu操作系统中 我尝试过用wine方式安装数次都没有能够启动成功 方法如下 在Ubuntu上安装微信需要使用Wine Wine是一款可以在Linux系统上运行Windows应用程序的兼容层 以下
  • 修改redis配置文件重新启动redis服务启动不了

    一 迁移一个新的配置文件 cat redis conf grep v grep v gt redis test conf 二 修改redis test conf配置 三 启动 redis server etc redis test conf
  • Springboot结合前端上传图片保存到数据库读取

    前言 最近在做一个前后端分离系统 也是闲的无聊做个好玩的练练手 就突然想着之前想了一天的问题 前端怎么去发送图片到后端保存 不是专业前端 轻点喷 图片到底是保存在本地还是存在oss上 保存图片的方式又是什么 这些问题想到我头皮发麻 最后 还
  • 学习经验分享之五:YOLOv5数据集划分以及YOLO格式转换

    问 题 有不少学YOLOv5算法的朋友咨询我 发现部分朋友犯了一个很大的错误 就是只是划分了训练集和验证集 没有测试集 并且没有意识到自己的实验设置是错误的 不科学的 这是非常可怕的 意味着可能前期的工作都白做了 浪费了宝贵的时间和精力 部
  • Linux——进程的四大特性

    一 进程的四大特性 竞争性 独立性 并行性 并发性 1 竞争性 系统进程数码众多 而CPU的资源只有固定的那些 很少 比如说CPU 一般情况下CPU只有一个 所以进程之间是具有竞争属性的 为了高效的完成任务 更合理竞争相关的资源 便具有了优
  • IT工程师学习方法和发展路线

    前言 从需求 即招聘 面试入手 了解行业所需 再到个人部分 学习大佬们的学习方法 书写自己的简历 提升自我技能 或通过考证锻炼学习的学习方法 或通过技能提高工作效率 简述几个方面的特点 梳理下发展路线 通过利器提高办公效率 Tips Mar
  • 区块链基于电商的发展

    区块链技术的发展现状 2008年10月31日 中本聪 Satoshi Nakamoto 的比特币白皮书正式发布 标 志着基于区块链技术的第一个应用比特币 一个去中心化的电子现金系统 正式诞生 这一应用的诞生向世人展示了区块链技术的巨大价值和
  • CLR Via 读书笔记

    CLR Via 读书笔记 第四章 类型基础 记录C 学习过程中的一些语法知识 2023 9 3 第四章 类型基础 点击跳转
  • Mathsphere Note: 好用的Markdown for Latex 文档编辑器

    背景描述 Markdown是一种轻量化的标记语言 非常适合于撰写技术博客类文档 而Markdown for Latex顾名思义 是在Markdown语法的基础上做了增量 适配了Latex的语法 能够对论文进行排版 本文将简要介绍一款Mark
  • JHipster介绍:一个适用于Java和JavaScript的全栈框架

    JHipster介绍 Java和JavaScript的全栈框架 JHipster是一个用于生成混合Java和JavaScript应用程序的成熟框架 它支持你所喜爱的开发工具 并提供监控和其他开箱即用的管理功能 JHipster是一个历史悠久
  • 数据库中几种易混淆的字符串类型

    目录 1 char 2 nchar 3 varchar 4 nvarchar 总结 在数据库中有char varchar nchar nvarchar等几种类型 其中这四种非常类似 但表示的意义稍有不同 1 char char 是普通字符编
  • 解决cv2没有face模块

    人脸识别报错解决 AttributeError module cv2 cv2 has no attribute face 人脸识别报错如下 AttributeError module cv2 cv2 has no attribute fac
  • Scrapy介绍及入门

    一 Scrapy简介 Scrapy是一个为了爬取网站数据 提取结构性数据而编写的应用框架 可以应用在包括数据挖掘 信息处理或存储历史数据等一系列的程序中 其最初是为了页面抓取 更确切来说 网络抓取 所设计的 也可以应用在获取API所返回的数