爬虫工作量由小到大的思维转变---<第三十六章 Scrapy 关于CrawlSpider引发的议题>

发布时间:2023年12月31日

前言:

因为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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。