【100天精通python】Day45:python网络爬虫开发_ Scrapy 爬虫框架
目录
1 Scrapy 的简介
2 Scrapy选择器
3 快速创建Scrapy 爬虫
4 下载器与爬虫中间件
5 使用管道Pielines
1 Scrapy 的简介
Scrapy 是一个用于爬取网站数据并进行数据提取的开源网络爬虫框架。它使用 Python 编程语言编写,并提供了一套强大的工具和库,帮助用户在网页上浏览和抓取数据。Scrapy 旨在简化爬虫开发流程,提供了高度可定制的机制来处理各种网站的数据抓取需求。
以下是 Scrapy 框架的一些主要特点和组件:
请求和响应管理: Scrapy 提供了一个异步的请求和响应管理系统,允许用户发出 HTTP 请求并处理返回的 HTML 或其他数据。
数据提取: Scrapy 使用基于 XPath 或 CSS 选择器的数据提取方法,使用户能够方便地从网页中提取所需数据。
中间件: Scrapy 允许用户定义中间件来自定义请求和响应的处理过程,例如修改请求头、处理代理等。
管道: 管道是 Scrapy 中用于处理数据的组件,您可以在管道中对抓取到的数据进行清洗、处理、存储等操作。
调度器: 调度器负责管理请求的发送顺序,以及处理并发请求的方式,确保爬虫在合理的速率下访问网站。
自动限速: Scrapy 自带自动限速功能,以避免对目标网站造成过多负担。
异步支持: Scrapy 支持异步处理,能够高效地执行多个请求和处理操作。
扩展性: 您可以根据需要编写扩展来定制 Scrapy 的行为,如添加新的中间件、管道等。
命令行工具: Scrapy 提供了命令行工具,方便用户创建、管理和运行爬虫。
文档丰富: Scrapy 提供详细的官方文档和教程,使新用户能够快速入门,并且为高级用户提供深入了解框架的资源。
总之,Scrapy 是一个功能强大且高度可定制的网络爬虫框架,适用于各种规模的数据抓取项目,从简单的数据收集任务到复杂的数据挖掘和分析。无论您是初学者还是有经验的开发人员,都可以利用 Scrapy 快速有效地构建和管理爬虫。
2 Scrapy选择器
Scrapy 提供了两种主要的选择器用于从网页中提取数据:基于 XPath 的选择器和基于 CSS 的选择器。这两种选择器都能够让您轻松地从 HTML 或 XML 文档中定位和提取所需的数据。
基于 XPath 的选择器: XPath(XML Path Language)是一种用于在 XML 文档中定位元素的语言。在 Scrapy 中,XPath 选择器允许您通过路径表达式来选择和提取数据。以下是一些常见的 XPath 表达式示例:
- 选择元素:
//elementName
(选取所有名称为 elementName 的元素)- 选择特定路径下的元素:
//parent/child
(选取 parent 元素下的所有 child 元素)- 选择具有特定属性的元素:
//element[@attribute='value']
(选取具有 attribute 属性且值为 value 的元素)基于 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 爬虫可以分为以下几个步骤。以下示例将引导您创建一个爬取名言的简单爬虫。
- 安装 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_urls
和 parse
方法:
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.MyDownloaderMiddleware
和myproject.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_spider
和close_spider
方法在爬虫开始和结束时分别被调用,打开和关闭数据文件。process_item
方法将数据提取并保存到 JSON 文件中。通过配置和编写自定义的管道类,您可以对爬取到的数据进行各种操作,从而实现高度定制化的数据处理流程。
相关文章:
【100天精通python】Day45:python网络爬虫开发_ Scrapy 爬虫框架
目录 1 Scrapy 的简介 2 Scrapy选择器 3 快速创建Scrapy 爬虫 4 下载器与爬虫中间件 5 使用管道Pielines 1 Scrapy 的简介 Scrapy 是一个用于爬取网站数据并进行数据提取的开源网络爬虫框架。它使用 Python 编程语言编写,并提供了一套强大的工具和库࿰…...

怎么写出更好的高质量内容输出
为了更好地输出高质量的内容,不仅仅需要了解写作的基本原则,还需要深入挖掘目标读者的需求、持续的自我提升以及对信息的严格筛选。以下是一些建议,帮助你更好地输出高质量的内容: 1.充分了解你的受众 调查和了解你的目标读者&am…...

HJ31 单词倒排 题解
题目描述:单词倒排_牛客题霸_牛客网 (nowcoder.com) 对字符串中的所有单词进行倒排。 1、构成单词的字符只有26个大写或小写英文字母; 2、非构成单词的字符均视为单词间隔符; 3、要求倒排后的单词间隔符以一个空格表示;如果原字符…...

LeetCode42.接雨水
这道题呢可以按列来累加,就是先算第1列的水的高度然后再加上第2列水的高度……一直加到最后就是能加的水的高度,我想到了这里然后就想第i列的水其实就是第i-1列和i1列中最小的高度减去第i列的高度,但是其实并不是,比如示例中的第5…...

