Python 网络爬虫高级教程:分布式爬取与大规模数据处理

经过基础爬虫和进阶爬虫的学习,我们已经掌握了爬虫的基本原理、动态内容处理及反爬机制的应对。然而,当我们面对海量数据或需要高效爬取多个站点时,分布式爬虫和数据存储、处理能力就显得尤为重要。本篇博客将带你迈向网络爬虫的高级阶段,学习分布式爬取、大规模数据处理以及性能优化。


一、分布式爬虫的概念

1. 什么是分布式爬虫?

分布式爬虫是指通过多个节点协作完成大规模网页爬取任务的爬虫架构。它能有效解决以下问题:

  • 单台机器性能瓶颈(CPU、内存、网络带宽)。
  • 爬取任务量大时的效率问题。
  • 减少单个 IP 被封禁的风险。

2. 分布式爬虫的架构

分布式爬虫通常由以下部分组成:

  1. 任务队列:存储待爬取的 URL 列表。
  2. 多个爬虫节点:从任务队列中取出任务并执行爬取。
  3. 数据存储:将爬取的数据存储到数据库或文件中。
  4. 任务调度器:控制任务的分发和爬取状态。

二、使用 Scrapy 实现分布式爬虫

1. 安装 Scrapy 和 Scrapy-Redis

Scrapy 是一个强大的 Python 爬虫框架,支持分布式爬取。我们还需要 Scrapy-Redis 来实现任务队列的共享。

安装依赖库:

pip install scrapy scrapy-redis

2. Scrapy 项目结构

使用 Scrapy 创建一个新项目:

scrapy startproject distributed_crawler

项目结构:

distributed_crawler/
├── distributed_crawler/
│   ├── spiders/            # 爬虫文件目录
│   ├── __init__.py
│   ├── items.py            # 定义数据结构
│   ├── middlewares.py      # 爬虫中间件
│   ├── pipelines.py        # 数据存储管道
│   └── settings.py         # 项目配置
├── scrapy.cfg

3. 配置分布式功能

settings.py 中,配置 Scrapy-Redis:

# 使用 Scrapy-Redis 的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 使用 Scrapy-Redis 的去重类
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"# 配置 Redis 地址
REDIS_HOST = 'localhost'
REDIS_PORT = 6379# 是否持久化队列,True 表示爬取完成后保留任务队列
SCHEDULER_PERSIST = True

4. 编写爬虫

spiders 目录下创建爬虫文件 quotes_spider.py

import scrapy
from scrapy_redis.spiders import RedisSpiderclass QuotesSpider(RedisSpider):name = "quotes"# 从 Redis 获取初始 URLredis_key = "quotes:start_urls"def parse(self, response):for quote in response.css("div.quote"):yield {"text": quote.css("span.text::text").get(),"author": quote.css("small.author::text").get(),}# 爬取下一页next_page = response.css("li.next a::attr(href)").get()if next_page:yield response.follow(next_page, self.parse)

5. 配置 Redis 并运行

启动 Redis

确保 Redis 服务正在运行:

redis-server
添加起始 URL

将 URL 推送到 Redis:

redis-cli
> lpush quotes:start_urls http://quotes.toscrape.com
启动爬虫

运行爬虫:

scrapy crawl quotes

此时,多个爬虫节点可以通过共享 Redis 队列协作完成任务。


三、大规模数据处理与存储

分布式爬虫会产生大量数据,如何存储和处理这些数据是另一个重要问题。


1. 数据库存储

使用 MongoDB 存储数据

pipelines.py 中配置 MongoDB 数据存储:

import pymongoclass MongoPipeline:def open_spider(self, spider):self.client = pymongo.MongoClient("localhost", 27017)self.db = self.client["quotes_db"]def close_spider(self, spider):self.client.close()def process_item(self, item, spider):self.db["quotes"].insert_one(dict(item))return item

settings.py 中启用管道:

ITEM_PIPELINES = {'distributed_crawler.pipelines.MongoPipeline': 300,
}

2. 数据清洗与分析

爬取数据后,可以使用 Pandas 进行数据清洗和分析:

import pandas as pd# 读取数据
data = pd.read_json("quotes.json")# 数据清洗
data = data.drop_duplicates()  # 去重# 数据分析
author_counts = data["author"].value_counts()
print(author_counts)

3. 分布式存储与处理(可选)

