【100天精通python】Day45:python网络爬虫开发_ Scrapy 爬虫框架

目录

1 Scrapy 的简介

2 Scrapy选择器

3 快速创建Scrapy 爬虫

4 下载器与爬虫中间件

5 使用管道Pielines


1 Scrapy 的简介

Scrapy 是一个用于爬取网站数据并进行数据提取的开源网络爬虫框架。它使用 Python 编程语言编写,并提供了一套强大的工具和库,帮助用户在网页上浏览和抓取数据。Scrapy 旨在简化爬虫开发流程,提供了高度可定制的机制来处理各种网站的数据抓取需求。

以下是 Scrapy 框架的一些主要特点和组件:

  1. 请求和响应管理: Scrapy 提供了一个异步的请求和响应管理系统,允许用户发出 HTTP 请求并处理返回的 HTML 或其他数据。

  2. 数据提取: Scrapy 使用基于 XPath 或 CSS 选择器的数据提取方法,使用户能够方便地从网页中提取所需数据。

  3. 中间件: Scrapy 允许用户定义中间件来自定义请求和响应的处理过程,例如修改请求头、处理代理等。

  4. 管道: 管道是 Scrapy 中用于处理数据的组件,您可以在管道中对抓取到的数据进行清洗、处理、存储等操作。

  5. 调度器: 调度器负责管理请求的发送顺序,以及处理并发请求的方式,确保爬虫在合理的速率下访问网站。

  6. 自动限速: Scrapy 自带自动限速功能,以避免对目标网站造成过多负担。

  7. 异步支持: Scrapy 支持异步处理,能够高效地执行多个请求和处理操作。

  8. 扩展性: 您可以根据需要编写扩展来定制 Scrapy 的行为,如添加新的中间件、管道等。

  9. 命令行工具: Scrapy 提供了命令行工具,方便用户创建、管理和运行爬虫。

  10. 文档丰富: Scrapy 提供详细的官方文档和教程,使新用户能够快速入门,并且为高级用户提供深入了解框架的资源。

总之,Scrapy 是一个功能强大且高度可定制的网络爬虫框架,适用于各种规模的数据抓取项目,从简单的数据收集任务到复杂的数据挖掘和分析。无论您是初学者还是有经验的开发人员,都可以利用 Scrapy 快速有效地构建和管理爬虫。

2 Scrapy选择器

        Scrapy 提供了两种主要的选择器用于从网页中提取数据:基于 XPath 的选择器和基于 CSS 的选择器。这两种选择器都能够让您轻松地从 HTML 或 XML 文档中定位和提取所需的数据。

  1. 基于 XPath 的选择器: XPath(XML Path Language)是一种用于在 XML 文档中定位元素的语言。在 Scrapy 中,XPath 选择器允许您通过路径表达式来选择和提取数据。以下是一些常见的 XPath 表达式示例:

    • 选择元素://elementName(选取所有名称为 elementName 的元素)
    • 选择特定路径下的元素://parent/child(选取 parent 元素下的所有 child 元素)
    • 选择具有特定属性的元素://element[@attribute='value'](选取具有 attribute 属性且值为 value 的元素)
  2. 基于 CSS 的选择器: CSS(Cascading Style Sheets)选择器在网页设计中常用于样式设置,但它们也可以用于从 HTML 文档中选择元素。Scrapy 中的 CSS 选择器允许您使用类似于 CSS 选择器的语法来定位和提取数据。以下是一些常见的 CSS 选择器示例:

    • 选择元素:elementName(选取所有名称为 elementName 的元素)
    • 选择类:.className(选取所有具有 className 类的元素)
    • 选择 ID:#idName(选取具有 idName ID 的元素)
    • 选择路径下的元素:parent > child(选取 parent 元素下的所有 child 元素)

在 Scrapy 中,您可以使用这些选择器来定位和提取网页中的数据。以下是使用 Scrapy 选择器的示例代码:

from scrapy.selector import Selectorhtml_content = """
<html><body><div class="container"><h1>Title</h1><p>Paragraph 1</p><p>Paragraph 2</p></div></body>
</html>
"""selector = Selector(text=html_content)# 使用 XPath 选择器提取数据
title = selector.xpath("//h1/text()").get()
paragraphs = selector.xpath("//p/text()").getall()# 使用 CSS 选择器提取数据
title = selector.css("h1::text").get()
paragraphs = selector.css("p::text").getall()

无论您选择使用 XPath 还是 CSS 选择器,Scrapy 都提供了方便的方法来从网页中提取所需的数据,使数据抓取任务变得更加简单和高效。 

3 快速创建Scrapy 爬虫

        创建一个简单的 Scrapy 爬虫可以分为以下几个步骤。以下示例将引导您创建一个爬取名言的简单爬虫。

  1. 安装 Scrapy: 首先,您需要确保已经安装了 Python 和 Scrapy。如果尚未安装 Scrapy,可以使用以下命令进行安装:
