17 Scrapy内置爬虫CrawlSpider和Spider的差异、使用正则分析链接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了17 Scrapy内置爬虫CrawlSpider和Spider的差异、使用正则分析链接相关的知识,希望对你有一定的参考价值。

参考技术A 切换目录到项目工程文件夹:命令行中输入

返回结果:

创建一个crawlspider
cd到项目工程的目录以后,输入以下命令:

例如

运行结果

工程目录下出现了一个 ganji.2.py

文件内部是这样的

在这里面的start_url应该自行操作改成自己想要爬取的网页。

创建basic类型的spider

创建完成以后,项目spider目录下多了一个tmp.py的文件。
同样是使用命令来新建爬虫,但是里面和上述的crawlspider相比还是少了几样东西。

在crawlspider中,是parse_item方法,而且在函数中是不允许你重写parse函数的,否则可能会出现异常。
在官方文档中,crawlspider是爬取有规律的网站内容。

cd到项目文件夹下,输入 scrapy shell 网址 例如

返回结果:

再把分析链接的模块导入进来:

输入以下命令,他会把页面里所有的链接都有提取出来:

都取出来了,很恐怖。
使用正则过滤下就能拿到需要的链接了。在明确链接样式的情况下才能进行正则表达式的设计。

输入:

输出的链接明显少了

这出来的一个一个链接是LinkExtractor提取出来的,但是如果写进RULES里面去,就会直接把链接爬上来,
打开Pycharm工程,把Rule里面的正则条件替换成

但是这一步要规定回调函数,这里面设置成的是parse_item,parse_item会自动获取这个链接的response。那如果想查询刚才的url呢,要使用 response.url 才能得到链接。

CrawlSpider继承最基础的Spider,所以Spider有的方法和属性,CrawlSpider全部具备。
CrawlSpider别于Spider的特性是多了一个rules参数,其作用是定义提取动作,可以快速的检索符合正则的路由,并非常方便的回调到函数中。

1、 follow 是一个布尔(boolean)值,指定了根据该规则从response提取的链 接是否需要跟进。如果 callback 为 None , follow 默认设置为 True ,否则默认为 False 。 follow 默认设置为 True 时候,会一直跟进爬取此链接打开的页面的response的符合规则的链接。
注意:如果不写 callback 也不写 follow 的话,表示 follow 默认跟进,至于要将拿到的链接重新打开,根据规则再提取里面的链接,如果里面的链接触发了某个支持 callback 的规则,那么再传到 callback 对应的函数里进行提取。

2、 rules :一个包含一个(或多个) Rule 对象的集合(list)。 每个 Rule 对爬取网站的动作定义了特定表现。 Rule 对象在下边会介绍。 如果多个 rule 匹配了相同的链接,则根据他们在本属性中被定义的顺序,第一个会被使用。
3、 URL 链接提取的类 LinkExtractor ,主要参数为:
allow :满足括号中“正则表达式”的值会被提取,如果为空,则全部 匹配。 deny :与这个正则表达式(或正则表达式列表)不匹配的URL一定不 提取。
allow_domains :会被提取的链接的 domains 。
deny_domains :一定不会被提取链接的 domains 。
restrict_xpaths :使用 xpath 表达式,和 allow 共同作用过滤链接。还有一个类似的restrict_css

当编写CrawlSpider爬虫规则时,请避免使用 parse 作为回调函数。由于 CrawlSpider 使用 parse 方法来实现其逻辑,如果您覆盖了 parse 方
法,Crawlspider 将会运行失败。涉及的示例:

另外如果需要转码到json,可以使用如下语句

Scrapy爬虫框架---CrawlSpider类

(1)、简介

在糗事百科爬虫中我们的爬虫是继承scrapy.Spider类的,这也是基本的scrapy框架爬虫,在这个爬虫中我们自己在解析完整个页面后再获取下一页的url,然后重新发送了一个请求,而使用CrawlsSpider类可以帮助我们对url提出条件,只要满足这个条件,都进行爬取,CrawlSpider类继承自Spider,它比之前的Spider增加了新功能,即可以定义url的爬取规则,而不用手动的yield Request。

技术分享图片

(2)、创建CrawlSpider爬虫

scrapy genspider -t crawl + 爬虫名 + 主域名

(3)、CrawlSpider中的主要模块介绍

1、LinkExtractors链接提取器(找到满足规则的url进行爬取)

class crapy.linkextractors.lxmlhtml.LxmlLinkExtractor(allow=(), deny=(), allow_domains=(), deny_domains=(), deny_extensions=None, restrict_xpaths=(), restrict_css=(), tags=(‘a‘, ‘area‘), attrs=(‘href‘, ), canonicalize=True, unique=True, process_value=None)

主要参数介绍:

allow:允许的url,所有满足这个正则表达式的url都会被提取

deny:禁止的url,所有满足这个正则表达式的url都不会被提取

allow_domains:允许的域名,在域名中的url才会被提取

deny_domains:禁止的域名,在域名中的url不会被提取

restrict_xpaths:使用xpath提取

restrict_css:使用css提取

2、Rule规则类

 class scrapy.contrib.spiders.Rule(link_extractor,callback=None,cb_kwargs=None,follow=None,process_links=None,process_request=None)

主要参数介绍:

link_extractor:一个LinkExtractor对象,用来定义爬取规则

callback:回调函数

follow:从response中提取的url如满足条件是否进行跟进

process_links:从link_extractor中获取到的链接首先会传递给该函数,主要用来过滤掉无用的链接

(4)、实验(微信小程序社区爬虫)

1、目标站点选取(http://www.wxapp-union.com/portal.php?mod=list&catid=2&page=1)

技术分享图片

2、创建项目和爬虫

scrapy startproject weixin_app---cd weixin_app---scrapy genspider -t crawl spider wxapp-union.com

技术分享图片

观察一下发现spider.py文件已改变了

技术分享图片

3、编写代码

改写settings.py

禁止遵循robots协议

技术分享图片

设置请求头

技术分享图片

设置爬取延迟

技术分享图片

开启pipeline

技术分享图片

改写items.py

技术分享图片

改写pipeline.py

技术分享图片

改写spiders.py

技术分享图片

技术分享图片

(5)、运行效果展示(只贴出了第一条数据)

技术分享图片

(6)、总结

1、CrawlSpider主要使用LinkExtractor 和 Rule

2、注意事项:allow设置方法:限定在我们想要的url上,不要与其他url产生相同的正则表达式,follow设置方法:在爬取页面的时候需要将满足条件的url进行跟进,设置为True,callback设置方法:在获取详情信息的页面需指定callback,而对于只要获取url,而不要具体数据的情况则不需要指定该参数。

 

以上是关于17 Scrapy内置爬虫CrawlSpider和Spider的差异、使用正则分析链接的主要内容,如果未能解决你的问题,请参考以下文章

Scrapy爬虫进阶crawlspider类的使用

如何阻止 Scrapy CrawlSpider 跟踪比要求更多的 URL?

scrapy爬虫框架-CrawlSpider

Scrapy - CrawlSpider爬虫

Python网络爬虫之Scrapy框架(CrawlSpider)

18python网路爬虫之Scrapy框架中的CrawlSpider详解