scrapy写爬虫

Scrapy是一个用于爬取网站数据并提取结构化信息的Python框架

一、Scrapy介绍

1.引擎(Engine)
– Scrapy的引擎是控制数据流和触发事件的核心。它管理着Spider发送的请求和接收的响应,以及处理Spider生成的Item。引擎是Scrapy运行的驱动力。

2.调度器(Scheduler)
– 调度器负责接收引擎发送的请求,并根据一定的策略(如优先级、深度等)将它们入队。当引擎需要新的请求时,调度器会从队列中取出请求并返回给引擎。它确保了请求的有序处理。

3.下载器(Downloader)
– 下载器负责根据Scrapy引擎发送的请求下载网页内容。它使用HTTP协议与网站服务器进行通信,并将下载的网页内容作为响应返回给Scrapy引擎。下载器是Scrapy获取网页数据的核心组件。

4.Spiders
– Spiders是Scrapy中用于定义爬取逻辑和解析网页内容的组件。它们根据定义的规则生成初始请求,并处理下载器返回的响应,从中提取出需要的数据(Item)或生成新的请求(Request)进行进一步的爬取

5.Item Pipelines
– Item Pipelines负责处理Spider提取出的Item。它们可以执行各种任务,如清洗数据、验证数据的完整性、存储数据到数据库或文件中。通过定义多个Pipeline,可以灵活地处理数据,满足不同的需求。

6.下载器中间件(Downloader Middlewares)
– 下载器中间件位于Scrapy引擎和下载器之间,用于处理请求和响应。它们可以修改请求(如添加请求头、设置代理等)或响应(如压缩处理、重定向处理等),从而控制Scrapy如何与网站交互。中间件是Scrapy扩展功能的重要机制。

7.Spider中间件(Spider Middlewares)
– Spider中间件位于Scrapy引擎和Spiders之间,用于处理Spider的输入(即响应)和输出(即Item和新的请求)。它们可以修改或丢弃响应,处理异常,甚至修改或丢弃Spider生成的Item和Request。Spider中间件提供了在Spider执行过程中插入自定义功能的能力。

各组件之间的数据流向如图所示:
在这里插入图片描述

  • 从初始URL开始,Scheduler会将其交给Downloader进行下载
  • 下载之后会交给Spider进行分析
  • Spider分析出来的结果有两种
  • 一种是需要进一步抓取的链接,如 “下一页”的链接,它们会被传回Scheduler;
  • 另一种是需要保存的数据,它们被送到Item Pipeline里,进行后期处理(详细分析、过滤、存储等)

二.安装scrapy

pip install scrapy

安装后,只要在命令终端输入 scrapy,提示类似以下结果,代表已经安装成功

在这里插入图片描述

三、Scrapy应用示例

1、新建项目
在开始爬取之前,必须创建一个新的Scrapy项目。进入自定义的项目目录中,运行下列命令:

scrapy startproject Spider

其中: mySpider 为项目名称,可以看到将会创建一个 mySpider 文件夹,目录结构大致如下:

mySpider/scrapy.cfgmySpider/__init__.pyitems.pypipelines.pysettings.pyspiders/__init__.py...
  • scrapy.cfg: 项目的配置文件。
  • mySpider/: 项目的Python模块,将会从这里引用代码。
  • mySpider/items.py: 项目的目标文件。
  • mySpider/pipelines.py: 项目的管道文件。
  • mySpider/settings.py: 项目的设置文件。
  • mySpider/spiders/: 存储爬虫代码目录。

2、创建爬虫
在当前目录下输入命令,将在mySpider/spiders目录下创建一个名为bd_test的爬虫,并指定爬取域的范围:

scrapy genspider bd_test "baidu.com"

注意:
第一个参数是爬虫名字不是项目名字;
第二个参数是网站域名,是允许爬虫采集的域名。比如:baidu.com 不限制域名 可能爬到 zhihu.com 。后期可以更改,但要先有生成的目录和文件结果:
在这里插入图片描述

执行命令(执行的是spiders中name)

scrapy crawl baidu

在这里插入图片描述
也可以脚本运行

from scrapy import cmdline
cmdline.execute("scrapy crawl qb".split())

3、编写spiders
class中的
name:也是就是爬虫名一定是唯一的
allowed_domains:域名
start_urls:链接(列表可写入多条,按顺序)一般一个
parse(): 被调用时,每个初始 URL 完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据,提取数据(生成 item)以及生成需要进一步处理的 URL 的 Request 对象。