pip install scrapy

创建新的 Scrapy 项目: 在命令行中,导航到您希望创建项目的目录,并运行以下命令来创建新的 Scrapy 项目:

scrapy startproject quotes_spider

这将在当前目录下创建一个名为 "quotes_spider" 的项目目录。

(1)创建爬虫: 在项目目录下,进入到 "quotes_spider" 目录,并运行以下命令来创建一个爬虫:

cd quotes_spider
scrapy genspider quotes quotes.toscrape.com

这将创建一个名为 "quotes" 的爬虫,它将从 "quotes.toscrape.com" 网站爬取数据。

(2)编辑爬虫代码: 在 "quotes_spider/spiders" 目录下找到名为 "quotes.py" 的文件,这是刚刚创建的爬虫文件。使用您喜欢的编辑器打开该文件,并编辑 start_urlsparse 方法:

import scrapyclass QuotesSpider(scrapy.Spider):name = "quotes"start_urls = ['http://quotes.toscrape.com/page/1/',]def parse(self, response):for quote in response.css('div.quote'):yield {'text': quote.css('span.text::text').get(),'author': quote.css('span small::text').get(),}next_page = response.css('li.next a::attr(href)').get()if next_page is not None:yield response.follow(next_page, self.parse)

在这个示例爬虫中,我们从名言网站爬取名言文本和作者信息。parse 方法负责从网页中提取数据,并通过使用 response.follow 方法来跟踪下一页链接。

(3)运行爬虫: 回到项目目录("quotes_spider" 目录)并运行以下命令来运行爬虫:

scrapy crawl quotes

        爬虫将开始访问起始 URL,抓取数据并显示在终端上。

        这是一个简单的 Scrapy 爬虫创建过程示例。实际上,您可以根据需要定制爬虫的各个方面,包括请求头、管道、中间件等。通过阅读 Scrapy 的官方文档,您可以深入了解如何创建更复杂和定制的爬虫。

4 下载器与爬虫中间件

        在 Scrapy 框架中,下载器中间件和爬虫中间件是两种不同类型的中间件,用于在请求/响应的处理流程中插入自定义的逻辑。它们分别位于请求的发送和响应的接收过程中,允许您对网络请求和数据处理进行修改和控制。

下载器中间件(Downloader Middleware): 下载器中间件位于请求发送过程中,负责对请求进行处理,以及在响应返回之前的操作。这些中间件可以用于修改请求头、设置代理、处理cookies等。下载器中间件可以在全局范围或特定爬虫范围内进行配置。

一些常见的下载器中间件操作包括:

  • 修改请求头,以模拟不同类型的浏览器请求。
  • 配置代理服务器,用于隐藏爬虫的真实 IP 地址。
  • 处理 cookies,以保持会话状态。
  • 对请求进行重试和错误处理。
  • 控制请求的并发性。

爬虫中间件(Spider Middleware): 爬虫中间件位于响应接收和数据处理过程中,负责对响应和提取的数据进行处理。这些中间件可以用于修改爬取到的数据、处理异常、进行数据转换等。爬虫中间件可以在全局范围或特定爬虫范围内进行配置。

一些常见的爬虫中间件操作包括:

  • 对从网页中提取的数据进行预处理和清洗。
  • 自定义数据转换,如日期格式化、文本处理等。
  • 处理异常,如被封 IP 的处理策略。
  • 控制数据的流向和过滤。

配置中间件在 Scrapy 的 settings.py 文件中进行。您可以为每个中间件设置优先级,以确定它们在处理流程中的顺序。更具体地说,下载器中间件的优先级较高的将首先处理请求,而爬虫中间件的优先级较高的将首先处理响应和提取的数据。

以下是一个简单的示例,展示了如何配置下载器和爬虫中间件:

# settings.pyDOWNLOADER_MIDDLEWARES = {'myproject.middlewares.MyDownloaderMiddleware': 543,
}SPIDER_MIDDLEWARES = {'myproject.middlewares.MySpiderMiddleware': 543,
}

        在上面的示例中,myproject.middlewares.MyDownloaderMiddlewaremyproject.middlewares.MySpiderMiddleware 分别是自定义的下载器和爬虫中间件。它们的优先级设置为 543。

        通过使用下载器和爬虫中间件,您可以在请求和响应的处理流程中插入自定义的逻辑,实现更灵活、高效和符合您需求的爬虫。

5 使用管道Pielines

        在 Scrapy 中,管道(Pipeline)是用于处理爬虫抓取到的数据的组件。它允许您在数据从爬虫抓取到最终保存或处理的过程中进行多个操作,如数据清洗、验证、存储到数据库、导出到文件等。Scrapy 的管道提供了一种灵活且可定制的方式来处理爬取的数据流。

