Scrapy框架--CrawlSpider (详解+例子)

news2024/11/17 8:48:49

目录

CrawlSpider

简介

基本运行

 特性和概念

基本使用

创建CrawlSpider

 运行 

 使用CrawlSpider中核心的2个类对象

Rule对象

LinkExtractors 

作用

使用

查看效果-shell中验证 

示例

注意


CrawlSpider

简介

CrawlSpider 是 Scrapy 框架提供的一个特殊的 Spider 类型,在Scrapy中Spider是所有爬虫的基类,而CrawSpiders就是Spider的派生类,用于处理那些需要遵循特定规则和链接提取的网站。它是基于广度优先算法构建的,可以自动发现并跟踪网页上的链接,并根据预定义的规则提取数据。

CrawlSpider 提供了一种更高级的方法来定义爬取规则,而无需编写大量的重复代码。它基于规则系统工作,其中每个规则由一个或多个链接提取器(LinkExtractor)和一个回调函数(callback)组成。规则定义了要提取的链接和如何处理这些链接的方法。

基本运行

适用于先爬取start_url列表中的网页,再从爬取的网页中获取link并继续爬取的工作。

 特性和概念

  1. 链接提取器(LinkExtractor):链接提取器用于从网页中提取链接。CrawlSpider 提供了几种内置的链接提取器,如基于正则表达式、基于 CSS 选择器、基于 XPath 等,你可以根据需求选择合适的链接提取器。

  2. 规则(Rule):规则定义了要提取的链接和如何处理这些链接的方法。每个规则由一个链接提取器和一个回调函数组成。链接提取器用于提取链接,回调函数定义了如何处理这些链接。可以定义多个规则来处理不同类型的链接。

  3. 回调函数(callback):回调函数是指定规则要调用的方法。当链接提取器提取到链接时,将会调用相应的回调函数来处理提取到的

    链接。在回调函数中,你可以编写解析页面和提取数据的逻辑。

  4. follow 参数:在规则中,可以设置 follow 参数来决定是否继续跟踪从链接提取器提取的链接。如果设置为 True,则会继续跟踪这些链接并提取数据;如果设置为 False,则不会跟踪这些链接。

  5. allowed_domains 参数:allowed_domains 参数用于限制爬取的域名。只有在 allowed_domains 列表中的域名下的链接才会被跟踪和提取数据,其他域名下的链接将被忽略。

基本使用

在 Scrapy 框架中,创建 CrawlSpider 时通常是通过继承 scrapy.spiders.CrawlSpider 类来实现的,因为 CrawlSpider 类提供了许多内置的功能和方法来处理链接提取和规则定义。

创建CrawlSpider

要使用 CrawlSpider,首先需要创建一个 Scrapy 项目。可以使用以下命令来创建一个新的 Scrapy 项目

scrapy startproject project_name

进入项目目录

cd project_name

在项目中创建一个新的 Spider 

scrapy genspider spider_name spider_domain

注:spider_name 是你给 Spider 命名的标识符,spider_domain 是要爬取的网站的域名。 

在生成的 Spider 文件中,将基类指定为 CrawlSpider,定义一个名为 MySpider 的 Spider 类,它继承自 CrawlSpider。我们指定了要爬取的网站域名和起始链接。rules 属性定义了我们要遵循的链接提取规则和回调函数。在这个示例中,我们使用了一个空的 LinkExtractor,表示提取所有链接,然后将其传递给 parse_item 方法进行解析。

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

