使用多进程和 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

相关文章

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创