对于更大规模的数据,可以使用分布式存储和处理工具:

  • 存储:使用 Hadoop HDFS 或 Amazon S3。
  • 处理:使用 Apache Spark 或 Hive。

四、性能优化


1. 增加爬虫节点

在分布式架构中,可以通过增加爬虫节点数量来提升效率。

配置多个节点时,只需共享相同的 Redis 配置,每个节点运行:

scrapy crawl quotes

2. 限制并发数

为了避免服务器封禁,可以限制爬取速度和并发数:

settings.py 中添加:

DOWNLOAD_DELAY = 1  # 请求间隔时间,单位秒
CONCURRENT_REQUESTS = 8  # 最大并发请求数

3. 错误重试与代理

错误重试

配置重试机制:

RETRY_ENABLED = True
RETRY_TIMES = 3  # 重试次数
使用代理池

通过免费或付费代理池切换 IP,防止被封禁。

DOWNLOADER_MIDDLEWARES = {'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,'distributed_crawler.middlewares.ProxyMiddleware': 100,
}

五、实战案例:分布式新闻爬虫

以下是一个分布式爬虫抓取新闻网站标题和链接的示例。

import scrapy
from scrapy_redis.spiders import RedisSpiderclass NewsSpider(RedisSpider):name = "news"redis_key = "news:start_urls"def parse(self, response):for article in response.css("div.article"):yield {"title": article.css("h2.title::text").get(),"link": article.css("a::attr(href)").get(),}# 爬取下一页next_page = response.css("a.next::attr(href)").get()if next_page:yield response.follow(next_page, self.parse)

六、总结

通过本篇博客,你学习了:

  1. 使用 Scrapy 和 Scrapy-Redis 实现分布式爬虫。
  2. 将爬取数据存储到 MongoDB,并进行数据清洗和分析。
  3. 优化爬虫性能的方法,包括并发限制和代理池。

下一步,你可以尝试构建一个分布式爬虫项目,如爬取多个电商网站的商品价格,并整合大规模数据分析。分布式爬虫不仅提升效率,还能应对复杂的网络爬取任务。继续深挖,你将能驾驭更多高级应用场景!

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

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

相关文章

Android so库的编译

在没弄明白so库编译的关系前,直接看网上博主的博文,常常会觉得云里雾里的,为什么一会儿通过Android工程cmake编译,一会儿又通过NDK命令去编译。两者编译的so库有什么区别? android版第三方库编译总体思路: 对于新手小白来说搞明白上面的总体思路图很有必…

Java函数式编程+Lambda表达式

文章目录 函数式编程介绍纯函数Lambda表达式基础Lambda的引入传统方法1. 顶层类2. 内部类3. 匿名类 Lambda 函数式接口(Functional Interface)1. **函数式接口的定义**示例: 2. **函数式接口与Lambda表达式的关系**关联逻辑:示例&…

Linux操作系统2-进程控制3(进程替换,exec相关函数和系统调用)

上篇文章:Linux操作系统2-进程控制2(进程等待,waitpid系统调用,阻塞与非阻塞等待)-CSDN博客 本篇代码Gitee仓库:Linux操作系统-进程的程序替换学习 d0f7bb4 橘子真甜/linux学习 - Gitee.com 本篇重点:进程替换 目录 …

文件上传漏洞:你的网站安全吗?

文章目录 文件上传漏洞攻击方式:0x01绕过前端限制0x02黑名单绕过1.特殊解析后缀绕过2..htaccess解析绕过3.大小写绕过4.点绕过5.空格绕过6.::$DATA绕过7.配合中间件解析漏洞8.双后缀名绕过9.短标签绕过 0x03白名单绕过1.MIME绕过(Content-Type绕过)2.%00截断3.0x00截…

设计模式-适配器模式-注册器模式

设计模式-适配器模式-注册器模式 适配器模式 如果开发一个搜索中台,需要适配或接入不同的数据源,可能提供的方法参数和平台调用的方法参数不一致,可以使用适配器模式 适配器模式通过封装对象将复杂的转换过程隐藏于幕后。 被封装的对象甚至…

springboot341+vue校园求职招聘系统设计和实现pf(论文+源码)_kaic

毕 业 设 计(论 文) 校园求职招聘系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,…

基于java web的网上书店系统设计

摘 要 随着互联网的越发普及,网上购物成为了当下流行的热门行为。网络上开店创业有许多的优势:投入少,启动 资金低,交易便捷。网上书店与传统的线下书店比起来优势巨大,网上书店的经营方式和销售渠道是不同与线下书 店…

