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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 MongoDB,通用型 2核4GB
简介: 在这篇博客中,将展示如何使用多进程和 Scrapy 来构建一个高效的 Amazon 爬虫系统。通过多进程处理,提高爬虫的效率和稳定性,同时利用 Redis 进行请求调度和去重。

在这篇博客中,将展示如何使用多进程和 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 pymongo

MONGODB_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 = 100
    offset = 0

    while True:
        print('起始索引值:', offset)
        find_datas = col.find(QUERY).skip(offset).limit(batch_size)
        offset += batch_size
        meta = list(find_datas)
        if not meta:
            break
        with Pool(processes=3) as pool:
            pool.map(run_spider_process, [meta])

if __name__ == '__main__':
    main()

代码分析

  1. 配置与初始化
  • 定义 MongoDB 和 Redis 的连接配置。
  • 导入必要的模块。
  1. 爬虫配置与启动
  • spiderList 函数中,配置 Scrapy 爬虫的设置,包括启用 Redis 调度器和去重器。
  • 使用 CrawlerProcess 启动 Scrapy 爬虫,并传递需要处理的 meta 数据。
  1. 运行爬虫进程
  • run_spider_process 函数中,使用 os.getpid() 打印当前进程 ID。
  • 使用 active_children() 查看当前活跃的子进程数。
  • 使用 try-except 块处理可能的异常,并打印错误信息。
  1. 主函数逻辑
  • 连接到 MongoDB,获取待处理的数据。
  • 使用 skiplimit 方法对数据进行分页处理。
  • 使用 Pool 创建一个多进程池,并将任务提交给多进程池进行并发执行。

优化建议

  1. 进程管理
  • 可以根据服务器性能调整进程池大小,以便充分利用系统资源。
  • 考虑使用进程池中的 apply_async 方法来处理结果回调,进一步优化并发处理。
  1. 错误处理
  • run_spider_process 中记录错误日志,以便后续分析和改进。
  1. 数据存储
  • 定期清理 MongoDB 和 Redis 中的旧数据,保持系统的良好性能。

结语

通过上述代码和步骤,构建了一个简单使用多进程和redis实现请求去重的 Amazon 爬虫系统。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
11天前
|
消息中间件 存储 缓存
【嵌入式软件工程师面经】Linux系统编程(线程进程)
【嵌入式软件工程师面经】Linux系统编程(线程进程)
21 1
|
8天前
|
数据采集 存储 中间件
Scrapy,作为一款强大的Python网络爬虫框架,凭借其高效、灵活、易扩展的特性,深受开发者的喜爱
【6月更文挑战第10天】Scrapy是Python的高效爬虫框架,以其异步处理、多线程及中间件机制提升爬取效率。它提供丰富组件和API,支持灵活的数据抓取、清洗、存储,可扩展到各种数据库。通过自定义组件,Scrapy能适应动态网页和应对反爬策略,同时与数据分析库集成进行复杂分析。但需注意遵守法律法规和道德规范,以合法合规的方式进行爬虫开发。随着技术发展,Scrapy在数据收集领域将持续发挥关键作用。
43 4
|
11天前
|
数据采集 存储 监控
构建高效爬虫系统:设计思路与案例分析
构建高效爬虫系统涉及关键模块如爬虫引擎、链接存储、内容处理器等,以及用户代理池、IP代理池等反反爬策略。评估项目复杂性考虑数据规模、网站结构、反爬虫机制等因素。案例分析展示了电子商务价格比较爬虫的设计,强调了系统模块化、错误处理和合规性的重要性。爬虫技术需要不断进化以应对复杂网络环境的挑战。
12 1
|
11天前
|
数据采集 中间件 调度
Scrapy:高效的网络爬虫框架
Scrapy是Python的网络爬虫框架,用于快速构建和开发爬虫。它提供简单API和全功能环境,包括请求调度、HTML解析、数据存储等,让开发者专注爬虫逻辑。Scrapy工作流程包括发起请求、下载响应、解析数据、处理数据和发送新请求。其核心组件有调度器、下载器、解析器(Spiders)和Item Pipeline,广泛应用于数据挖掘、信息监测、搜索引擎和自动化测试。有效技巧包括合理设置请求参数、编写高效解析器、使用代理和防反爬策略,以及利用中间件。随着大数据和AI的发展,Scrapy在爬虫领域的地位将持续巩固。【6月更文挑战第6天】
|
20天前
|
数据采集 存储 C++
单线程 vs 多进程:Python网络爬虫效率对比
本文探讨了Python网络爬虫中的单线程与多进程应用。单线程爬虫实现简单,但处理速度慢,无法充分利用多核CPU。而多进程爬虫通过并行处理提高效率,更适合现代多核架构。代码示例展示了如何使用代理IP实现单线程和多进程爬虫,显示了多进程在效率上的优势。实际使用时还需考虑代理稳定性和反爬策略。
单线程 vs 多进程:Python网络爬虫效率对比
|
21天前
|
数据采集 存储 中间件
Python高效爬虫——scrapy介绍与使用
Scrapy是一个快速且高效的网页抓取框架,用于抓取网站并从中提取结构化数据。它可用于多种用途,从数据挖掘到监控和自动化测试。 相比于自己通过requests等模块开发爬虫,scrapy能极大的提高开发效率,包括且不限于以下原因: 1. 它是一个异步框架,并且能通过配置调节并发量,还可以针对域名或ip进行精准控制 2. 内置了xpath等提取器,方便提取结构化数据 3. 有爬虫中间件和下载中间件,可以轻松地添加、修改或删除请求和响应的处理逻辑,从而增强了框架的可扩展性 4. 通过管道方式存储数据,更加方便快捷的开发各种数据储存方式
|
26天前
|
数据采集 自然语言处理 Python
在 Django 中设计爬虫系统的数据模型与多对多关系
在构建爬虫系统时,设计合理的数据模型和多对多关系对系统的性能和可维护性至关重要。本文将探讨如何使用 Django 来设计爬虫系统的数据模型。
|
27天前
|
存储 Unix Linux
【Linux 系统】进程信号 -- 详解(下)
【Linux 系统】进程信号 -- 详解(下)
|
27天前
|
NoSQL Linux Shell
【Linux 系统】进程信号 -- 详解(上)
【Linux 系统】进程信号 -- 详解(上)
|
27天前
|
消息中间件 存储 安全
【Linux 系统】进程间通信(共享内存、消息队列、信号量)(下)
【Linux 系统】进程间通信(共享内存、消息队列、信号量)(下)