优化时间流:区间调度问题的探索与解决
在浩如烟海的信息时代,时间的有效管理成为了一门不可或缺的艺术。无论是生活中的琐事,还是工作中的任务,时间都在无声地流逝,挑战着我们的智慧。正如时间在日常生活中具有的宝贵价值一样,在计算机科学领域,…...

【Python】强化学习:原理与Python实战
搞懂大模型的智能基因,RLHF系统设计关键问答 RLHF(Reinforcement Learning with Human Feedback,人类反馈强化学习)虽是热门概念,并非包治百病的万用仙丹。本问答探讨RLHF的适用范围、优缺点和可能遇到的问题ÿ…...
设计模式——合成复用原则
文章目录 合成复用原则设计原则核心思想合成案例聚合案例继承案例优缺点 合成复用原则 原则是尽量使用合成/聚合的方式,而不是使用继承 设计原则核心思想 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。…...

基于OpenCV实战(基础知识一)
目录 简介 1.计算机眼中的图像 2.图片的读取、显示与保存 3.视频的读取与显示 简介 OpenCV是一个流行的开源计算机视觉库,由英特尔公司发起发展。它提供了超过2500个优化算法和许多工具包,可用于灰度、彩色、深度、基于特征和运动跟踪等的图像处理和…...
如何高效的接入第三方接口
作为程序员的我们,经常会接到领导的安排,接入某某的接口,方面我们如何如何, 例如:领导在1号时给作为员工的你说,最近系统需要增加一个新的支付方式,一会和对方技术组建一个群,有什么问题,可以直接在群里说,最近还说,尽快接入,客户等着用,让你在5号前,完成接入工…...
docker pip下载依赖超时或失败问题解决
Docker容器使用pip安装Python库时超时,可能是由于多种原因。以下是一些建议和解决方法: 使用国内镜像源: 如果你位于中国,可以尝试更换到国内的镜像源。例如,可以使用阿里云、腾讯云、清华大学提供的镜像。 你可以在Dockerfile中添…...

python并发编程
一、程序提速的方法 二、python对并发编程的支持 多线程:threading,利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成;多进程:multiprocess,利用多核CPU的能力,真正的并行执行任务&am…...
【面试题】:前端怎么实现权限设计及遇到的bug
一.权限的概念 前端权限分为页面权限、按钮权限、API权限。 二.页面权限的实现过程 ①用户登录进去调用获取用户信息接口,后端会给我们返回一个权限标识符 ②在获取到数据之后,我们就要判断用户能访问到哪些页面,我们可以在vuex中permission模块中的action…...

Vue 2 插槽
可以先阅读组件基础-简单了解通过插槽分发内容。 一、插槽定义 插槽将子组件标签间的内容分发到子组件模板的<slot>标签位置。 如果没有<slot>标签,那么该内容将被丢弃。 二、编译作用域 内容在哪个作用域编译,就可以访问哪个作用域的数据…...

Spring 容器启动耗时统计
为了了解 Spring 为什么会启动那么久,于是看了看怎么统计一下加载 Bean 的耗时。 极简版 几行代码搞定。 import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor;import java.util.HashMap; imp…...
1. 优化算法学习
参考文献 1609:An overview of gradient descent optimization algorithms 从 SGD 到 Adam —— 深度学习优化算法概览(一) - 知乎 机器学习札记 - 知乎...

再获荣誉丨通付盾WAAP解决方案获“金鼎奖”优秀金融科技解决方案
今年四月,2023中国国际金融展在首钢会展中心成功落下帷幕。中国国际金融展作为金融开放创新成果的展示、交流、传播平台,历经多年发展,已成为展示中国金融发展成就、宣传金融改革成果、促进金融产业创新和推动金融信息化发展的有效平台。 “金鼎奖”评选…...

【腾讯云 TDSQL-C Serverless 产品测评】“橡皮筋“一样的数据库『MySQL高压篇』
【腾讯云 TDSQL-C Serverless 产品测评】"橡皮筋"一样的数据库 活动介绍服务一览何为TDSQL ?Serverless 似曾相识? 降本增效,不再口号?动手环节 --- "压力"山大实验前瞻稍作简介资源扩缩范围(CCU&…...
python http文件上传
server端代码 import os import cgi from http.server import SimpleHTTPRequestHandler, HTTPServer# 服务器地址和端口 host = 0.0.0.0 port = 8080# 处理文件上传的请求 class FileUploadHandler(SimpleHTTPRequestHandler):def do_POST(self):# 解析多部分表单数据form = …...

Android学习之路(9) Intent
Intent 是一个消息传递对象,您可以用来从其他应用组件请求操作。尽管 Intent 可以通过多种方式促进组件之间的通信,但其基本用例主要包括以下三个: 启动 Activity Activity 表示应用中的一个屏幕。通过将 Intent 传递给 startActivity()&…...

vue项目配置git提交规范
vue项目配置git提交规范 一、背景介绍二、husky、lint-staged、commitlint/cli1.husky2.lint-staged3.commitlint/cli 三、具体使用1.安装依赖2.运行初始化脚本3.在package.json中配置lint-staged4.根目录新增 commitlint.config.js 4.提交测试1.提示信息格式错误时2.eslint校验…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...