网络爬虫框架Scrapy的入门使用

Scrapy的入门使用

  • Scrapy
    • 概述
    • 引擎(Engine)
    • 调度器(Scheduler)
    • 下载器(Downloader)
    • Spider
    • Item Pipeline
  • 基本使用
    • 安装scrapy
    • 创建项目
    • 定义Item数据模型对象
    • 创建爬虫(Spider)
    • 管道pipeline来保存数据
    • 启动爬虫
  • 其他
    • 解析函数对象
    • 实现多请求
  • scrapy终端(Scrapy shell)
    • 启动终端
    • 可用Scrapy对象
    • 快捷命令

Scrapy

概述

Scrapy是一个用Python编写的开源网络爬虫框架,专门设计用于快速、高效地提取网站数据。它提供了一整套工具和库,可以帮助开发人员创建和管理网络爬虫,用于抓取特定网站的数据并进行处理。

英文文档:https://docs.scrapy.org/en/latest/

GitHub:https://github.com/scrapy/scrapy

中文文档:https://scrapy-chs.readthedocs.io/zh_CN/latest/

Scrapy是一个基于Python的Web爬虫框架,由多个组件组成,包括了引擎(Engine)、调度器(Scheduler)、下载器(Downloader)、Spider、Item Pipeline等。

引擎(Engine)

引擎是Scrapy的核心组件之一,负责调度和协调各个组件的工作。它接收Spider返回的初始请求,并将其传递给调度器,再由调度器根据一定的策略进行调度,最终将请求发送给下载器进行下载。在下载器将响应内容返回后,引擎将调用Spider的回调函数进行处理,再将处理后的数据交给Item Pipeline进行处理。

调度器(Scheduler)

调度器负责对Spider的请求进行调度,决定请求的顺序和时间。它维护了一个请求队列,并根据一定的调度策略,将请求传递给下载器进行下载。在下载完成后,调度器将下载器返回的响应对象传递给Spider进行处理。

下载器(Downloader)

下载器负责从互联网上下载页面和资源。它接收调度器传递的请求对象,并根据请求中的URL和请求头信息进行下载。下载器可以通过设置代理、Cookies和请求头等信息,模拟浏览器的行为,避免被服务器拒绝访问。在下载完成后,下载器将响应对象返回给调度器。

Spider

Spider是用户编写的爬虫代码,定义了如何爬取和处理页面数据。它通过yield关键字返回请求对象或者Item对象,并可以定义一个或多个回调函数,在下载器返回响应对象后进行解析和处理。Spider可以通过设置start_urls或者start_requests方法返回一个或多个初始请求对象。

Item Pipeline

Item Pipeline负责处理Spider返回的Item对象,可以对数据进行过滤、清理、验证等操作。它将Item对象传递给一系列的管道处理器,每个管道处理器可以对Item对象进行一些处理操作,然后将处理后的Item对象传递给下一个管道处理器。在最后一个管道处理器处理完成后,Item Pipeline将Item对象输出到文件或者数据库中。

基本使用

安装scrapy

pip install scrapy

查看帮助命令

> scrapy --help
Scrapy 2.8.0 - no active projectUsage:scrapy <command> [options] [args]Available commands:bench         Run quick benchmark testfetch         Fetch a URL using the Scrapy downloadergenspider     Generate new spider using pre-defined templatesrunspider     Run a self-contained spider (without creating a project)settings      Get settings valuesshell         Interactive scraping consolestartproject  Create new projectversion       Print Scrapy versionview          Open URL in browser, as seen by Scrapy[ more ]      More commands available when run from project directoryUse "scrapy <command> -h" to see more info about a command

创建项目

scrapy startproject 项目名称

会在当前目录下创建一个名为project_name的目录,包含了Scrapy项目的基本结构。
在这里插入图片描述
项目目录结构:

scrapy.cfg: 项目的配置文件demo: 项目的python模块,之后将在此加入代码demo/spiders/: 爬虫组件目录demo/items.py: 定义数据模型demo/middlewares.py: 自定义中间件demo/pipelines.py: 自定义管道,保存数据demo/settings.py: 爬虫配置信息

