使用多进程和 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 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 的连接配置。
  • 导入必要的模块。

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

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值