Scrapy框架的使用之Spider的用法

在Scrapy中,要抓取网站的链接配置、抓取逻辑、解析逻辑里其实都是在Spider中配置的。在前一节实例中,我们发现抓取逻辑也是在Spider中完成的。本节我们就来专门了解一下Spider的基本用法。

1. Spider运行流程

在实现Scrapy爬虫项目时,最核心的类便是Spider类了,它定义了如何爬取某个网站的流程和解析方式。简单来讲,Spider要做的事就是如下两件:

  • 定义爬取网站的动作;
  • 分析爬取下来的网页。

对于Spider类来说,整个爬取循环过程如下所述:

  • 以初始的URL初始化Request,并设置回调函数。当该Request成功请求并返回时,Response生成并作为参数传给该回调函数。
  • 在回调函数内分析返回的网页内容。返回结果有两种形式。一种是解析到的有效结果返回字典或Item对象,它们可以经过处理后(或直接)保存。另一种是解析得到下一个(如下一页)链接,可以利用此链接构造Request并设置新的回调函数,返回Request等待后续调度。
  • 如果返回的是字典或Item对象,我们可通过Feed Exports等组件将返回结果存入到文件。如果设置了Pipeline的话,我们可以使用Pipeline处理(如过滤、修正等)并保存。
  • 如果返回的是Reqeust,那么Request执行成功得到Response之后,Response会被传递给Request中定义的回调函数,在回调函数中我们可以再次使用选择器来分析新得到的网页内容,并根据分析的数据生成Item。

通过以上几步循环往复进行,我们完成了站点的爬取。

2. Spider类分析

在上一节的例子中,我们定义的Spider是继承自scrapy.spiders.Spiderscrapy.spiders.Spider这个类是最简单最基本的Spider类,其他Spider必须继承这个类。还有后面一些特殊Spider类也都是继承自它。

scrapy.spiders.Spider这个类提供了start_requests()方法的默认实现,读取并请求start_urls属性,并根据返回的结果调用parse()方法解析结果。它还有如下一些基础属性:

  • name。爬虫名称,是定义Spider名字的字符串。Spider的名字定义了Scrapy如何定位并初始化Spider,它必须是唯一的。不过我们可以生成多个相同的Spider实例,数量没有限制。name是Spider最重要的属性。如果Spider爬取单个网站,一个常见的做法是以该网站的域名名称来命名Spider。例如,Spider爬取mywebsite.com,该Spider通常会被命名为mywebsite。
  • allowed_domains。允许爬取的域名,是可选配置,不在此范围的链接不会被跟进爬取。
  • start_urls。它是起始URL列表,当我们没有实现start_requests()方法时,默认会从这个列表开始抓取。
  • custom_settings。它是一个字典,是专属于本Spider的配置,此设置会覆盖项目全局的设置。此设置必须在初始化前被更新,必须定义成类变量。
  • crawler。它是由from_crawler()方法设置的,代表的是本Spider类对应的Crawler对象。Crawler对象包含了很多项目组件,利用它我们可以获取项目的一些配置信息,如最常见的获取项目的设置信息,即Settings。
  • settings。它是一个Settings对象,利用它我们可以直接获取项目的全局设置变量。

除了基础属性,Spider还有一些常用的方法:

  • start_requests()。此方法用于生成初始请求,它必须返回一个可迭代对象。此方法会默认使用start_urls里面的URL来构造Request,而且Request是GET请求方式。如果我们想在启动时以POST方式访问某个站点,可以直接重写这个方法,发送POST请求时使用FormRequest即可。
  • parse()。当Response没有指定回调函数时,该方法会默认被调用。它负责处理Response,处理返回结果,并从中提取出想要的数据和下一步的请求,然后返回。该方法需要返回一个包含Request或Item的可迭代对象。
  • closed()。当Spider关闭时,该方法会被调用,在这里一般会定义释放资源的一些操作或其他收尾操作。

3. 结语

以上内容可能不太好理解。不过不用担心,后面会有很多使用这些属性和方法的实例。通过这些实例,我们慢慢熟练掌握它们。

原文发布于微信公众号 - 进击的Coder(FightingCoder)

原文发表时间:2018-05-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小白的技术客栈

两个微型的函数例子

hello小伙伴们大家好,还记得昨天的函数参数的文章吗?你get到了多少呢?实际的工作中并没有那么复杂,一个通用的函数定义形如: def func_name(*...

3395
来自专栏Python攻城狮

Python网络爬虫(四)- XPath1.XPath2.XPath在python中的应用

XPath 即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。它使用路径表达式来选取 XML 文档中的节点...

2164
来自专栏Petrichor的专栏

git: .gitignore文件 (忽略文件)

Note: 切记目录名后面 一定要加 反斜杠 / ,不然会当成 单文件 处理。

1812
来自专栏木宛城主

Unity应用架构设计(10)——绕不开的协程和多线程(Part 2)

在上一回合谈到,客户端应用程序的所有操作都在主线程上进行,所以一些比较耗时的操作可以在异步线程上去进行,充分利用CPU的性能来达到程序的最佳性能。对于Unit...

40011
来自专栏崔庆才的专栏

Scrapy框架的使用之Scrapy通用爬虫

3146
来自专栏蓝天

细节决定品质:不良的if/else使用习惯

这个时候应当考虑提取成函数调用,以减少直接的if/else嵌套层次。同理,while/for也应当避免这种情况。

951
来自专栏python学习路

三、scrapy后续 LinkExtractorsrules Logging发送POST请求内置设置参考手册

CrawlSpiders 通过下面的命令可以快速创建 CrawlSpider模板 的代码: scrapy genspider -t crawl tencent ...

5494
来自专栏用户2442861的专栏

ubuntu less分页查看log文件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haluoluo211/article/details...

1382
来自专栏IMWeb前端团队

Nodejs进阶:如何将图片转成datauri嵌入到网页中去

本文作者:IMWeb 陈映平 原文出处:IMWeb社区 未经同意,禁止转载 问题:将图片转成datauri 今天,在QQ群有个群友问了个问题:“nod...

1998
来自专栏jeremy的技术点滴

Retrying_Library_For_Java

3335

扫码关注云+社区

领取腾讯云代金券