4、创建item
创建完 Spider 文件之后,接着定义一个容器来保存要爬取的数据,我们对items.py文件进行更改或者创建一个新的文件来定义 item 都行。
  创建 Item 需要继承 scrapy.Item 类,并且定义类型为 scrapy.Field 的字段。例如我们要爬取慕课网站课程的信息,包括课程名称,课程 URL,课程图片 URL,课程描述,学习人数。

import scrapyclass MyreptileItem(scrapy.Item):# 在这里可以定义你需要的字段,如:name = scrapy.Field()title = scrapy.Field()url = scrapy.Field()image_url = scrapy.Field()introduction = scrapy.Field()student = scrapy.Field()

当spiders调用时,导入即可
在这里插入图片描述
5、pipelines.py
在Scrapy中,Pipelines 是用来处理爬取到的数据(Item)的组件。它们可以执行一些清理、验证和持久化(比如存储到数据库或文件)的操作。列入存入redis:
在这里插入图片描述
6、中间件middlewares
具体参考文章:https://www.jianshu.com/p/2c524bfc11d1

参考文献:同上

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

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

相关文章

基于go-zero二次开发的脚本

param$2 # 字符串风格格式为&#xff1a;DemoName model_name$(echo "${param}" | awk -F _ {for(i1;i<NF;i) $itoupper(substr($i,1,1)) tolower(substr($i,2));}1 | tr -d ) # 字符串风格格式为&#xff1a;demoName struct_name$(echo "${model_name}&qu…

ClickHouse表引擎概述

ClickHouse表引擎概述 表引擎的功能&#xff1a; 数据的存储方式 数据的存储位置 是否可以使用索引 是否可以使用分区 是否支持数据副本 并发数据访问 ClickHouse在建表时必须指定表引擎。 表引擎主要分为四大类&#xff1a;MergeTree系列、Log系列、与其他存储/处理系…

字节码编程bytebuddy之获取方法信息和方法入参信息

写在前面 本文看下通过bytebuddy如何获取方法信息和方法的入参信息。 1&#xff1a;代码 package com.dahuyou.bytebuddy.bb;import com.dahuyou.bytebuddy.TT; import net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.implement…

【高中数学/对数函数】比较a=ln2/2,b=ln5/5的大小

【问题】 比较aln2/2,bln5/5的大小 【解答】 a-bln2/2-ln5/5(5*ln2-2*ln5)/10(ln2^5-ln5^2)/10(ln32-ln25)/10>0 所以a>b 【图像】 如果绘出函数ylnx/x的图像&#xff0c;再标记出a,b的位置&#xff0c;则绘出图像如下&#xff1a; 由上图可以看出&#xff0c;a,b两…

随手记:对比两个对象不一样的值,生成一个新的对象