以下是如何使用管道来处理爬取到的数据:

(1)启用管道: 在 Scrapy 的配置文件(settings.py)中,您需要启用并配置管道。您可以在 ITEM_PIPELINES 设置中指定要使用的管道类及其优先级。优先级是一个整数值,较小的值表示较高的优先级。

# settings.pyITEM_PIPELINES = {'myproject.pipelines.MyPipeline': 300,
}

在上面的示例中,myproject.pipelines.MyPipeline 是您自定义的管道类,优先级被设置为 300。

(2)创建管道类: 在项目中创建一个管道类,该类将处理爬虫抓取到的数据。您需要实现一些方法来处理数据,例如 process_item 方法。

# pipelines.pyclass MyPipeline:def process_item(self, item, spider):# 在这里处理数据,可以进行清洗、验证、存储等操作return item

在上面的示例中,process_item 方法接收两个参数:item 表示爬虫抓取到的数据项,spider 表示当前爬虫实例。

(3)处理数据: 在管道类的 process_item 方法中,您可以对数据进行各种操作,如数据清洗、格式化、验证等。您还可以将数据保存到数据库、导出到文件等。

以下是一个简单的示例,展示了如何在管道中处理爬取到的数据并保存到 JSON 文件中:

# pipelines.pyimport jsonclass MyPipeline:def open_spider(self, spider):self.file = open('data.json', 'w')def close_spider(self, spider):self.file.close()def process_item(self, item, spider):data = {'text': item['text'],'author': item['author']}json.dump(data, self.file)self.file.write('\n')return item

在上面的示例中,open_spiderclose_spider 方法在爬虫开始和结束时分别被调用,打开和关闭数据文件。process_item 方法将数据提取并保存到 JSON 文件中。

通过配置和编写自定义的管道类,您可以对爬取到的数据进行各种操作,从而实现高度定制化的数据处理流程。

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

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

相关文章

Kali Linux 2023.3 发布

Offective Security 发布了 Kali Linux 2023.3&#xff0c;这是其渗透测试和数字取证平台的最新版本。 Kali Linux 2023.3 中的新工具 除了对当前工具的更新之外&#xff0c;新版本的 Kali 通常还会引入新的工具。 这次&#xff0c;他们是&#xff1a; Calico – 云原生网络…

TypeC扩展芯片|TypeC音视频转换芯片|ASL集睿致远|方案选型

ASL集睿致远专注于研发交付高速接口连接和多媒体应用的竞争解决方案&#xff0c;广泛应用于移动和个人电脑市场&#xff0c;Typec扩展芯片&#xff0c;Typec音视频转换芯片。 ASL集睿致远拥有完整的内部设计流程&#xff0c;包括模拟、数字、混合模式和后端流程。完整的集成电路…

ubuntu20.04 直接安装vpp23.06 测试双 VPP Tunnel Ike2

环境信息&#xff1a;VMware Workstation 17 Pro ubuntu20.04 (清华源) ubuntu 源点进去选&#xff1a;ubuntu-22.04.3-desktop-amd64.iso 如果之前装过VPP&#xff0c;用以下命令确定是否卸载干净&#xff1a; dpkg -l | grep vpp dpkg -l | grep DPDK 卸载&#xff1a; …

【数据仓库】Linux、CentOS源码安装Superset

Linux、CentOS源码安装Superset步骤&#xff0c;遇到的各种问题。 报错问题&#xff1a; Linux下pip版本问题 You are using pip version 8.1.2, however version 22.2.2 is available. 解决办法&#xff1a; 安装python3的pip yum install python3-pip再升级 pip3 install…

stm32 之20.HC-06蓝牙模块