定义Item数据模型对象

Item是保存爬取到的数据的容器。通过创建一个 scrapy.Item 类, 并且定义类型为scrapy.Field的类属性来定义一个Item

定义item即提前规划好哪些字段需要抓,防止在爬取数据过程中写错。

配合注释一起可以清晰的知道要抓取哪些字段,

数据模型对象类定义以后需要在爬虫中导入并且实例化,使用方法和使用字典相同

在items.py中定义模型对象,定义要提取的字段:

import scrapyclass DemoItem(scrapy.Item):# 标题title = scrapy.Field()# 数量count = scrapy.Field()

在这里插入图片描述

创建爬虫(Spider)

Spider是编写用于从单个网站(或者一些网站)爬取数据的类。其包含一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 item 的方法。

创建一个Spider,必须继承scrapy.Spider类, 且定义一些属性、方法:

name:

用于区别Spider。 该名字必须是唯一的,不可以为不同的Spider设定相同的名字。

start_urls:

包含Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。

parse() :

parse()是spider的一个方法。 被调用时,每个初始URL完成下载后生成的Response对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。

demo/spiders目录下创建demospider.py文件,需要定义一个Spider类,继承自scrapy.Spider类,并重写start_requests()parse()方法。

import scrapyfrom demo.items import DemoItem# 继承自爬虫类
class DemospiderSpider(scrapy.Spider):# 定义爬虫名称name = "demospider"# 设置允许爬取的范围allowed_domains = ["www.runoob.com"]# 设置开始爬取的请求地址start_urls = ["https://www.runoob.com/"]# 实现解析函数,提取数据或者提取URL,并提交给引擎def parse(self, response):# scrapy的response对象可以直接进行xpathlist = response.xpath('/html/body/div[4]/div/div[2]/div/h2/text()').extract()print("--------------------------------")index = 1for title in list:div = "div[" + str(index) + "]"index = index + 1count = response.xpath('/html/body/div[4]/div/div[2]/' + div + '/a/h4/text()').extract()item = DemoItem()item['title'] = titleitem['count'] = len(count)# 提交数据给引擎# yield能够传递的对象只能是:BaseItem, Request, dict, Noneyield item

使用命令方式可以快速创建一个爬虫编写的基本结构

cd 项目目录scrapy genspider 爬虫名称 允许域名>scrapy genspider demospider www.runoob.com
Created spider 'demospider' using template 'basic' in module:demo.spiders.demospider

在这里插入图片描述

管道pipeline来保存数据

数据在被抓取后,被发送到管道,接着进行管道操作,比如:

清理 HTML 数据验证抓取的数据(检查项目是否包含某些字段)检查重复项(并删除它们)将抓取的项目存储在数据库中

在运行爬虫时添加 -o参考可以将数导出

scrapy crawl 爬虫名称 -o 导出文件

在pipelines.py文件中创建DemoPipeline管道类,打印爬虫的parse() 方法提取的数据

class DemoPipeline:# 爬虫文件中提取数据的方法每yield一次item,就会运行一次def process_item(self, item, spider):print("title: {} , count: {}".format(item['title'], item['count']))return item

在这里插入图片描述

完整管道实现如下:

# 1.在pipelines.py中编写管道实现# 2.定义管道类
class DemoPipeline:# 3.必须实现process_item(self,item,spider),在管道接收数据对象时回调,用于接收和处理每个数据对象def process_item(self, item, spider):print("title: {} , count: {}".format(item['title'], item['count']))return item# 4.可选实现def open_spider(self, spider):print("爬虫启动时回调,用于初始化操作")def close_spider(self, spider):print("爬虫关闭时回调,用于释放操作")

接着在settings.py中开启管道

配置项中键为使用的管道类,参数的值是一个权重,越小越优先执行

ITEM_PIPELINES = {"demo.pipelines.DemoPipeline":1
}

注意事项:

在管道实现函数中process_item必须有返回值,传递给下一个管道多管道实现时可以通过类型判断或爬虫名称判断区分存储的数据

启动爬虫

在命令行中,进入目录,并输入以下命令,运行Spider:

scrapy crawl 爬虫名称scrapy crawl demospider

控制台打印了爬虫提取数据日志与管道保存数据日志,如下所示:

--------------------------------
title:  HTML / CSS , count: 9
2023-02-22 14:07:26 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.runoob.com/>
{'count': 9, 'title': ' HTML / CSS'}
title:  JavaScript , count: 18
2023-02-22 14:07:26 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.runoob.com/>
{'count': 18, 'title': ' JavaScript'}
title:  服务端 , count: 26
2023-02-22 14:07:26 [scrapy.core.scraper] DEBUG: Scraped from <200 https://www.runoob.com/>

其他

解析函数对象

response对象

response响应对象封装从互联网上返回的响应,具有如下常用属性

response.url:当前响应的url地址response.request.url:当前响应对应的请求的url地址response.headers:响应头response.requests.headers:当前响应的请求头response.body:响应体,也就是html代码,byte类型response.status:响应状态码

Selector对象

Selector对象封装数据操作的对象

xpath:可以使用 xpath 提取数据,返回 SelectorList 对象css:可以使用 css 样式选择器提取数据,返回 SelectorList 对象extract:从selector对象中提取内容

SelectorList对象

返回 Selector 对象的合集

extract_first :取列表中第一个元素的内容,如果元素不存在返回 Noneextract :提取列表中selector对象中所有内容

提交数据给引擎

使用关键词 yield,在爬虫组件的解析函数中提交数据给引擎

提交数据类型:BaseItem、Request、dict、None

def parse(self,response):...item = {}item["data"] = "数据"yield item

实现多请求

构造Request对象,继续发送请求,从而实现多请求

scrapy.Request构建方式

scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])

注意:中括号里的参数为可选参数,具体意思如下:

callback: 表示当前的url的响应交给哪个函数去处理method:指定POST或GET请求headers:接收一个字典,其中不包括cookiescookies:接收一个字典,专门放置cookiesbody:接收json字符串,为POST的数据,发送payload_post请求时使用meta: 实现数据在不同的解析函数中传递,meta默认带有部分数据,比如下载延迟,请求深度等dont_filter: 默认会过滤请求的url地址,即请求过的url地址不会继续被请求,对需要重复请求的url地址可以把它设置为Turemeta的作用:meta可以实现数据在不同的解析函数中的传递

meta参数的使用

利用meta参数在不同的解析函数中传递数据

def parse(self,response):...yield scrapy.Request(detail_url, callback=self.parse_detail,meta={"item":item})...def parse_detail(self,response):# 获取传入的itemitem = resposne.meta["item"]

使用关键词 yield,提交请求给引擎

    # 实现解析函数,提取数据或者提取URL,并提交给引擎def parse(self, response):for title in response.xpath('//title').getall():item = DemoItem()item['title'] = titleyield itemfor href in response.xpath('//a/@href').getall():yield scrapy.Request(response.urljoin(href), self.parse)

scrapy终端(Scrapy shell)

Scrapy终端是一个交互终端,在未启动spider的情况下尝试及调试爬取代码,如用来测试XPath或CSS表达式

启动终端

scrapy shellscrapy shell 爬取地址scrapy shell www.runoob.com

可用Scrapy对象

Scrapy终端根据下载的页面会自动创建一些方便使用的对象

