爬虫工作量由小到大的思维转变---<第三十六章 Scrapy 关于CrawlSpider引发的议题>
2023-12-31 15:48:24
前言:
因为scrapy-redis里面有两个spider,一个basespider,一个crawlspider;有人分不清他们的区别;本文就来掰一掰他们的事;
正文:
`CrawlSpider` 和 `Spider` 是两个不同的爬虫类,具有以下区别:
- 1. `Spider` 类:`Spider` 是 Scrapy 中最基本的爬虫类。你可以从 `scrapy.Spider` 类派生出自定义的爬虫类。在基本的 `Spider` 类中,你需要定义 `start_urls` 和 `parse` 方法来指定起始 URL 和解析响应的逻辑。`Spider` 类提供了基础的请求发送和响应处理功能,并在需要时提供了回调函数来处理解析和处理响应的逻辑。
- 2. `CrawlSpider` 类:`CrawlSpider` 是 Scrapy 提供的高级爬虫类之一,它是基于 `Spider` 类的扩展。`CrawlSpider` 类提供了更方便的机制用于定义和跟踪规则(rules),使得爬取复杂网站的操作更加简单。通过在 `CrawlSpider` 类中定义 `rules` 属性和回调函数,你可以指定抓取页面的链接和数据提取规则。`CrawlSpider` 能够自动根据规则解析链接并深度优先进行爬取。
`Spider` 类是 Scrapy 中最基本的爬虫类,提供了处理请求和解析响应的基本功能。而 `CrawlSpider` 类是基于 `Spider` 类的扩展,提供了更方便的机制用于定义和跟踪规则,使得爬取复杂网站的操作更加简单。如果你的爬虫需要根据特定的规则进行链接提取和页面抓取,`CrawlSpider` 类可能是更适合的选择。但如果你只需要简单的页面抓取和数据提取,`Spider` 类已经足够了。
------------也就是说,最大的区别就是个rules!!
那么,
rules的优势在哪?
- 当使用 CrawlSpider 类和 rules 规则时,能够更方便地定义和管理页面的抓取规则,从而简化爬虫的编写和维护过程。
- 相比于不使用 CrawlSpider 和 rules 的情况,使用规则的优势包括规则的自动化处理、链接提取、跟进和页面的解析,减少了手动编写大量重复代码的工作量。
案例:
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class QuotesCrawler(CrawlSpider):
name = "quotes_crawler"
start_urls = ["http://quotes.toscrape.com/"]
allowed_domains = ["quotes.toscrape.com"]
rules = (
Rule(LinkExtractor(restrict_xpaths="//a[@class='tag']"), follow=True),
Rule(LinkExtractor(restrict_xpaths="//div[@class='quote']/span/a"), callback='parse_quote'),
)
def parse_quote(self, response):
quote = {
'text': response.xpath("//h1/text()").get(),
'author': response.xpath("//h3/text()").get(),
'tags': response.xpath("//div[@class='tags']/a/text()").getall(),
}
yield quote
案例讲解:
我们创建了一个名为 QuotesCrawler 的爬虫类,继承自 CrawlSpider。我们的目标是爬取名言网站(http://quotes.toscrape.com/)上的名言和标签。
- start_urls:起始 URL,设置为名言网站的首页。
- allowed_domains:限制爬虫只在该域名下进行爬取。
- rules:定义了两个规则。
- 第一个规则使用 LinkExtractor 和 restrict_xpaths,提取标签页面的链接,并通过 follow=True 让爬虫跟进这些链接。
- 第二个规则使用 LinkExtractor 和 restrict_xpaths,提取名言详情页面的链接,并通过 callback='parse_quote' 指定回调函数处理这些页面。
- parse_quote:作为回调函数,解析名言详情页面的响应,提取名言的文本、作者和标签,并以字典形式返回。
通过使用 CrawlSpider 和 rules,我们只需定义规则和回调函数,而无需编写大量的链接提取和跟进的代码。这样,Scrapy 会自动根据规则进行页面抓取和处理,大大减少了编写重复代码的工作量。同时,当网站结构变化时,我们只需修改规则,而不是整个爬虫逻辑。
--------也就是说,crawlspider的一个rules能减少抓取数据的代码量,方便管理;补:可能前些年还好,现在越来越多的网站开始各种css渲染/js渲染生成页面数据,你真用rules去搞,抓出来的好多都牛头不对马嘴; ?
延伸一个知识点:
链接跟进(启用 `follow=True`)的优劣势:
-
- 优点:
-
? - 抓取更多页面:链接跟进可以使爬虫抓取到更多相关的页面,尤其是对于有关联关系的页面,如列表页和详情页。
-
? - 递归爬取:通过跟进链接,可以实现递归爬取,深入地获取更多内容和数据。
-
? - 更新抓取的数据:可以通过跟进链接来确保已经抓取的数据保持更新,捕捉最新的内容和评论。
-
? - 避免遗漏数据:某些网站可能在列表页中提供部分内容,启用链接跟进可确保获取到完整的页面内容,避免遗漏重要数据。
-
-
- 缺点:
-
? - 更多网络请求和数据抓取:跟进链接会导致爬虫抓取更多的页面,增加网络带宽和处理资源的消耗。
-
? - 可能会抓取无关页面:如果抓取的页面没有足够的筛选条件,可能会抓取到无关的页面,导致数据冗余或混乱。
-
-
不启用链接跟进(将 `follow=False` 或不进行配置):
-
- 优点:
-
? - 简化抓取逻辑:不启用链接跟进可简化爬虫的抓取逻辑,只关注初始页面上的数据获取。
-
? - 控制抓取规模:不启用链接跟进可以控制抓取的深度和规模,避免抓取过多的页面。
-
-
- 缺点:
-
? - 只能抓取初始页面:不启用链接跟进会限制爬虫仅抓取初始页面上的数据,可能会错过与页面相关的其他内容。
-
? - 需要手动编写更多代码:不启用链接跟进需要手动编写代码来处理额外的链接和页面获取,增加工作量。
-
----这里想说的是,最好别链接! 链了感觉抓全了,你稍微一个不注意,抓一堆广告下来;徒增了负载...能手写,尽量手写~ 当然,你做搜索引擎,可是适当跟进,反正你服务器容量大,随便搞呗,宁可错抓1000不能放错一个.对吧...
文章来源:https://blog.csdn.net/m0_56758840/article/details/135315771
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!