原理图显示使用usart3串口使用的是PB10和PB11引脚 直接配置usart3串口协议 void usart3_init(uint32_t baud) {GPIO_InitTypeDef GPIO_InitStructureure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;//端口B硬件时钟打开RCC_AHB1PeriphClockC…

如何通过tomcat下载映射下载文件

1.1找到tomcat服务器中server.xml文件 !--doBase是静态资源路径位置&#xff0c; path作用相当于设置的key, doBase作用相当于value --> <Context path"/download" docBase"E:\testBackData"></Context>1.2 找到tomcat服务器中web.xml文…

❤ Vue使用Eslint检测报错问题和解决

❤ Vue使用Eslint检测报错问题和解决 1、 关闭Eslint检测 关闭ESLint语法检测即可&#xff1a;具体步骤如下&#xff1a; 第一步我们打开setting设置&#xff1a; 打开左上角的file&#xff0c;然后点击setting 接下来进入setting以后我们来看下面操作&#xff1a; eol-l…

LAMP架构介绍配置命令讲解

LAMP架构介绍配置命令讲解 一、LAMP架构介绍1.1概述1.2LAMP各组件的主要作用1.3各组件的安装顺序 二、编译安装Apache httpd服务---命令讲解1、关闭防火墙&#xff0c;将安装Apache所需的软件包传到/opt/目录下2、安装环境依赖包3、配置软件模块4、编译安装5、优化配置文件路径…

鼠标拖拽盒子移动

目录 需求思路代码页面展示【补充】纯js实现 需求 浮动的盒子添加鼠标拖拽功能 思路 给需要拖动的盒子添加鼠标按下事件鼠标按下后获取鼠标点击位置与盒子边缘的距离给 document 添加鼠标移动事件鼠标移动过程中&#xff0c;将盒子的位置进行重新定位侦听 document 鼠标弹起&a…

iOS开发Swift-集合类型

集合基本类型&#xff1a;数组 Array (有序)&#xff0c; 集合 Set (无序不重复)&#xff0c; 字典 Dictionary (无序键值对) 1.数组 Arrays (1)数组的表示 Array<Element> [Element](2)创建空数组 var someInts: [Int] [] someInts.count //数组长度(3)带值数组 var…

Grounded Language-Image Pre-training论文笔记

Title&#xff1a;Grounded Language-Image Pre-training Code 文章目录 1. 背景2. 方法&#xff08;1&#xff09;Unified Formulation传统目标检测grounding目标检测 &#xff08;2&#xff09;Language-Aware Deep Fusion&#xff08;3&#xff09;Pre-training with Scala…

【linux】基本指令(二)【man、echo、cat、cp】

目录 一、man指令二、echo指令三、cat指令二、cp指令一些常见快捷键 一、man指令 Linux的命令有很多参数&#xff0c;我们不可能全记住&#xff0c;可以通过查看联机手册获取帮助。访问Linux手册页的命令是 man 语法: man [选项] 命令 常用选项 1.-k 根据关键字搜索联机帮助 2…

基于 SVG 的图形交互方案实践

不知道从什么时候起&#xff0c;人们开始喜欢上数字大屏这种“花里胡哨”的东西&#xff0c;仿佛只要用上“科技蓝”这样神奇的色调&#xff0c;就可以让一家公司焕然一新&#xff0c;瞬间变得科技感满满。不管数字大屏的实际意义&#xff0c;是用来帮助企业监控和决策&#xf…

Linux网络编程:线程池并发服务器 _UDP客户端和服务器_本地和网络套接字

文章目录&#xff1a; 一&#xff1a;线程池模块分析 threadpool.c 二&#xff1a;UDP通信 1.TCP通信和UDP通信各自的优缺点 2.UDP实现的C/S模型 server.c client.c 三&#xff1a;套接字 1.本地套接字 2.本地套 和 网络套对比 server.c client.c 一&#xff1a;线…

electron软件安装时,默认选择为全部用户安装

后续可能会用electron开发一些工具&#xff0c;包括不限于快速生成个人小程序、开发辅助学习的交互式软件、帮助运维同学一键部署的简易版CICD工具等等。 开发进度&#xff0c;取决于我懒惰的程度。 不过不嫌弃的同学还是可以先关注一波小程序&#xff0c;真的发布工具了&…

每日一学——防火墙

防火墙是网络安全的重要组成部分&#xff0c;可以帮助保护网络免受恶意攻击和未经授权的访问。以下是防火墙的基本配置步骤&#xff1a; 定义安全策略&#xff1a;防火墙通过安全策略来决定允许或拒绝网络流量。你需要定义适当的安全策略来保护你的网络。安全策略通常包括源IP地…

微软宣布在 Excel 中使用 Python:结合了 Python 的强大功能和 Excel 的灵活性。

自诞生以来&#xff0c;Microsoft Excel 改变了人们组织、分析和可视化数据的方式&#xff0c;为每天使用它的数百万人提供了决策基础。今天&#xff0c;我们宣布发布 Excel 中的 Python 公共预览版&#xff0c;从而使 Excel 中的分析功能取得重大进展。 Excel 中的 Python 可…

基于springboot+vue的考研资讯平台(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

vue-pc端禁止用户选中文字-右键-复制

前言 pc端开发中我们经常会遇见一些页面&#xff0c;会因为刷新&#xff0c;渲染&#xff0c;卡顿出现文字选中效果 或者一些敏感的页面我们不希望用户复制&#xff0c;选中&#xff0c;页面的文字信息&#xff0c;比如考试&#xff0c;敏感信息 其实这些也是可以通过代码控制…

【洛谷】P1873 [COCI2011-2012#5] EKO / 砍树

原题链接&#xff1a;https://www.luogu.com.cn/problem/P1873 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二分答案。 3. 代码实现 #include<bits/stdc.h> using namespace std; #define ll long long const int N 1e6 10; int a[N], …