Java设计模式——职责链模式:解锁高效灵活的请求处理之道

嘿,各位 Java 编程大神和爱好者们!今天咱们要一同深入探索一种超厉害的设计模式——职责链模式。它就像一条神奇的“处理链”,能让请求在多个对象之间有条不紊地传递,直到找到最合适的“处理者”。准备好跟我一起揭开它神秘的面纱…

Android 设备使用 Wireshark 工具进行网络抓包

背景 电脑和手机连接同一网络,想使用wireshark抓包工具抓取Android手机网络日志,有以下两种连接方法: Wi-Fi 网络抓包。USB 网络共享抓包。需要USB 数据线将手机连接到电脑,并在开发者模式中启用 USB 网络共享。 查看设备连接信…

redis大key和热key

redis中大key、热key 什么是大key大key可能产生的原因大key可能会造成什么影响如何检测大key如何优化删除大key时可能的问题删除大key的策略 热key热key可能导致的问题解决热key的方法 什么是大key 大key通常是指占用内存空间过大或包含大量元素的键值对。 数据量大&#xff…

SpringBoot源码-spring boot启动入口ruan方法主线分析(二)

12.刷新前操作 // 刷新前操作prepareContext(context, environment, listeners, applicationArguments, printedBanner);进入prepareContext private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment,SpringApplicationRun…

使用 VLC 在本地搭建流媒体服务器 (详细版)

提示:详细流程 避坑指南 Hi~!欢迎来到碧波空间,平时喜欢用博客记录学习的点滴,欢迎大家前来指正,欢迎欢迎~~ ✨✨ 主页:碧波 📚 📚 专栏:音视频 目录 借助VLC media pl…

【单片机毕业设计12-基于stm32c8t6的智能称重系统设计】

【单片机毕业设计12-基于stm32c8t6的智能称重系统设计】 前言一、功能介绍二、硬件部分三、软件部分总结 前言 🔥这里是小殷学长,单片机毕业设计篇12-基于stm32c8t6的智能称重系统设计 🧿创作不易,拒绝白嫖可私 一、功能介绍 ----…

51单片机快速入门之中断的应用 2024/11/23 串口中断

51单片机快速入门之中断的应用 基本函数: void T0(void) interrupt 1 using 1 { 这里放入中断后需要做的操作 } void T0(void): 这是一个函数声明,表明函数 T0 不接受任何参数,并且不返回任何值。 interrupt 1: 这是关键字和参…

输入json 达到预览效果

下载 npm i vue-json-pretty2.4.0 <template><div class"newBranchesDialog"><t-base-dialogv-if"addDialogShow"title"Json数据配置"closeDialog"closeDialog":dialogVisible"addDialogShow":center"…

ML 系列:第 32节 — 机器学习中的统计简介

文章目录 一、说明二、统计概述三、描述性统计与推断性统计3.1 描述统计学3.2 推论统计 四、描述性统计中的均值、中位数和众数 一、说明 机器学习中的统计 随着我们深入研究机器学习领域&#xff0c;了解统计学在该领域的作用至关重要。统计学是机器学习的支柱&#xff0c;它…

大数据新视界 -- Hive 数据分区:精细化管理的艺术与实践(上)(7/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

VTK的基本概念(一)

文章目录 三维场景的基本要素1.灯光2.相机3.颜色4.纹理映射 三维场景的基本要素 1.灯光 在三维渲染场景中&#xff0c;可以有多个灯光的存在&#xff0c;灯光和相机是三维渲染场景的必备要素&#xff0c;如果没有指定的话&#xff0c;vtkRenderer会自动创建默认的灯光和相机。…

简单好用的折线图绘制!

折线图的概念及作用&#xff1a; 折线图&#xff08;Line Chart&#xff09;是一种常见的图表类型&#xff0c;用于展示数据的变化趋势或时间序列数据。它通过一系列的数据点&#xff08;通常表示为坐标系中的点&#xff09;与这些点之间的线段相连&#xff0c;直观地展示变量…

简单线性DP

数字三角形--简单线性DP 题目链接&#xff1a;数字三角形 解题代码&#xff1a; import java.io.BufferedReader; import java.io.InputStreamReader;public class Main {static int N510;static int INF (int) -1e9;static String[] q;static int[][]fnew int[N][N];static …