【Scrapy框架之CrawlSpider全站爬取】 𓄛

原文:
http://blog.gqylpy.com/gqy/369



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

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

???????CrawlSpider 是 Spider 的一个子类,除了继承了 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整体爬取流程

  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)
        # 此时,我们便可以解析获取该网站的全站数据

原文:
http://blog.gqylpy.com/gqy/369

原文地址:https://www.cnblogs.com/mypath1/p/11405254.html

时间: 2024-10-04 04:55:43

【Scrapy框架之CrawlSpider全站爬取】 𓄛的相关文章

【Scrapy框架之CrawlSpider全站爬取】--2019-08-06 15:17:42

原创链接: http://106.13.73.98/__/144/ 起 提问: 如果想要快速爬取网站的全站数据,有几种实现方法? 基于Scrapy框架中 Spider 的递归爬取来实现(Request模块递归回调parse方法) 基于 CrawlSpider 的自动爬取来实现(更加高效简洁) ???????CrawlSpider 是 Spider 的一个子类,除了继承了 Spider 的特性和功能外,还派生了其自己独有的更加强大的特性和功能.其中最为显著的功能就是 LinkExtractors:

爬虫 + 数据分析 - 7 CrawlSpider(全站爬取), 分布式, 增量式爬虫

一.全站爬取(CrawlSpider) 1.基本概念 作用:就是用于进行全站数据的爬取 - CrawlSpider就是Spider的一个子类 - 如何新建一个基于CrawlSpider的爬虫文件 - scrapy genspider -t crawl xxx www.xxx.com - LinkExtractor连接提取器:根据指定规则(正则)进行连接的提取 - Rule规则解析器:将链接提取器提取到的链接进行请求发送,然后对获取的页面数据进行 指定规则(callback)的解析 - 一个链接提

爬虫(十七):Scrapy框架(四) 对接selenium爬取京东商品数据

1. Scrapy对接Selenium Scrapy抓取页面的方式和requests库类似,都是直接模拟HTTP请求,而Scrapy也不能抓取JavaScript动态谊染的页面.在前面的博客中抓取JavaScript渲染的页面有两种方式.一种是分析Ajax请求,找到其对应的接口抓取,Scrapy同样可以用此种方式抓取.另一种是直接用 Selenium模拟浏览器进行抓取,我们不需要关心页面后台发生的请求,也不需要分析渲染过程,只需要关心页面最终结果即可,可见即可爬.那么,如果Scrapy可以对接S

爬虫5 scrapy框架2 全站爬取cnblogs, scarpy请求传参, 提高爬取效率, 下载中间件, 集成selenium, fake-useragent, 去重源码分析, 布隆过滤器, 分布式爬虫, java等语言概念补充, bilibili爬视频参考

1 全站爬取cnblogs # 1 scrapy startproject cnblogs_crawl # 2 scrapy genspider cnblogs www.cnblogs.com 示例: # cnblogs_crawl/cnblogs_crawl/spiders/cnblogs.py import scrapy from cnblogs_crawl.items import CnblogsCrawlItem from scrapy.http import Request class

scrapy框架之CrawlSpider

提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基于CrawlSpider的自动爬取进行实现(更加简洁和高效). 一,介绍 CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能外,还派生除了其自己独有的更加强大的特性和功能.其中最显著的功能就是”LinkExtractors链接提取器“.Spider是所有爬虫的基类

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

目录 Python网络爬虫之Scrapy框架(CrawlSpider) CrawlSpider使用 爬取糗事百科糗图板块的所有页码数据 Python网络爬虫之Scrapy框架(CrawlSpider) 提问:如果想要通过爬虫程序去爬取"糗百"全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基于CrawlSpider的自动爬取进行实现(更加简洁和高效). CrawlSpider使

爬虫学习 16.Python网络爬虫之Scrapy框架(CrawlSpider)

爬虫学习 16.Python网络爬虫之Scrapy框架(CrawlSpider) 引入 提问:如果想要通过爬虫程序去爬取"糗百"全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基于CrawlSpider的自动爬取进行实现(更加简洁和高效). 今日概要 CrawlSpider简介 CrawlSpider使用 基于CrawlSpider爬虫文件的创建 链接提取器 规则解析器 今日详

Scrapy 通过登录的方式爬取豆瓣影评数据

Scrapy 通过登录的方式爬取豆瓣影评数据 爬虫 Scrapy 豆瓣 Fly 由于需要爬取影评数据在来做分析,就选择了豆瓣影评来抓取数据,工具使用的是Scrapy工具来实现.scrapy工具使用起来比较简单,主要分为以下几步: 1.创建一个项目 ==scrapy startproject Douban 得到一个项目目录如下: ├── Douban │   ├── init.py │   ├── items.py │   ├── pipelines.py │   ├── settings.py

全站爬取cnblogs

全站爬取cnblogs 创建 """ # 1 scrapy startproject cnblogs_crawl # 2 scrapy genspider cnblogs www.cnblogs.com """ 代码演示 """ # -*- coding: utf-8 -*- import scrapy from cnblogs_crawl.items import CnblogsCrawlItem from scr