diffObject(obj1, obj2) {let changeForm {}for (let key in obj1) {if (!obj1.hasOwnProperty(key) || obj1[key] ! obj2[key]) {// 新旧数据不相同的key值changeForm[key] obj1[key]}}console.log(changeForm, changeForm)},

初次用bable遍历vue项目下的中文

利用 babel 找到 AST 中的中文 // vite-plugin-babel-transform.js const parser require(babel/parser) const traverse require(babel/traverse).default // const types require(babel/types) // const generate require(babel/generator).default const fs require(f…

【PHP小课堂】学习PHP中的字符串操作函数(二)

学习PHP中的字符串操作函数&#xff08;二&#xff09; 接下来我们继续 PHP 中字符串函数的学习。今天学习的内容主要是带下划线的一些字符串函数&#xff0c;上篇文章说过&#xff0c;这些系统函数的命名是 PHP 非常令人诟病的&#xff0c;有些东西真的只能靠我们的记忆来强行…

显卡、显卡驱动、cuda、cuDNN之间关系

显卡、显卡驱动、CUDA 和 cuDNN 是构成高性能计算和深度学习环境的关键组件&#xff0c;它们之间有着紧密的联系。下面是对这些组件及其关系的详细介绍&#xff1a; 显卡&#xff08;GPU&#xff09; 显卡&#xff0c;全称为图形处理器&#xff08;Graphics Processing Unit&…

【Unity2D 2022:NPC】制作任务系统

一、接受任务 1. 编辑NPC对话脚本&#xff1a; &#xff08;1&#xff09;创建静态布尔变量用来判断ruby是否接受到任务 public class NPCDialog : MonoBehaviour {// 创建全局变量用来判断ruby是否接到任务public static bool receiveTask false; } &#xff08;2&#xff…

python学习-错误与异常

代码是人的逻辑思维的具体体现&#xff0c;因为没有一个人的逻辑思维是完美无缺的&#xff0c;所以人在编写代码时必然会出现各种错误。既然错误或多或少都会发生&#xff0c;那么如何捕捉错误&#xff0c;并且捕捉到错误后要如何处理&#xff0c;就显得很重要。 语法错误 Py…

SPI通信协议和W25Q64

前言&#xff1a; STM32中的通信接口&#xff1a; UART 单总线 IIC SPI CAN 1. SPI FLASH W25Q64的关系 SPI:一种通信接口&#xff0c;可以用于和搭载SPI接口的设备通信 FLASH:是一种掉电不丢失的存储 -- 手机8256G的256 单片机 64K512K的512 芯片内部flash&…

STM32 GPIO的工作原理

STM32的GPIO管脚有下面8种可能的配置:&#xff08;4输入 2 输出 2 复用输出) &#xff08;1&#xff09;浮空输入_IN_FLOATING 在上图上&#xff0c;阴影的部分处于不工作状态&#xff0c;尤其是下半部分的输出电路&#xff0c;实际上是与端口处于隔离状态。黄色的高亮部分显示…

响应式布局下关于gird栅格布局的一些构思

1、传列数&#xff0c;根据列数计算元素容器宽度 好处是子元素可以写百分比宽度&#xff0c;不用固定某一种宽度&#xff0c;反正知道列数通过计算间距就能得到外层容器的宽度。 举个简单的例子&#xff1a; &#xff08;ps:以下用例皆在html中去模拟&#xff0c;就不另外起r…

Python 获取 SQL 指纹和 HASH 值

前言 本文介绍一个提取 SQL 指纹的方法&#xff0c;就是将 SQL 语句的条件转换为 &#xff1f;可用于脱敏和 SQL 聚类分析的场景。 1. 工具安装 这里用到的工具&#xff0c;就是 pt 工具集中的 pt-fingerprint 含在 Percona Toolkit 中&#xff0c;安装方法可参考 Percona T…

python7:装饰器

目录 1.调用外部程序os.system-阻塞式调用subprocess-python中的模块 2.装饰器前戏作用域&#xff08;1&#xff09;全局和局部-就近原则&#xff08;2&#xff09;嵌套作用域&#xff08;3&#xff09;内置作用域、变量 高阶函数&#xff1a;函数是最高级的对象&#xff08;1&…

海外媒体投稿:5个软文代发经典案例,教大家获得突破

随着互联网的飞速发展&#xff0c;软文代发成为一种高效的推广方法。下面我们就详细介绍五个成功软文代发推广实例&#xff0c;致力于帮助读者把握有关方法&#xff0c;完成突破。 第一实例&#xff1a;社交网络散播在如今社交媒体时代&#xff0c;软文代发能够通过社交平台迅速…

nodejs实现:支付宝订单查询

nodejs实现&#xff1a;支付宝订单查询&#xff1b; 原生http请求&#xff0c;不使用三方库&#xff1b; 代码如下&#xff1a; const https require(https); const crypto require(crypto); const querystring require(querystring);// 支付宝公共参数 const PRIVATE_KE…

[C++] 轻熟类和对象

类的定义 格式规范 class为定义类的关键字&#xff0c;后有类名&#xff0c;类的主体存于{}中&#xff1b;类定义结束时后面的分号不能省略&#xff1b;类体的内容成为类的成员&#xff0c;类中的变量成为成员变量&#xff0c;函数成为方法或成员函数&#xff1b;C兼容C语言的…

微软 Edge 浏览器全解析

微软 Edge 是微软推出的一个现代化浏览器,继承了 Internet Explorer(IE)的部分功能,但在速度、安全性和兼容性方面做出了很大改进。下面是对微软 Edge 浏览器的详细解析,包括其特点、安装、配置和常见问题的解答。 微软 Edge 浏览器的特点 基于 Chromium 内核 Edge 浏览…

SpringBoot配置flyway

背景 目前我们的项目代码都会交由Git、SVN等版本管理工具进行管理&#xff0c;但是我们的sql脚本&#xff0c;尤其是各类ddl脚本并没有进行版本的管理&#xff08;python的web框架Django默认就提供了类似的工具&#xff0c;从一开始就鼓励开发者通过版本管理的方式进行数据库的…