纯requests+Redis实现分布式爬虫(可视化4终端,模拟4台电脑联合爬取)
纯requestsRedis实现分布式爬虫可视化4终端模拟4台电脑联合爬取摘要本文详细讲解如何使用Python的requests库结合Redis实现分布式爬虫架构通过自动弹出4个可视化终端模拟4台电脑完成小说章节的分布式爬取、任务调度与数据汇总。全程不使用Scrapy框架不依赖多线程纯多进程Redis队列实现分布式协作适合爬虫初学者快速掌握分布式核心原理同时提供完整可运行代码、详细操作步骤、运行过程演示及常见问题排查助力大家轻松上手分布式爬虫开发。一、前言在爬虫开发中当面临IP限流、任务量巨大、单机爬取速度过慢等问题时分布式爬虫就成为了最优解决方案。必须使用多线程才能实现其实不然。本文将基于最基础的requests库用于发送网络请求、解析页面和Redis用于任务队列调度、实现多节点协作搭建一个可视化的分布式爬虫系统——通过一个启动文件自动弹出4个终端窗口模拟4台独立电脑实现多节点联合爬取所有爬取数据自动汇总到同一文件夹全程可见、可追溯完美还原分布式爬虫的核心工作流程。前置环境Windows系统、Python 3.7、Redis本地安装并启动、requests库、lxml库、redis库。这个仓库是社区维护的 Redis Windows 原生移植版官方 Redis 已不再提供 Windows 版本现在大家用的基本都是这个仓库的版本必须安装的依赖。主仓库地址https://github.com/tporadowski/redis二、前置环境准备2.1 环境安装首先确保已安装所需依赖库打开PowerShell或CMD执行以下命令安装pip install requests lxml redis说明requests用于发送HTTP请求获取网页内容lxml用于解析HTML页面提取小说章节标题和内容redis用于实现分布式任务队列协调4个终端节点的任务分配避免任务重复或遗漏。2.2 Redis启动验证分布式爬虫的核心是Redis任务队列因此必须确保Redis服务正常启动。启动Redis的步骤如下找到Redis安装目录如D:\tools\redis_box双击redis-server.exe启动Redis服务启动成功后终端会显示“Ready to accept connections”表示Redis已准备就绪可接受爬虫节点的连接注意Redis启动后不要关闭该窗口否则分布式爬虫无法连接到任务队列。Redis启动成功演示可在此粘贴自己的Redis启动运行过程# 此处粘贴你的Redis启动运行过程示例如下 [408] 15 Apr 18:05:21.322 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo [408] 15 Apr 18:05:21.322 # Redis version5.0.14.1, bits64, commitec77f72d, modified0, pid408, just started [408] 15 Apr 18:05:21.322 # Warning: no config file specified, using the default config. In order to specify a config file use d:\tools\redis_box\redis-server.exe /path/to/redis.conf _._ _.-__ -._ _.- . _. -._ Redis 5.0.14.1 (ec77f72d/0) 64 bit .- .-. \/ _.,_ -._ ( , .- | , ) Running in standalone mode |-._-...- __...-.-._| _.-| Port: 6379 | -._ ._ / _.- | PID: 408 -._ -._ -./ _.- _.- |-._-._ -.__.- _.-_.-| | -._-._ _.-_.- | http://redis.io -._ -._-.__.-_.- _.- |-._-._ -.__.- _.-_.-| | -._-._ _.-_.- | -._ -._-.__.-_.- _.- -._ -.__.- _.- -._ _.- -.__.- [408] 15 Apr 18:05:21.327 # Server initialized [408] 15 Apr 18:05:21.327 * DB loaded from disk: 0.000 seconds [408] 15 Apr 18:05:21.327 * Ready to accept connections三、分布式爬虫核心原理本文实现的分布式爬虫核心架构为“1个任务生产者 Redis任务队列 4个任务消费者可视化终端”模拟4台电脑联合爬取具体原理如下集成中心producer.py负责访问小说目录页提取前10章的章节链接将链接推入Redis队列相当于“任务调度中心”只需要运行一次完成任务初始化Redis任务队列作为分布式协作的核心存储所有待爬取的章节链接4个终端消费者同时从队列中获取任务确保任务不重复、不遗漏实现负载均衡工人worker.py每个终端运行一个消费者程序从Redis队列中获取章节链接使用requests爬取章节内容解析并保存到本地novel文件夹所有终端的爬取结果自动汇总到同一文件夹可视化终端通过启动脚本自动弹出4个独立的CMD窗口每个窗口对应一个消费者模拟一台电脑实时显示爬取进度直观感受分布式爬取的过程。关键说明本文实现的是“多进程分布式”而非多线程——每个终端是一个独立的进程不受Python GIL锁限制真正实现并行爬取比多线程更适合分布式扩展可轻松扩展到多台真实电脑。四、完整代码实现可直接复制运行本文共需要3个文件分别是任务生产者producer.py、任务消费者worker.py、全自动启动脚本start_all.py所有代码均经过实测可直接复制到同一文件夹下运行。4.1 任务生产者producer.py推任务到Redis功能访问小说目录页提取前10章的章节链接将链接推入Redis队列清空旧任务避免重复爬取。importrequestsfromlxmlimportetreeimportredis# 连接Redis服务默认端口6379本地连接无需修改rredis.Redis(decode_responsesTrue)r.delete(chapter_queue)# 清空旧任务避免重复爬取# 爬取配置目标小说目录页url_parthttps://www.biquge365.net# 网站基础域名url_htmlhttps://www.biquge365.net/newbook/83621/# 小说目录页URLheaders{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/138.0.0.0}# 访问目录页提取章节链接try:responserequests.get(urlurl_html,headersheaders)response.encodingutf-8# 设置编码避免中文乱码treeetree.HTML(response.text)# 解析HTML页面li_listtree.xpath(/html/body/div[1]/div[4]/ul/li)# 章节列表的XPathmax_chapter10# 设定爬取前10章chapter_count0# 计数控制爬取章节数量# 遍历章节列表提取链接并推入Redis队列forliinli_list:ifchapter_countmax_chapter:break# 提取章节链接相对路径拼接成完整URLchapter_hrefli.xpath(./a/href)[0]full_urlurl_partchapter_href# 将完整URL推入Redis队列lpush从队列左侧推入r.lpush(chapter_queue,full_url)chapter_count1print(f✅ 已成功推入{chapter_count}个章节任务到Redis队列等待节点爬取)exceptExceptionase:print(f❌ 任务推入失败错误信息{str(e)})4.2 任务消费者worker.py终端爬取核心功能每个终端运行该脚本从Redis队列中获取任务章节链接爬取章节内容解析标题和正文保存到本地novel文件夹实时输出爬取状态。importrequestsfromlxmlimportetreeimportosimportredisimporttime# 确保novel文件夹存在用于保存爬取的章节内容ifnotos.path.exists(novel):os.mkdir(novel)# 连接Redis队列与生产者连接同一Redis服务rredis.Redis(decode_responsesTrue)# 爬取配置与生产者一致避免请求被拦截headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/138.0.0.0}# 生成节点编号用时间戳取余区分4个终端node_idint(time.time()*1000)%1000print(f️ 分布式节点{node_id}已启动等待任务分配...)# 循环从Redis队列获取任务直到任务为空whileTrue:# 从Redis队列右侧取出一个任务rpop先进先出确保任务顺序chapter_urlr.rpop(chapter_queue)# 若队列中无任务退出循环节点完成工作ifnotchapter_url:print(f️ 节点{node_id}所有任务已完成退出爬取)breaktry:# 发送请求获取章节页面内容responserequests.get(urlchapter_url,headersheaders,timeout10)response.encodingutf-8treeetree.HTML(response.text)# 解析章节标题XPath匹配章节标题标签title_listtree.xpath(//*[idneirong]/h1/text())chapter_titletitle_list[0].strip()iftitle_listelsef未知章节_{node_id}# 解析章节正文XPath匹配正文内容过滤空行text_listtree.xpath(//*[idtxt]//text())# 过滤空行和无效字符整理正文格式content_lines[line.strip()forlineintext_listifline.strip()]chapter_content\n\n.join(content_lines)# 保存章节内容到本地novel文件夹每个章节一个txt文件withopen(fnovel/{chapter_title}.txt,w,encodingutf-8)asf:f.write(f\n{chapter_title}\n\n{chapter_content}\n\n)# 实时输出爬取成功信息print(f✅ 节点{node_id}爬取成功{chapter_title})exceptExceptionase:# 爬取失败时输出错误信息不影响其他任务print(f❌ 节点{node_id}爬取失败URL{chapter_url}错误{str(e)})4.3 全自动启动脚本start_all.py一键启动所有流程功能一键运行自动执行生产者推任务然后自动弹出4个独立的CMD终端每个终端自动运行worker.py实现可视化分布式爬取无需手动操作。importsubprocessimporttimeif__name____main__:print(*50)print( 全自动分布式爬虫纯requestsRedis启动中...)print(*50)# 第一步运行生产者将任务推入Redis队列print(\n 正在执行任务生产者推送章节链接到Redis...)subprocess.run([python,producer.py],shellTrue)time.sleep(1)# 等待1秒确保任务完全推入队列# 第二步自动弹出4个CMD终端每个终端运行worker.py模拟4台电脑print(\n 正在打开4个分布式爬虫终端开始爬取...)foriinrange(4):# 打开新的CMD窗口自动运行worker.py保持窗口不关闭/k参数subprocess.Popen([start,cmd.exe,/k,python worker.py],shellTrue)time.sleep(0.5)# 间隔0.5秒打开一个窗口避免冲突print(\n✅ 4个分布式节点已全部启动)print( 爬取进度可在各个终端窗口查看爬取完成后文件保存到novel文件夹。)五、完整运行过程演示预留粘贴区域以下为完整的运行步骤按照顺序执行同时预留运行过程粘贴区域大家可将自己的运行结果粘贴在此对比验证是否运行成功。5.1 运行步骤严格按照顺序执行启动Redis服务双击redis-server.exe保持窗口打开将上述3个文件producer.py、worker.py、start_all.py保存到同一文件夹如D:\science_discover\learn\爬虫长期学习\lesson_31 分布式爬虫request版打开PowerShell或CMD切换到该文件夹路径使用cd命令如cd D:\science_discover\learn\爬虫长期学习\lesson_31 分布式爬虫request版执行命令python start_all.py启动全自动分布式爬虫观察弹出的4个CMD终端查看爬取进度直到所有终端显示“任务已完成”打开novel文件夹查看爬取的10章小说内容验证数据是否完整。5.2 运行过程粘贴区域粘贴自己的PowerShell和4个终端的运行结果PowerShell启动start_all.py的运行过程# 此处粘贴你的PowerShell运行过程示例如下 版权所有C Microsoft Corporation。保留所有权利。 安装最新的 PowerShell了解新功能和改进https://aka.ms/PSWindows 加载个人及系统配置文件用了 2732 毫秒。 (base) PS D:\science_discover\learn\爬虫长期学习\lesson_31 分布式爬虫request版 python start_all.py 全自动分布式爬虫纯requestsRedis启动中... 正在执行任务生产者推送章节链接到Redis... ✅ 已成功推入 10 个章节任务到Redis队列等待节点爬取 正在打开4个分布式爬虫终端开始爬取... ✅ 4个分布式节点已全部启动 爬取进度可在各个终端窗口查看爬取完成后文件保存到novel文件夹。 (base) PS D:\science_discover\learn\爬虫长期学习\lesson_31 分布式爬虫request版4个CMD终端的爬取过程分别粘贴每个终端的运行结果终端1节点1️ 分布式节点 123 已启动等待任务分配... ✅ 节点 123 爬取成功第1章 八百年后 ✅ 节点 123 爬取成功第5章 xxxx ✅ 节点 123 爬取成功第9章 xxxx ️ 节点 123所有任务已完成退出爬取终端2节点2️ 分布式节点 456 已启动等待任务分配... ✅ 节点 456 爬取成功第2章 xxxx ✅ 节点 456 爬取成功第6章 xxxx ✅ 节点 456 爬取成功第10章 xxxx ️ 节点 456所有任务已完成退出爬取终端3节点3️ 分布式节点 789 已启动等待任务分配... ✅ 节点 789 爬取成功第3章 xxxx ✅ 节点 789 爬取成功第7章 xxxx ️ 节点 789所有任务已完成退出爬取终端4节点4️ 分布式节点 012 已启动等待任务分配... ✅ 节点 012 爬取成功第4章 xxxx ✅ 节点 012 爬取成功第8章 xxxx ️ 节点 012所有任务已完成退出爬取运行结果验证novel文件夹截图说明六、常见问题排查新手必看在运行过程中新手可能会遇到一些问题以下是最常见的问题及解决方案帮助大家快速排查确保爬虫正常运行。6.1 Redis连接失败问题现象运行脚本后终端提示“Could not connect to Redis”无法推任务或获取任务。解决方案检查Redis服务是否已启动确保redis-server.exe窗口处于打开状态确认Redis默认端口6379未被占用可通过任务管理器关闭占用6379端口的程序若Redis配置过密码需在代码中添加密码参数r redis.Redis(password“你的密码”, decode_responsesTrue)。6.2 无法弹出4个终端窗口问题现象运行start_all.py后只弹出1个窗口或没有窗口弹出。解决方案检查Python环境变量是否配置正确在PowerShell中输入python --version若能显示版本号则配置正常将start_all.py中的“cmd.exe”改为“cmd”重新运行若仍无法弹出可使用备用启动方式新建run.bat文件粘贴以下内容双击运行echo off python producer.py start cmd /k python worker.py start cmd /k python worker.py start cmd /k python worker.py start cmd /k python worker.py6.3 爬取失败提示“XPath匹配不到内容”问题现象终端提示爬取失败错误信息为“list index out of range”即XPath无法匹配到标题或正文。解决方案检查目标网站是否能正常访问若网站无法打开需更换网站链接打开章节页面查看标题和正文的HTML标签调整XPath表达式可使用浏览器开发者工具获取正确XPath检查请求头是否正确可添加Referer参数模拟浏览器访问避免被网站拦截。6.4 章节内容乱码问题现象保存的txt文件中中文显示为乱码。解决方案确保response.encoding “utf-8”若仍乱码可尝试将编码改为“gbk”部分网站使用gbk编码。七、技术拓展与总结7.1 技术拓展本文实现的分布式爬虫是基础版本可根据实际需求进行拓展实现更强大的功能多机扩展将脚本复制到多台电脑确保所有电脑能连接到同一Redis服务需修改Redis配置允许远程连接即可实现真正的多机分布式爬取IP代理添加IP代理池避免单IP被网站限流进一步提升爬取速度任务重试在worker.py中添加失败任务重试机制将失败的URL重新推入Redis队列确保任务不遗漏数据入库将爬取的内容保存到MySQL、MongoDB等数据库替代本地文件保存方便后续数据处理。7.2 总结本文详细讲解了如何使用纯requestsRedis实现可视化分布式爬虫通过自动弹出4个终端窗口模拟4台电脑联合爬取全程不依赖Scrapy框架不使用多线程完美还原了分布式爬虫的核心工作流程。通过本文的学习大家可以掌握分布式爬虫的核心原理——任务队列调度与多节点协作理解多进程与多线程的区别以及Redis在分布式系统中的作用。同时本文提供的代码可直接复制运行步骤详细问题排查全面适合爬虫初学者入门也可作为工业级轻量分布式爬虫的参考案例。分布式爬虫的核心价值在于“横向扩展”通过增加节点电脑数量突破单机的性能和IP限制实现高效爬取。掌握本文的方法后大家可以轻松将其应用到其他爬取场景如新闻、图片、数据采集等灵活调整代码满足不同的爬取需求。最后提醒大家爬虫开发需遵守网站的robots协议尊重网站版权避免过度爬取给网站造成压力合法合规进行数据采集。如果大家在运行过程中遇到其他问题欢迎在评论区留言一起交流学习关注我带你了解更多爬虫知识和实战经验~~