class MySpider(CrawlSpider):
    name = 'myspider'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com']

    rules = (
        Rule(LinkExtractor(allow=()), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        # 在这里定义解析页面的逻辑
        # 可以从 response 中提取数据

        # 返回解析后的数据
        yield {
            'url': response.url,
            'title': response.css('title::text').get()
        }

 运行 

scrapy crawl myspider

 使用CrawlSpider中核心的2个类对象

Rule对象

 Rule类与CrawlSpider类都位于scrapy.contrib.spiders模块中

class scrapy.contrib.spiders.Rule( 
    link_extractor,         
    callback=None,
    cb_kwargs=None,
    follow=None,
    process_links=None,
    process_request=None) 

参数含义:

  • link_extractor为LinkExtractor,用于定义需要提取的链接

  • callback参数:当link_extractor获取到链接时参数所指定的值作为回调函数

    注意 回调函数尽量不要用parse方法,crawlspider已使用了parse方法

  • follow:指定了根据该规则从response提取的链接是否需要跟进。当callback为None,默认值为True

  • process_links:主要用来过滤由link_extractor获取到的链接

  • process_request:主要用来过滤在rule中提取到的request

LinkExtractors 

链接提取器

作用

response对象中获取链接,并且该链接会被接下来爬取 每个LinkExtractor有唯一的公共方法是 extract_links(),它接收一个 Response 对象,并返回一个 scrapy.link.Link 对象

使用

class scrapy.linkextractors.LinkExtractor(
  allow = (),
  deny = (),
  allow_domains = (),
  deny_domains = (),
  deny_extensions = None,
  restrict_xpaths = (),
  tags = ('a','area'),
  attrs = ('href'),
  canonicalize = True,
  unique = True,
  process_value = None
)

主要参数:

  • allow:满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。
  • deny:与这个正则表达式(或正则表达式列表)不匹配的URL一定不提取。
  • allow_domains:会被提取的链接的domains。
  • deny_domains:一定不会被提取链接的domains。
  • restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接(只选到节点,不选到属性)
  • restrict_css:使用css表达式,和allow共同作用过滤链接(只选到节点,不选到属性)

查看效果-shell中验证 

首先运行

scrapy shell 'https://www.zhhbqg.com/1_1852/835564.html'

继续import相关模块 

from scrapy.linkextractors import LinkExtractor

提取当前网页中获得的链接 

link = LinkExtractor(restrict_xpaths=(r'//a'))

调用LinkExtractor实例的extract_links()方法查询匹配结果

 link.extract_links(response)

示例

(爬取小说网数据)

from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from xiaoshuo.items import XiaoshuoItem




class XiaoshuoSpiderSpider(CrawlSpider):
  name = 'xiaoshuo_spider'
  allowed_domains = ['fhxiaoshuo.com']
  start_urls = ['http://www.fhxiaoshuo.com/read/33/33539/17829387.shtml']


  rules = [
    Rule(LinkExtractor(restrict_xpaths=(r'//div[@class="bottem"]/a[4]')), callback='parse_item'),]


  def parse_item(self, response):
    info = response.xpath("//div[@id='TXT']/text()").extract()
    it = XiaoshuoItem()
    it['info'] = info
    yield it


注意

  • callback后面函数名用引号引起
  • 函数名不要用parse
  • 参数的括号嵌套,不要出问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/711688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jvm内存模型剖析优化-JVM(四)

上篇文章代码实例详解如何自定义双亲委派,主要实现ClassLoader,有两个方法,一个直接loadClass用父类的,如果想在破坏,则需要重写loadClass,一个findClass必须要重新,因为父类是空的,…

SpringBoot3之GraalVM之Linux详细安装及使用教程

Linux安装底层工具相关依赖 yum install -y gcc glibc-devel zlib-devel安装GraalVM JDK 《GraalVM官网下载》 找到最近的GraalVM Community Edition X.X.X点击Assets(因为我的是SpringBoot3项目,起始JDK就要求17,所以我下载17)下…

青少年机器人技术一级核心知识点:机械结构及模型(一)

随着科技的不断进步,机器人技术已经成为了一个重要的领域。在这个领域中,机械结构是机器人设计中至关重要的一部分,它决定了机器人的形态、运动方式和工作效率。对于青少年机器人爱好者来说,了解机械结构的基础知识,掌…

vim背景颜色设置

cd ~进入个人家目录下,vim .vimrc进入vimrc文件: 在主题设置部分对颜色背景进行设置,onedark表示黑色背景,default表示白色背景,按需设置即可!

网络知识点-链路聚合

链路聚合(英语:Link Aggregation)是一个计算机网络术语,指将多个物理端口汇聚在一起,形成一个逻辑端口,以实现出/入流量吞吐量在各成员端口的负荷分担,交换机根据用户配置的端口负荷分担策略决定…

【数据结构】算法的时间和空间复杂度

目录 1.什么是算法? 1.1算法的复杂度 2.算法的时间复杂度 2.1 时间复杂度的概念 计算Func1中count语句总共执行了多少次 2.2 大O的渐进表示法 2.3常见时间复杂度计算举例 实例1:执行2N10次 实例2:执行MN次 实例3:执行了100000000次 实例4:计算strchr的时…

java jwt生成token并在网关设置全局过滤器进行token的校验并在给请求头设置参数及在微服务中解析参数

1、首先引入jjwt的依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>2、编写生成token的工具类 package com.jjw.result.util;import com.jjw.res…

软考高级系统架构设计师(九) 作文模板-论设计模式及其应用(未完待续)

目录 掌握的知识点 创建型 结构型 行为型 掌握的知识点 设计模式分为哪3类 每一类包含哪些具体的设计模式 创建型 创建型模式是对对象实例化过程的抽象&#xff0c;他通过抽象类所定义的接口&#xff0c;封装了系统中对象如何创建、组合等信息。 创建型模式主要用于创建对…

【物联网】微信小程序接入阿里云物联网平台

微信小程序接入阿里云物联网平台 一 阿里云平台端 1.登录阿里云 阿里云物联网平台 点击进入公共实例&#xff0c;之前没有的点进去申请 2.点击产品&#xff0c;创建产品 3.产品名称自定义&#xff0c;按项目选择类型&#xff0c;节点类型选择之恋设备&#xff0c;联网方式W…

Linux下安装Redis的详细安装步骤

一.Redis安装 1.下载linux压缩包 【redis-5.0.5.tar.gz】 2.通过FlashFXP把压缩包传送到服务器 3.解压缩 tar -zxvf redis-5.0.5.tar.gz4.进入redis-5.0.5可以看到redis的配置文件redis.conf 5.基本的环境安装 使用gcc -v 命令查看gcc版本已经是4.8.5了&#xff0c;于是就…

ubuntu系统突然失去网络问题

修复ubuntu系统网络问题 1. 服务不存在&#xff1f;2. 修改配置&#xff0c;自动启动网络 每天都在用的ubuntu系统突然ssh连接不上&#xff0c;进系统ifconfig也不显示ip。当然也ping不通任何网页。 1. 服务不存在&#xff1f; 初步怀疑网络服务被关闭了&#xff0c;需要修改配…

【C6】数据类型/移植/对齐,内核中断,通过IO内存访问外设,PCI

文章目录 1.内核基础数据类型/移植性/数据对齐&#xff1a;页大小为PAGE_SIZE&#xff0c;不要假设4K&#xff0c;保证可移植性1.1 kdatasize.c&#xff1a;不同的架构&#xff08;x86_64,arm&#xff09;&#xff0c;基础类型大小可能不同&#xff0c;主要区别在long和指针1.2…

chatgpt赋能python:用Python访问数据库的SEO文章

用Python访问数据库的SEO文章 在当今互联网飞速发展的时代&#xff0c;数据处理和数据库技术的重要性不言而喻。在这些应用中&#xff0c;Python是使用最广泛和最受欢迎的编程语言之一。Python的简单和易学性使其成为理想的选项&#xff0c;可以通过Python来访问各种类型的数据…

荣耀90推出最新MagicOS7.1更新,增加控制中心功能

荣耀 90 系列机型推出了最新的 Magic OS 7.1更新&#xff0c;版本号为7.1.0.137 (C00E130R2P2)。该更新主要增加了控制中心功能&#xff0c;并对部分场景拍摄效果进行了优化。此外&#xff0c;该更新还提升了系统与部分三方应用的兼容性&#xff0c;以提高系统性能和稳定性。 …

选择最适合您自动化系统的控制方式

自动化系统可采用多种不同的控制方式&#xff0c;其中硬件控制和PLC&#xff08;可编程逻辑控制器&#xff09;是常见的选择。 刚好&#xff0c;我这里有上位机入门&#xff0c;学习线路图&#xff0c;各种项目&#xff0c;需要留个6。 硬件控制通常指使用专用硬件电路实现控…

C++3(sizeof和逗号运算符,类型转换)

1.sizeof的用法 逗号运算符 口诀&#xff1a;从左到右算&#xff0c;返回最右边的值 类型转换 如何实现的隐式类型转换&#xff1f; 先算右边的&#xff0c;右边的3&#xff08;int&#xff09;先提升为double &#xff0c;然后算得&#xff08;7.541&#xff08;double&#…

CMU 15-445 -- 关系型数据库重点概念回顾 - 01

CMU 15-445 -- 关系型数据库重点概念回顾 - 01 引言Relational Data ModelDBMS数据模型Relational ModelRelation & TuplePrimary KeysForeign Keys Data Manipulation Languages (DML)Relational Algebra Advanced SQLSQL 的历史SQLAggregatesGroup ByHavingOutput Redire…

内存屏障类型表

load store 啥意思 内存屏障类型表 StoreLoad Barriers是一个“全能型”的屏障&#xff0c;它同时具有其他3个屏障的效果。现代的多处理器大多支持该屏障&#xff08;其他类型的屏障不一定被所有处理器支持&#xff09;。执行该屏障开销会很昂贵&#xff0c;因为当前处理器通常…

在文件每行开头或结尾插入指定字符

1、在文件每行插入指定字符 sed -i "s/^/curl /g" missing.txt效果 2、在每行末尾插入指定字符 sed -i "s/$/结束 /g" missing.txt

leetcode1856. 子数组最小乘积的最大值(单调栈-java)

子数组最小乘积的最大值 leetcode1856.子数组最小乘积的最大值题目描述解题思路代码演示&#xff1a; 经典算法集锦 leetcode1856.子数组最小乘积的最大值 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/maximum-subarr…