【Scrapy框架之CrawlSpider全站爬取】


提问: 如果想要快速爬取网站的全站数据,有几种实现方法?

  1. 基于Scrapy框架中 Spider 的递归爬取来实现(Request模块递归回调parse方法)
  2. 基于 CrawlSpider 的自动爬取来实现(更加高效简洁)

       CrawlSpiderSpider 的一个子类,除了继承了 Spider 的特性和功能外,还派生了其自己独有的更加强大的特性和功能。其中最为显著的功能就是 LinkExtractors:链接提取器Spider 是所有爬虫的基类,其设计原则只是为了爬取 start_url 列表中的网页,而对于从爬取到的网页中提取出url进行继续爬取的工作,使用 CrawlSpider 更为合适。

详解

使用命令 scrapy genspider -t crawl 爬虫名称 起始url 来创建一个基于CrawlSpider类的爬虫文件。

CrawlSpider 类与 Spider 类最大的不同就是前者多了一个 rules 属性,其作用是定义 提取动作。在 rules 中可以包含一个或多个 Rule 对象,在每个 Rule 对象中又包含一个 LinkExtractor 对象。

执行命令,生成的爬虫文件如下:

# -*- coding: utf-8 -*-
import scrapy

from scrapy.linkextractors import LinkExtractor
# LinkExtractor:链接提取器,用于提取起始url页面中符合匹配规则的链接

from scrapy.spiders import CrawlSpider, Rule
# CrawlSpider:是Spider的一个子类,除了继承了Spider的特性和功能外,还派生了自己独有的强大特性和功能
# Rule:规则解析器,用于将链接提取器提取到的链接对应的页面源码数据根据指定的解析方法(回调函数)进行解析


class Blog01Spider(CrawlSpider):  # 基于CrawlSpider类
    name = 'blog01'
    # allowed_domains = ['www.qiushibaike.com/pic']
    start_urls = ['http://www.qiushibaike.com/pic/']  # 起始url列表

    # rules:提取动作,指定不同规则的解析器,一个Rule对象表示一种提取规则
    rules = (
        Rule(link_extractor=LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
        # Rule:规则解析器
            # link_extractor:指定链接提取器
            # callback:指定解析数据的规则,即回调函数
            # follow:是否将链接提取器作用于该链接提取器提取到的链接对应的页面中,当callback为None时,此参数默认为True
    )


    # 解析方法
    def parse_item(self, response):
        i = {}
        #i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()
        #i['name'] = response.xpath('//div[@id="name"]').extract()
        #i['description'] = response.xpath('//div[@id="description"]').extract()
        return i



链接提取器 LinkExtractor

常用的参数如下:

  • allow 根据正则表达式提取链接,如果为空,则全部提取
  • deny 根据正则表达式 反向 提取链接
  • restrict_xpaths 根据xpath表达式提取链接
  • restrict_css 根据css表达式提取链接
  • deny_domains 不会被提取的链接的domains


规则解析器 Rule

常用的参数如下:

  • link_extractor 指定链接提取器
  • callback 指定解析数据的规则,即回调函数
  • follow 是否将链接提取器作用于该链接提取器提取到的链接对应的页面中
    当callback为None是,此参数默认为True
  • cb_kwargs 指定传递给回调函数的参数字典
  • process_links 是一个callable或string(该Spider中同名的函数将会被调用)
    从link_extrator中获取到链接列表时将会调用该函数。该方法主要是用来过滤
  • process_request 是一个callable或string(该spider中同名的函数都将会被调用)
    该规则提取到的每个request时都会调用该函数,该函数必须返回一个request或者None,用来过滤request



CrawlSpider整体爬取流程

扫描二维码关注公众号,回复: 5132566 查看本文章
  1. 爬虫文件获取起始url的网页内容
  2. 链接提取器根据指定的提取规则,对网页中的链接进行提取
  3. 规则解析器根据指定的解析规则,对链接提取器提取到的链接对应的页面进行解析
  4. 将解析后的数据封装到item对象中,然后提交给管道进行持久化存储
示例:爬取糗事百科糗图板块所有页码的数据

# -*- coding: utf-8 -*- 
import scrapy

from scrapy.linkextractors import LinkExtractor
# LinkExtractor:链接提取器,用来提取起始url页面中符合要求的链接

from scrapy.spiders import CrawlSpider, Rule
# CrawlSpider:是Spider的一个子类,除了继承了Spider的特性和功能外,还派生了其自己独有的强大特性和功能
# Rule:规则解析器,用于将链接提取器提取到的链接对应的页面源码数据根据指定的解析方法(回调函数)进行解析


class CrawldomeSpider(CrawlSpider):  # 基于CrawlSpider类
    name = 'crawlDome'
    start_urls = ['https://www.qiushibaike.com/pic/']

    # 链接提取器
    link1 = LinkExtractor(allow=r'/pic/$')  # 匹配第一页
    link2 = LinkExtractor(allow=r'/pic/page/\d+\?s=')  # 匹配所有页面
    # 链接提取器提取到的链接会“智能”的与起始url做拼接

    # rules:指定不同规则的解析器,一个Rule对象表示一种提取规则
    rules = (
        Rule(link_extractor=link1, callback='parse_item', follow=True),
        Rule(link_extractor=link2, callback='parse_item', follow=True),
        # Rule:规则解析器
            # link_extractor:指定链接提取器
            # callback:指定解析数据的规则,即回调函数
            # follow:是否将链接提取器作用于该链接提取器提取到的链接对应的页面中,当callback为None时,此参数的默认值为True
    )

    def parse_item(self, response):
        print(response)
        # 此时,我们便可以解析获取该网站的全站数据

猜你喜欢

转载自blog.csdn.net/qq_41964425/article/details/86499637