网络爬虫框架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单元及配合本 公司多年积累开发的前置…

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

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

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;帮助用户诊断容器的行为和排查…

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;要使用文本编辑器来查看…

基于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写入测试…

配置visual studio code 用秘钥远程连接SSH服务器

配置visual studio code 用秘钥远程连接SSH服务器 文章目录 配置visual studio code 用秘钥远程连接SSH服务器简介1. 生成SSH密钥对2. 将公钥添加到Ubuntu服务器3. 将私钥添加到visual studio code的SSH配置文件中 简介 通过SSH密钥认证&#xff0c;用户无需在每次连接时输入密…

SOLIDWORKS教育版本的优点

SOLIDWORKS教育版本是一款专为教育机构和学生设计的三维CAD软件&#xff0c;它在工程设计和创新教育中发挥了重要的作用。本文旨在探讨SOLIDWORKS教育版本的优点&#xff0c;并分析其如何帮助学生和教师提升工程设计和创新能力。 首先&#xff0c;SOLIDWORKS教育版本具有易于学…

java 抠取红色印章(透明背景)

一个亲戚让我帮他把照片里的红色印章抠出来&#xff0c;&#xff0c;&#xff0c;记录下处理过程&#xff0c;代码如下&#xff0c;可直接用&#xff1a; public static void signatureProcess(String sourceImagePath, String targetImagePath) {Graphics2D graphics2D null…

卷积神经网络(CNN)——基础知识整理

文章目录 1、卷积神经网络 2、图片格式 3、图片卷积运算 4、Kernel 与 Feature Map 5、padding/边缘填充 6、Stride/步长 7、pooling/池化 8、shape 9、epoch、batch、Batch Size、step 10、神经网络 11、激活函数 1、卷积神经网络 既然叫卷积神经网络&#xff0c;这里面首先是…

JVM(一)——内存结构

一. 前言 1、什么是 JVM? 1&#xff09;定义&#xff1a; Java Virtual Machine - java 程序的运行环境&#xff08;java 二进制字节码的运行环境&#xff09; 2&#xff09;好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收功能数组下标越…

低压MOS在新能源园林机械上的应用-REASUNOS瑞森半导体

一、前言 在欧美地区&#xff0c;以锂电池为动力源的新能源园林机械迅速地替代着以往的燃油和交流电动力机器。而中国也将迎来一场风暴式革命。 园林工具是人类绿化景观的养护设备&#xff0c;是以养护草坪、绿篱、保护花草、树木为作业对象的&#xff0c;代替大部分手工劳动…

国内ip代理速度快的秘密

在互联网时代&#xff0c;IP代理已经成为许多网络用户、企业和开发者的重要工具。而在国内&#xff0c;由于网络环境的复杂性和特殊性&#xff0c;寻找一个速度快、稳定可靠的IP代理显得尤为重要。虎观代理将深入探讨国内IP代理速度快的秘密&#xff0c;并分析其带来的优势和应…