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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity中获取数据的方法

Input和GetComponent 一、Input 1、Input类: 用于处理用户输入(如键盘、鼠标、触摸等)的静态类 2、作用: 允许你检查用户的输入状态。如某个键是否被按下,鼠标的位置,触摸的坐标等 3、实例 (1) 键盘…

一键解锁创意无界:高效AI生成古典肖像图片,轻松打造艺术化身

在数字化时代,创意与艺术的结合正逐渐改变我们的生活。你是否曾梦想过拥有一幅专属于自己的古典肖像画,却又苦于找不到合适的画师或高昂的费用而望而却步?现在,这一切都将成为现实! 进入首助编辑高手的AI魔法智绘图板块…

你能不能手敲出Spring框架?

Spring最成功的地方在于创始人Rod Johnson提出的IOC、AOP核心理念,反而不是其本身的技术。技术上今天可以有Spring春天,明天就可以有Autumn秋天。 核心理念有多重要?就如1871年巴黎公社的失败。公社在对抗法国zf和普鲁士占领军的背景下成立&…

抉择与未来:计算机专业的选择与发展展望

2024年,计算机相关专业还值得选择吗? 随着2024年高考落幕,数百万高三学生又将面临人生中的重要抉择:选择大学专业。在这个关键节点,计算机相关专业是否仍是“万金油”的选择?在过去很长一段时间里&#xff…

英伟达开源 3400 亿巨兽:98% 合成数据训出最强开源通用模型,性能对标 GPT-4o

NVIDIA 最近开源了其大型语言模型 Nemotron-4 340B,这是一个具有划时代意义的模型,它使用了高达 98% 的合成数据进行训练,并且在性能上与 GPT-4 相当。Nemotron-4 340B 包括基础模型、指令模型和奖励模型,支持 4K 上下文窗口、50 …

回答网友的一个Delphi问题

网友想在grid 中 加一个水印,俺就给他写了个例子。先靠效果: 这个例子 包含下面几步: 1、创建背景 dg_bmp:Tbitmap.Create; w: Image1.Picture.Bitmap.width; h: Image1.Picture.Bitmap.height; dg_bmp.width: w*2; dg_bmp.height: …

从入门到高手的99个python案例(2)

51. 列表和数组比较 - 列表通用,NumPy数组高效。 import numpy as np normal_list [1, 2, 3] np_array np.array([1, 2, 3]) print(np_array.shape) # 输出 (3,), 数组有形状信息 52. Python的内置模块datetime - 处理日期和时间。 from datetime import…

数据库MySQL——从0到1入门教程

Q:为什么需要MySQL? A:网络服务中,我们需要存储、管理大量的数据,并确保数据的安全、实现增删改查操作的高效,因此需要一个系统用来专门管理数据,以实现上述的高性能要求,数据库管理系统应需而生 八股如下…

Notepad++ 使用正则表达式删除空行空格方法

删除所有空格 查找框输入:^\s,替换框留空,什么也不输入,一键全部替换即可。 删除所有空行 查找框输入:\r\n\r\n,替换框输入:\r\n,一键全部替换即可。 段落之间空一行 思路&#…

MySQL(7)

创建和管理表 1. 创建和管理数据库 1.1 如何创建数据库 #方式1:CREATE DATABASE mytest1; # 创建的此数据库使用的是默认的字符集#查看创建数据库的结构SHOW CREATE DATABASE mytest1;#方式2:显式了指名了要创建的数据库的字符集CREATE DATABASE myt…

nginx配置后访问出现白屏怎么办?

问题 服务器上有两个web服务ab分别指向3000、3001两个端口,使用nginx进行反向代理,配置文件如下: server {listen 80;server_name www.example.com;location /a/ {proxy_pass http://localhost:3000;proxy_set_header Host $host;proxy_set…

自动化数据驱动?最全接口自动化测试yaml数据驱动实战

前言 我们在做自动化测试的时候,通常会把配置信息和测试数据存储到特定的文件中,以实现数据和脚本的分离,从而提高代码的易读性和可维护性,便于后期优化。 而配置文件的形式更是多种多样,比如:ini、yaml、…

pytorch 笔记:torch.dist

torch.dist 函数是 PyTorch 库中用来计算两个张量之间的距离的函数。该函数主要用来计算指定阶数的距离,比如欧几里得距离(默认情况下) torch.dist(input, other, p2)input第一个输入张量other第二个输入张量,需要与第一个张量的…

数据结构--力扣144.二叉树的前序遍历(C

链接:. - 力扣(LeetCode)【点击即可跳转】 使用c语言来实现。 代码展示为: /*** Note: The returned array must be malloced, assume caller calls free().*/int TreeSize( struct TreeNode* root) {return rootNULL?0:TreeS…

pdf structuredClone is not defined 解决

问题 部分手机系统的浏览器 pdf v2版本会出现 structuredclone is not defined 的报错,这是因为浏览器过低 解决 查看structuredClone的浏览器兼容性 structuredClone api 文档 polyfill 网站下方有个 polyfill的网址入口 可以解决低版本的兼容问题 相应网址…

笨蛋学算法之LeetCodeHot100_3_最长连续序列(Java)

package com.lsy.leetcodehot100;import java.util.Arrays; import java.util.HashSet; import java.util.Set;public class _Hot3_最长连续序列 {public static int longestConsecutive(int[] nums) {//创建set去重//对重复的数字进行去重Set<Integer> set new HashSet…

融合心血管系统(CVS)多视角信号的新架构新策略

随着深度学习的发展和传感器的广泛采用&#xff0c;自动多视角融合&#xff08;MVF&#xff09;在心血管系统&#xff08;CVS&#xff09;信号处理方面取得了进展。然而&#xff0c;普遍的MVF模型架构通常将同一时间步骤但不同视角的CVS信号混合成统一的表示形式&#xff0c;忽…

redis的四种模式部署应用

这里写目录标题 redis应用redis单机部署redis主从redis哨兵Cluster模式 redis应用 redis单机部署 关闭防火墙[rootzyq ~]#: yum -y install wget make gcc gcc-c ...... [rootzyq ~]#: wget https://download.redis.io/redis-stable.tar.gz --2024-01-01 19:41:14-- https:/…

TypeScript 进阶,深入理解并运用索引访问类型提升代码质量

欢迎回来继续我们的“TypeScript进阶技巧”系列。上次我们深入探讨了如何使用Extract和Exclude实用类型来优化TypeScript的类型处理&#xff08; 《如何利用 TypeScript 的 Extract 提升类型定义与代码清晰度》和 《如何利用 TypeScript 的 Exclude 提升状态管理与代码健壮性》…

论文阅读笔记:Cross-Image Relational Knowledge Distillation for Semantic Segmentation

论文阅读笔记&#xff1a;Cross-Image Relational Knowledge Distillation for Semantic Segmentation 1 背景2 创新点3 方法4 模块4.1 预备知识4.2 跨图像关系知识蒸馏4.3 Memory-based像素到像素蒸馏4.4 Memory-based像素到区域蒸馏4.5 整体框架 5 效果 论文&#xff1a;http…