Python----Python爬虫(Scrapy的应用:CrawlSpider 使用,爬取小说,CrawlSpider版)

news/2025/1/15 15:15:38/

一、CrawlSpider 使用

1.1、CrawlSpider

CrawSpiders 是 Scrapy 框架中的一个特殊爬虫类,它用于处理需要跟随链接并抓取多个页面的情况。相比于基本的 Spider 类,CrawSpiders 提供了一个更灵活、更强大的方式来定义爬取规则。

在Scrapy中Spider是所有爬虫的基类,而CrawSpiders就是Spider的派生类。

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

 

1.2、使用 CrawlSpider 的基本步骤


定义爬虫类:从 CrawlSpider 继承并定义爬虫类。


设置起始 URL:通过 start_urls 属性定义要开始爬取的 URL。


定义解析规则:通过 rules 属性设置爬取规则,这通常包括为页面提取数据和跟随链接的规则。 

 创建CrawlSpider

        

python">scrapy genspider -t crawl 爬虫名 (allowed_url)

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

1.3.1、Rule对象

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

python">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

1.3.2、LinkExtractors

顾名思义,链接提取器

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

python">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共同作用过滤链接(只选到节点,不选到属性)

1.4、shell中验证 

首先运行

python">scrapy shell 'https://www.52wx.com/335_335954/131105239.html'

继续import相关模块:

python">from scrapy.linkextractors import LinkExtractor

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

python">link = LinkExtractor(restrict_xpaths=(r'//div[@class="section-opt m-bottom-opt"]/a[3]'))

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

python"> link.extract_links(response)
  • callback后面函数名用引号引起
  • 函数名不要用parse
  • 参数的括号嵌套,不要出问题

二、Scrapy爬取小说--普通版

spider 

python">import scrapyclass XiaoshuoSpider(scrapy.Spider):name = "xiaoshuo"allowed_domains = ["52wx.com"]start_urls = ["https://www.52wx.com/335_335954/131105239.html"]def parse(self, response):name=response.xpath('//div[@class="reader-main"]/h1/text()').get()new_url=response.xpath('//div[@class="section-opt m-bottom-opt"]/a[3]/@href').get()content=response.xpath('//div[@class="content"]/text()').extract()yield{'name':name,'content':content}next_url='https://www.52wx.com/335_335954/'+new_urlyield scrapy.Request(next_url,callback=self.parse)

 pipeline

python"># Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapterclass Scrapy03Pipeline:def open_spider(self,spider):self.file=open('xiaoshuo.txt','w',encoding='utf-8')def process_item(self, item, spider):self.file.write(item['name']+'\n')self.file.write(''.join(item['content']).replace('\r\n',''))def close_spider(self,spider):self.file.close()

 settings.py 

三、Scrapy爬取小说--CrawlSpider版

spider

python">import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Ruleclass XsSpider(CrawlSpider):name = "xs"allowed_domains = ["52wx.com"]start_urls = ["https://www.52wx.com/335_335954/"]rules = (Rule(LinkExtractor(restrict_xpaths=('//div[@class="section-box"][2]/ul/li/a[1]')), callback="parse_item", follow=True),Rule(LinkExtractor(restrict_xpaths=('//div[@class="section-opt m-bottom-opt"]/a[3]')), callback="parse_item", follow=True),)def parse_item(self, response):name=response.xpath('//div[@class="reader-main"]/h1/text()').get()content=response.xpath('//div[@class="content"]/text()').extract()print(content)yield{'name':name,'content':content}

 pipeline 

python"># Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html# useful for handling different item types with a single interface
from itemadapter import ItemAdapterclass Scrapy03Pipeline:def open_spider(self,spider):self.file=open('xiaoshuo.txt','w',encoding='utf-8')def process_item(self, item, spider):self.file.write(item['name']+'\n')self.file.write(''.join(item['content']).replace('\r\n',''))def close_spider(self,spider):self.file.close()

settings.py 

 

四、思维导图


http://www.ppmy.cn/news/1563348.html

相关文章

Linux(Centos 7.6)命令详解:split

1.命令作用 Linux系统中的一个用于拆分文件的命令。它可以将一个大文件拆分成多个小文件,以便于传输、存储或处理 2.命令语法 Usage: split [OPTION]... [INPUT [PREFIX]] Usage: split [选项]... [输入文件] [输出文件前缀] 3.参数详解 OPTION: -a, --suffi…

JVM虚拟机的组成 笼统理解 六大部分 类加载子系统 运行时数据区 执行引擎 本地接口 垃圾回收器 线程工具

目录 JVM虚拟机的组成:概述 JVM虚拟机的组成:详细解析 1. 类加载子系统 2. 运行时数据区 3. 执行引擎 4. 本地接口 5. 垃圾回收器 6. 线程管理与调试工具 概述 JVM(Java Virtual Machine)是一个虚拟计算机,执行…

用gpg和sha256验证ubuntu.iso

链接 https://ubuntu.com/tutorials/how-to-verify-ubuntuhttps://releases.ubuntu.com/jammy/ 本文是2的简明版 sha256sum介绍 sha256sum -c SHA256SUMS 2>&1这段脚本的作用是验证文件的 SHA-256 校验和。具体来说,命令的各个部分含义如下: …

[创业之路-248]:《华为流程变革:责权利梳理与流程体系建设》华为流程的前端拉动后端,与计算机软件的前端应用与后端程序的类比关系

华为的前端拉动后端模式与计算机前端应用与后端程序的类比关系,虽然两者属于不同的领域,但在某些方面存在有趣的相似性。以下是对这两者的类比关系的详细探讨: 一、华为的前端拉动后端模式 定义与特点: 华为的前端拉动后端模式是…

【2025最新】Poe保姆级订阅指南,Poe订阅看这一篇就够了!最方便使用各类AI!

1.Poe是什么? Poe, 全称Platform for Open Exploration。 Poe本身并不提供基础的大语言模型,而是整合多个来自不同科技巨头的基于不同模型的AI聊天机器人,其中包括来自OpenAI的ChatGPT,Anthropic的Claude、Google的PaLM&#xf…

使用Python实现深度强化学习的自动驾驶模拟

友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…

Vue3组件设计模式:高可复用性组件开发实战

Vue3组件设计模式:高可复用性组件开发实战 一、前言 在Vue3中,组件设计和开发是非常重要的,它直接影响到应用的可维护性和可复用性。本文将介绍如何利用Vue3组件设计模式来开发高可复用性的组件,让你的组件更加灵活和易于维护。 二、单一职责…

Docker save load 镜像 tag 为 <none>

一、场景分析 我从 docker hub 上拉了这么一个镜像。 docker pull tomcat:8.5-jre8-alpine 我用 docker save 命令想把它导出成 tar 文件以便拷贝到内网机器上使用。 docker save -o tomcat-8.5-jre8-alpine.tar.gz 镜像ID 当我把这个镜像传到别的机器,并用 dock…