探索Scrapy-spider:构建高效网络爬虫

Spider简介

Scrapy中的Spider是用于定义和执行数据抓取逻辑的核心组件。Spider负责从指定的网站抓取数据,并定义了如何跟踪链接、解析内容以及提取数据的规则。它允许您定制化地指定要抓取的网站、页面和所需的信息。Spider的作用是按照预定的规则爬取网页,从中提取所需的数据,并将数据传递给Scrapy引擎进行处理。

以下是一个简单的Scrapy Spider示例代码:


import scrapyclass MySpider(scrapy.Spider):name = 'example_spider'start_urls = ['http://example.com']def parse(self, response):# 在这里编写处理响应的逻辑# 可以使用XPath或CSS选择器提取数据title = response.css('title::text').get()body = response.css('body::text').get()# 可以将提取到的数据通过yield传递给Pipeline进行处理yield {'title': title,'body': body}

在这个示例中:

  • MySpider是一个继承自scrapy.Spider的Spider类。
  • name属性定义了Spider的名称。
  • start_urls属性包含了Spider开始抓取的初始URL列表。
  • parse方法是用于处理网页响应的默认方法。在这里,使用了CSS选择器从网页中提取了标题和正文内容,并通过yield语句将提取到的数据作为字典传递给Pipeline进行处理。

Spider传参方式

在Scrapy中,Spider之间或Spider内部的不同方法之间可以通过多种方式进行参数传递和通信:

  1. 构造函数参数传递:

    • 在Spider的构造函数中定义自定义参数,并在初始化Spider时传递这些参数。这些参数可以在Spider的各个方法中使用。
    
    import scrapyclass MySpider(scrapy.Spider):name = 'example'def __init__(self, category=None, *args, **kwargs):super(MySpider, self).__init__(*args, **kwargs)self.category = categorydef start_requests(self):# 使用传递的参数构建初始请求# self.category 可在这里使用# ...
    
  2. Request对象传递参数:

    • 在发送请求时,可以使用meta参数将信息传递给下一个回调函数。这可以通过Request对象的meta属性进行。
    
    import scrapyclass MySpider(scrapy.Spider):name = 'example'def start_requests(self):url = 'http://example.com'custom_data = {'key': 'value'}yield scrapy.Request(url, callback=self.parse, meta={'custom_data': custom_data})def parse(self, response):custom_data = response.meta.get('custom_data')# 使用传递的参数# ...
    
  3. Spider属性传递:

    • Spider对象的属性可以在不同的方法之间共享数据。
    
    import scrapyclass MySpider(scrapy.Spider):name = 'example'def start_requests(self):self.shared_data = 'some value'yield scrapy.Request('http://example.com', callback=self.parse)def parse(self, response):# 可以在这里使用 self.shared_data# ...
    

这些方法允许在Scrapy Spider之间或Spider内的不同方法之间传递参数和共享信息,使得数据和信息在爬取过程中得以灵活传递和使用。

需要注意的是scrapy是多线程异步运作,如果场景内对参数的顺序要求较高的话建议使用meta传参,而不要使用self全局传参,尤其是需要将爬取到的数据暂存在变量时要尤其注意这点

spider的钩子函数

Scrapy中的钩子函数(也称为回调函数)是Spider中用于定义爬取逻辑的关键部分。它们在不同的阶段执行,允许定制化处理请求、响应和提取数据的方式。以下是Scrapy中常用的钩子函数及其作用:

1. start_requests(self)

  • 作用: 生成Spider的初始请求。
  • 说明: 这个方法生成Spider开始抓取的初始请求。默认情况下,它从start_urls属性中获取URL并生成请求。我们可以在这里手动创建并返回一个或多个Request对象,也可以使用yield关键字返回请求。

2. parse(self, response)

  • 作用: 解析并处理页面响应。
  • 说明: 默认的解析方法。当请求返回成功时,Scrapy将调用这个方法。我们可以在这里编写用于处理网页响应的逻辑,包括提取数据、跟进链接等。通常,我们能够使用XPath或CSS选择器从response对象中提取所需的数据。

3. parse_start_url(self, response)

  • 作用: 解析Spider的起始URL的响应。
  • 说明: 当Spider的起始URL返回成功时,Scrapy会调用这个方法。如果定义了start_urls属性,则对每个起始URL的响应将会由这个方法处理。它允许你对起始页面的响应进行特定处理。

4. __init__()

  • 作用: Spider对象初始化。
  • 说明: 这是Spider对象的构造函数,在Spider实例化时调用。你可以在这里进行一些初始化设置或预处理工作。