[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    <scrapy.crawler.Crawler object at 0x00000114BB2603A0>
[s]   item       {}
[s]   request    <GET http://www.runoob.com>
[s]   response   <200 https://www.runoob.com/>
[s]   settings   <scrapy.settings.Settings object at 0x00000114BB260940>
[s]   spider     <DemospiderSpider 'demospider' at 0x114bb6f6dc0>
[s] Useful shortcuts:
[s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser

快捷命令

shelp() - 打印可用对象及快捷命令的帮助列表
fetch(request_or_url) - 根据给定的请求(request)或URL获取一个新的response,并更新相关的对象
view(response) - 在本机的浏览器打开给定的response
>>> fetch(request)
2023-02-22 15:52:11 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET https://www.runoob.com/> from <GET http://www.runoob.com>
2023-02-22 15:52:11 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.runoob.com/> (referer: None)>>> view(response)
True

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

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

相关文章

消费盲返:新型返利模式引领购物新潮流

消费盲返&#xff0c;一种引领潮流的新型消费返利模式&#xff0c;其核心在于&#xff1a;消费者在平台选购商品后&#xff0c;不仅能享受优惠价格&#xff0c;更有机会获得后续订单的部分利润作为额外奖励。这种创新的返利机制&#xff0c;既提升了消费者的购物体验&#xff0…

AUTOSAR关于内存栈的分层及描述

首先关于关于内存栈的分层&#xff1a;如下图所示&#xff0c;Nvm靠近RTE的&#xff1b;MemIf居中&#xff0c;EA和FEE被包含其中。 其次关于这三层的缩写&#xff1a;可以看到EEPROM的模拟和EEPROM的抽象层。 我们可以看到 大概的数据流&#xff1a; 和大致的结构分层作用&am…

使用argocd作为cd流程

一、前言 讲述关于argocd在cicd流程中的使用&#xff0c;ci这里使用gitlabjenkins流水线的方式&#xff0c;jenkins用于拉代码打包、构建镜像、变更yaml文件的镜像、推送变更的yaml文件到gitlab的gitops仓库中&#xff0c;最后再有argocd实现cd流程&#xff0c; 二、使用 关于…

​网络安全相关证书资料​——OSCP、CISP-PTE

网络安全相关证书有哪些&#xff1f;——就实战型看&#xff0c;OSCP、CISP-PTE &#xff08;国家注册渗透测试工程师&#xff09;最好。 网络安全相关证书有哪些&#xff1f; 网络安全相关证书有哪些呢&#xff1f;了解一下&#xff01; 1. CISP &#xff08;国家注册信息安全…

全国产数据采集卡定制,24位八通道以太网数据采集卡 labview 100K采样

XM702是一款以太网型高速数据采集卡&#xff0c;具有8通 道真差分输入&#xff0c;24位分辨率&#xff0c;单通道最高采样率100ksps八通 道同步共计800ksps、精密前置增益放大、集成IEPE/ICP硬件 支持的特点。本产品采用了多个高精度24位ADC单元及配合本 公司多年积累开发的前置…

WinSock Api connect超时函数实现方法

当调用listen(serverSocket, 1)时&#xff0c;1表示服务器同时处理的连接请求的最大数量。在这种情况下&#xff0c;服务器只能处理一个客户端连接请求。如果客户端尝试连接时&#xff0c;服务器正在处理一个连接请求&#xff0c;客户端将被阻塞&#xff08;即死等&#xff09;…

性能小钢炮,美学艺术品!佰维PD2000移动固态硬盘新品即将上市

开春时节&#xff0c;想必大家已经准备踏上春游旅程。每到一个景点&#xff0c;或许总想记录精彩的瞬间&#xff0c;留存优美的景色。但由于手机存储容量有限&#xff0c;很多时候我们拍不了多少照片&#xff0c;手机就开始提示存储空间不足。而iCloud昂贵的云存储价格也让人望…

linux生产桌面程序并实现开机自启动

1.生产桌面程序 编写桌面文件脚本 创建一个桌面脚本文件&#xff0c;后缀名为desktop&#xff0c;我的为my.desktop,文件内容如下 [Desktop Entry] Version1.0 Namemy Comment this app use for ljs Exec/home/ljs/myTestApp Icon/home/ljs/icon.png Terminalfal…

2023年后端面试总结

备注&#xff1a;这篇文章是我在2023年年初在自己的网站上写的&#xff0c;最近在迁移技术文章&#xff0c;我感觉这个也是和咱程序员相关&#xff0c;所以今天就决定把它迁移过来。 .......................................................................分割线..........…

机器学习概论—增强学习

机器学习概论—增强学习 强化学习(Reinforcement Learning, RL)或者说是增强学习,是机器学习的一个领域,旨在使智能体通过与环境的交互学习如何做出决策,它是关于在特定情况下采取适当的行动来最大化奖励。它被各种软件和机器用来寻找在特定情况下应采取的最佳行为或路径…

【单调栈】力扣84.柱状图中最大的矩形

上篇文章我们介绍了使用 无重复值 单调栈代码解决 含有重复值 的问题&#xff0c;在文章的最后&#xff0c;留下了一道考察相同思想的题目&#xff0c;今天我们来看看如何套路解决该题。 &#xff08;还没看过前几篇介绍的小伙伴赶快关注&#xff0c;在 「单调栈」 集合里查看…

docker logs 查找日志常用命令

docker logs 是什么 docker logs 是 Docker 命令行工具提供的一个命令&#xff0c;用于查看容器的日志输出。它可以显示容器在运行过程中生成的标准输出&#xff08;stdout&#xff09;和标准错误输出&#xff08;stderr&#xff09;&#xff0c;帮助用户诊断容器的行为和排查…

Python的面向对象、封装、继承、多态相关的定义,用法,意义

面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它使用对象的概念来模拟现实世界的实体&#xff0c;并通过类&#xff08;Class&#xff09;来创建这些实体的蓝图。OOP的核心概念包括封装、继承和多态。 Python中的面向对象编程 在Python中&#xff0c;一…

2024年妈妈杯数学建模思路A题思路分享

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

课堂练习:环境体验——Linux 文件操作命令

任务描述 第二个任务就是了解Linxu的文件查看命令&#xff0c;文件编辑基本命令。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 1.文件查看命令。 2.文件编辑基本命令。 文件查看命令 我们要查看一些文本文件的内容时&#xff0c;要使用文本编辑器来查看…

使用OpenSSL指令测试椭圆曲线签名算法ECDSA

文章目录 小结问题及解决获取secp256r1的公钥和私钥DER格式使用OpenSSL及secp256r1算法获得签名使用OpenSSL及secp256r1算法对签名进行认证 参考 小结 本文记录了使用OpenSSL指令测试椭圆曲线签名算法ECDSA&#xff0c;进行了以下操作&#xff1a;生成椭圆曲线secp256r1 公私密…

shell find, while 使用,找出文件并批量修改文件名

linux find 命令和 while 命令联合使用案例_ITPUB博客 #!/bin/bash int1 while(( $int<5 )) doecho $intlet "int" done find 和 while 联合使用 echo find ./ -iname "\*.jpg" | while read f do#do somethingecho $f done 修改文件名 linux 找出…

基于unbantu的nginx的配置

目录 前言: 1.安装nginx并进行测试 1.1使用nginx -v 命令查看版本 1.2开启服务 查看端口 1.3测试 2.nginx的静态资源访问配置 2.1创建静态资源存放的目录 2.2写入目录中测试文件对应的内容 2.3修改配置文件 2.4 测试 3.虚拟主机配置 3.1创建目录 3.2写入测试…

任务记录.

播放器端的解码同步问题 miracast的投屏问题&#xff0c;进行修改的问题。 播放器ffplay命令没有声音的修改问题。 任务&#xff1a;如何将断开连接后在连接发送的数据&#xff0c;两秒后再去显示。 猜测&#xff1a; 一直在监听。断开后要求2秒后的数据再显示。那么也就是认为…

SpringBoot --条件注解与属性绑定

1. 条件注解 如果注解指定的条件成立&#xff0c;则触发指定行为。在前文介绍自动配置机制时&#xff0c;也可以看到在SpringBoot的源码中使用了该注解。 常用的条件注解主要有以下四个&#xff1a; ConditionalOnClass&#xff1a;如果类路径中存在这个类&#xff0c;则触发…