专栏首页喵叔's 专栏Scrapy 爬虫模板--CrawlSpider

Scrapy 爬虫模板--CrawlSpider

从这篇文章开始,我将利用三篇文章分别讲解 Scrapy 爬虫模板。 Scrapy 爬虫模板包含四个模板:

  1. Basic :最基本的模板,这里我们不会讲解;
  2. CrawlSpider
  3. XMLFeedSpider
  4. CSVFEEDSpider

这篇文章我先来讲解一下 CrawlSpider 模板。

零、讲解

CrawlSpider 是常用的 Spider ,通过定制规则来跟进链接。对于大部分网站我们可以通过修改规则来完成爬取任务。 CrawlSpider 常用属性是 rules* ,它是一个或多个 Rule 对象以 tuple 的形式展现。其中每个 Rule 对象定义了爬取目标网站的行为。

Tip:如果有多个 Rule 对象命中同一个链接,那么只有第一个 Rule 对象生效。

我们来看一下 Role 的语法:

Rule(link_extractor [,callback = None] [,cb_kwargs = None] [,follow = None] [,process_links = None] [,process_request = None])

参数解析:

  • link_extractor:Link Extrator 对象,是一个正则表达式。主要定义了从网页中提取哪些元素作为继续跟进的链接;
  • callback:回调函数,也可以是回调函数的字符串名。接收 Response 作为参数,返回包含 Item 或者 Request 对象列表;
  • cb_kwargs:字典类型的对象,传递给回调函数的参数;
  • follow:是否根据这个 Rule 的 link_extractor 从 Response 中提取链接;
  • process_links:回调函数,也可以是回调函数的字符串名。从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤;
  • process_request:回调函数,也可以是回调函数的字符串名。用来过滤 Request ,该规则提取到每个 Request 时都会调用该函数。

一、案例

这个案例我们爬取的是名人名言网站,我们需要做的是提取名言内容、作者姓名和标签,然后通过作者链接进入到作者介绍的页面,最后我们爬取的作者的详细信息。

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor


class Quotes(CrawlSpider):
    name = "quotes"
    allow_domain = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com']

    rules = (
        Rule(LinkExtractor(allow='/page/\d+'), callback='parse_quotes', follow=True),
        Rule(LinkExtractor(allow='/author/\w+_'), callback='parse_author')
    )

    def parse_quotes(self, response):
        for quote in response.css('.quote'):
            yield {
                'content': quote.css('.text::text').extract_first(),
                'author': quote.css('.author::text').extract_first(),
                'tags': quote.css('.tag::text').extract()
            }

    def parse_author(self, response):
        name = response.css('.author-title::text').extract_first()
        author_born_date = response.css('.author_born_date::text').extract_first()
        author_description = response.css('.author_description::text').extract_first()
        return ({
            'name': name,
            'author_born_date': author_born_date,
            'author_description': author_description
        })
        import scrapy
        from scrapy.spiders import CrawlSpider, Rule
        from scrapy.linkextractors import LinkExtractor


        class Quotes(CrawlSpider):
            name = "quotes"
            allow_domain = ['quotes.toscrape.com']
            start_urls = ['http://quotes.toscrape.com']

            rules = (
                Rule(LinkExtractor(allow='/page/\d+'), callback='parse_quotes', follow=True),
                Rule(LinkExtractor(allow='/author/\w+_'), callback='parse_author')
            )

            def parse_quotes(self, response):
                for quote in response.css('.quote'):
                    yield {
                        'content': quote.css('.text::text').extract_first(),
                        'author': quote.css('.author::text').extract_first(),
                        'tags': quote.css('.tag::text').extract()
                    }

            def parse_author(self, response):
                name = response.css('.author-title::text').extract_first()
                author_born_date = response.css('.author_born_date::text').extract_first()
                author_description = response.css('.author_description::text').extract_first()
                return ({
                    'name': name,
                    'author_born_date': author_born_date,
                    'author_description': author_description
                })

上述代码中 Rule(LinkExtractor(allow='/page/\d+'), callback='parse_quotes', follow=True),代码段定义了爬取所有名人名言页的规则,即只要符合 /page/\d+的所有链接就被视为名人名言页,然后我们调用 parse_quotes 方法提取相关数据。 在 Rule(LinkExtractor(allow='/author/\w+_'), callback='parse_author')代码段中我们定义了爬取作者信息页的规则,即只要符合 /author/\w+_的所有链接就被视为作者信息页,之后我们调用 parse_author 方法提取相关数据。 )代码段中我们定义了爬取作者信息页的规则,即只要符合/author/\w+_```的所有链接就被视为作者信息页,之后我们调用 parse_author 方法提取相关数据。

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 利用 IComparable<T> 以及 IComparer<T> 定义顺序关系

    我们都知道,在开发中如果想把某个类型的对象放入集合中执行排序和搜索功能,就需要定义出来对象与对象之间的关系。那么你知道怎么样定义对象关系才是正确的吗?下面就听我...

    喵叔
  • C# 事件

    使用委托的时候通常会出现两个角色,分别是广播者和订阅者。广播者包含委托字段,通过调用委托来决定何时进行广播。订阅者是方法目标的接收者,订阅者决定什么时候开始监听...

    喵叔
  • Scrapy 爬虫模板--CSVFeedSpider

    这一篇文章我要讲解一下 Scrapy 爬虫模板中的 CSVFeedSpider 模板,该模板可以说是目前 Scrapy 中最简单的模板,因此这篇文章不会有太长的...

    喵叔
  • 在WordPress 文章未尾自动添加一个作者信息框

    如果想在WordPress文章的未尾,添加文章作者的相关信息,下面一段代码可以帮助方便在文章中添加一个作者的信息框。

    赵帆同学GXUZF.COM
  • laravel 解决paginate查询多个字段报错的问题

    以上这篇laravel 解决paginate查询多个字段报错的问题就是小编分享给大家的全部内容了,希望能给大家一个参考。

    砸漏
  • mysql 查询用法

    #去重复查询DISTINCT mysql> select * from student; +------+------+------+ | uid | nam...

    零月
  • Power Pivot智能日期运用——当前初始日期/当前结束日期

    逍遥之
  • 分布式锁的多种实现方式

    目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一...

    哲洛不闹
  • 分布式锁的多种实现方式

    目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一...

    lyb-geek
  • Spring Data JPA主键采用UUID策略

    Happyjava

扫码关注云+社区

领取腾讯云代金券