5. closed(reason)

  • 作用: 当Spider关闭时调用。
  • 说明: 当Spider停止运行时,无论是因为抓取完成、异常退出或手动停止,都会调用这个方法。你可以在这里进行一些清理工作或输出总结信息。

另外,如果使用parse_start_url去生成url队列那么就无需使用
start_urls = [‘http://example.com’].

5. 其他自定义回调函数

除了以上常用的钩子函数外,我们还可以定义其他自定义的回调函数,用于处理特定页面的响应。例如,可以根据不同类型的页面定义不同的回调函数,以便从中提取数据或执行特定操作。

假如我们对于一条数据的提取需要逐条发送多个请求,我们可以这样写:

image.png

image.png

image.png
并使用meta存储传递信息。最终的收集完本条数据后返还item去给pip管道处理收集到的信息。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构 图的广度优先搜索和深度优先搜索

一、广度优先搜索 广度优先搜索等价于树的层次遍历,将起点的每一层进行遍历 当这一层结点全部被遍历完时,再遍历下一层次,从图中可以根据距离遍历起点的长度进行层次选择 例: 以a结点作为开始结点 a的下一层次有b c e三个结点 所以…

添加新公司代码的配置步骤-Part4

原文地址:配置公司代码 概述 这是一系列讨论和列出向系统添加新公司代码时必须完成的事务的四篇博客中的最​​后一篇。以下是这四个文档涵盖的主题列表: 企业结构 - 第 1 部分 FI 配置 – 第 2 部分 SD 配置 – 第 3 部分 物流 – 概述 – 第 3 部分…

静态网站生成器与服务器端渲染有啥区别

在将网站部署到服务器之前,在构建阶段生成HTML页面被称为“静态网站生成(Static Site Generation)”。这种方法涉及使用网站模板创建预构建页面,并在用户请求时立即交付给他们。以下是静态生成网站的一些好处: 更快的页…

【从零开始学习JVM | 第五篇】快速了解运行时数据区

前言: 当谈论 Java 程序的运行机制时,JVM(Java 虚拟机)的运行时数据区是一个必不可少的话题。JVM 运行时数据区是 Java 程序在运行过程中分配内存和管理数据的重要区域,它包括了方法区、堆、虚拟机栈、程序计数器和本地…

【Spring 源码】 贯穿 Bean 生命周期的核心类之 AbstractAutowireCapableBeanFactory

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞…

小白学习java理解栈手写栈——第四关(青铜挑战)

内容1.理解栈的基本特征2.理解如何使用数组来构造栈3.理解如何使用链表来构造栈 1.栈的基础知识 1.1栈的特征 栈和队列是比较特殊的线性表,又称为访问受限的线性表。栈是很多表达式、符号等运算的基础,也是递归的底层实现,理论上递归能做的…

linux学习之详解文件

目录 1.先认识文件 2.c语言中常用文件接口 fopen(打开文件) 3.系统接口操作文件 open write 文件的返回值以及打开文件的本质 理解struct_file内核对象 了解文件描述符(fd)分配规则 重定向 dup接口 标准错误流 文件缓冲…

数据库:JDBC编程

基本概念 JDBC编程就是通过Java代码来操作数据库 api 数据库是一个类别:MySQL,Oracle,sql server,sqlite 代码操作数据库的前提:数据库提供api,我们要调用api才能完成操作 (api&#xff1a…

C++刷题 -- 链表

C刷题 – 链表 文章目录 C刷题 -- 链表1.删除链表的倒数第 N 个结点2.链表相交3.环形链表 1.删除链表的倒数第 N 个结点 https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ 快慢指针的应用 fast指针先移动N步,slow依然指向head;然后fa…

Halcon threshold_sub_pix (Operator)

read_image(Image,fabrik) threshold_sub_pix(Image,Border,35) dev_display(Border)Image是输入的原始图像,Threshold是设定的阈值,Width和Height是像素值计算区域的大小,ThresholdedRegion是经过分割后得到的二值化结果。 在对图像进行二值…

Docker-compose容器编排与容器监控

一、Docker-compose 1、概念: Docker-Compose 是 Docker 官方的开源项目,负责实现对Docker容器集群的快速编排。 2、作用: Docker-Compose可以管理多个Docker容器组成一个应用。需要定义一个yaml格式的配置文件 docker-compose.yml&#…

PostGIS学习教程十一:投影数据

PostGIS学习教程十一:投影数据 地球不是平的,也没有简单的方法把它放在一张平面纸地图上(或电脑屏幕上),所以人们想出了各种巧妙的解决方案(投影)。 每种投影方案都有优点和缺点,一…