使用多进程和 Scrapy 实现高效的 Amazon 爬虫系统

2024-06-14 17:28

本文主要是介绍使用多进程和 Scrapy 实现高效的 Amazon 爬虫系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这篇博客中,将展示如何使用多进程和 Scrapy 来构建一个高效的 Amazon 爬虫系统。通过多进程处理,提高爬虫的效率和稳定性,同时利用 Redis 进行请求调度和去重。

项目结构

  1. Scrapy 爬虫:负责从 Amazon 抓取数据。
  2. MongoDB:存储待爬取的链接。
  3. Redis:用于请求调度和去重。
  4. 多进程管理:通过 Python 的 multiprocessing 模块来管理多个爬虫进程。

代码实现

首先,我们定义了一些基本配置和导入所需的库:

import os
import traceback
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
from multiprocessing import Process, Pool, active_children
import pymongoMONGODB_HOST = '127.0.0.1'
MONGODB_PORT = 27017
MONGODB_DB = 'AmazonSpiderProject'
MONGODB_NEW_LINK_COL = 'amazon_NewReleases_url'
QUERY = {'status': 0}
REDIS_URL = 'redis://127.0.0.1:6379/2'

爬虫函数

spiderList 函数负责配置并启动 Scrapy 爬虫:

def spiderList(meta):os.environ['SCRAPY_SETTINGS_MODULE'] = 'scrapy_amazon_list_spider.settings'settings = get_project_settings()settings.set('ITEM_PIPELINES', {"scrapy_amazon_list_spider.pipelines.ScrapyAmazonListPipeline": 300})settings.set('SCHEDULER', "scrapy_redis.scheduler.Scheduler")settings.set('DUPEFILTER_CLASS', "scrapy_redis.dupefilter.RFPDupeFilter")settings.set('SCHEDULER_QUEUE_CLASS', 'scrapy_redis.queue.SpiderPriorityQueue')settings.set('SCHEDULER_PERSIST', True)settings.set('REDIS_URL', REDIS_URL)process = CrawlerProcess(settings)process.crawl("amazon_list_new", meta=meta)process.start()

运行爬虫进程

run_spider_process 函数负责启动一个新的爬虫进程,并处理异常:

def run_spider_process(chunk):print(f"进程 ID: {os.getpid()}")print(f"剩余活跃进程数: {len(active_children())}")print(f"要处理的项目数: {len(chunk)}")try:spiderList(meta=chunk)except Exception as e:print(f"发生错误: {e}")traceback.print_exc()

主函数

main 函数负责从 MongoDB 获取待爬取的链接,并将其分批提交给多进程池:

def main():client = pymongo.MongoClient(host=MONGODB_HOST, port=MONGODB_PORT)db = client[MONGODB_DB]col = db[MONGODB_NEW_LINK_COL]batch_size = 100offset = 0while True:print('起始索引值:', offset)find_datas = col.find(QUERY).skip(offset).limit(batch_size)offset += batch_sizemeta = list(find_datas)if not meta:breakwith Pool(processes=3) as pool:pool.map(run_spider_process, [meta])if __name__ == '__main__':main()

代码分析

1. 配置与初始化

  • 定义 MongoDB 和 Redis 的连接配置。
  • 导入必要的模块。

2. 爬虫配置与启动

  • spiderList 函数中,配置 Scrapy 爬虫的设置,包括启用 Redis 调度器和去重器。
  • 使用 CrawlerProcess 启动 Scrapy 爬虫,并传递需要处理的 meta 数据。

3. 运行爬虫进程

  • run_spider_process 函数中,使用 os.getpid() 打印当前进程 ID。
  • 使用 active_children() 查看当前活跃的子进程数。
  • 使用 try-except 块处理可能的异常,并打印错误信息。

4. 主函数逻辑

  • 连接到 MongoDB,获取待处理的数据。
  • 使用 skiplimit 方法对数据进行分页处理。
  • 使用 Pool 创建一个多进程池,并将任务提交给多进程池进行并发执行。

优化建议

1. 进程管理

  • 可以根据服务器性能调整进程池大小,以便充分利用系统资源。
  • 考虑使用进程池中的 apply_async 方法来处理结果回调,进一步优化并发处理。

2. 错误处理

  • run_spider_process 中记录错误日志,以便后续分析和改进。

3. 数据存储

  • 定期清理 MongoDB 和 Redis 中的旧数据,保持系统的良好性能。

结语

通过上述代码和步骤,构建了一个简单使用多进程和redis实现请求去重的 Amazon 爬虫系统。 如果你有任何问题或建议,欢迎在评论区留言讨论!

作者:pycode
链接:https://juejin.cn/post/7379262453727543311

这篇关于使用多进程和 Scrapy 实现高效的 Amazon 爬虫系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

c/c++的opencv图像金字塔缩放实现

《c/c++的opencv图像金字塔缩放实现》本文主要介绍了c/c++的opencv图像金字塔缩放实现,通过对原始图像进行连续的下采样或上采样操作,生成一系列不同分辨率的图像,具有一定的参考价值,感兴... 目录图像金字塔简介图像下采样 (cv::pyrDown)图像上采样 (cv::pyrUp)C++ O

MySQL的ALTER TABLE命令的使用解读

《MySQL的ALTERTABLE命令的使用解读》:本文主要介绍MySQL的ALTERTABLE命令的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、查看所建表的编China编程码格式2、修改表的编码格式3、修改列队数据类型4、添加列5、修改列的位置5.1、把列

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

SpringBoot使用ffmpeg实现视频压缩

《SpringBoot使用ffmpeg实现视频压缩》FFmpeg是一个开源的跨平台多媒体处理工具集,用于录制,转换,编辑和流式传输音频和视频,本文将使用ffmpeg实现视频压缩功能,有需要的可以参考... 目录核心功能1.格式转换2.编解码3.音视频处理4.流媒体支持5.滤镜(Filter)安装配置linu

Redis中的Lettuce使用详解

《Redis中的Lettuce使用详解》Lettuce是一个高级的、线程安全的Redis客户端,用于与Redis数据库交互,Lettuce是一个功能强大、使用方便的Redis客户端,适用于各种规模的J... 目录简介特点连接池连接池特点连接池管理连接池优势连接池配置参数监控常用监控工具通过JMX监控通过Pr