scrapy-redis分布式爬虫(分布式爬虫简述+分布式爬虫实战)

一、分布式爬虫简述

(一)分布式爬虫优势

1.充分利用多台机器的带宽速度

2.充分利用多台机器的ip地址

(二)Redis数据库

1.Redis是一个高性能的nosql数据库

2.Redis的所有操作都是原子性的

3.Redis的数据类型都是基于基本数据结构,无需额外的抽象

4.Redis五种数据类型:string、hash、list、set、zset(sorted set)

(三)python操作redis数据库

1.终端:pip install redis

2.代码如下

import redis 
db = redis.Redis(host="localhost", port="6379", decode_responses=True)

# 如果用到相同的key值,可以自动修改
db.set("name", "Sam")
db.set("name2", "张三")

print(db.get("name2"))

# 多个值
db.mset({"k1":"v1","k2":"v2"})
print(db.mget("k1","k2","name2"))

# hash
db.hset("hash1","hkey1","hvalue1")
db.hset("hash1","hkey2","hvalue2")
db.hset("hash1","hkey3","hvalue3")

print(db.hget("hash1","hkey2"))
print(db.hgetall("hash1"))

db.lpush("list1",11,22,33)
print(db.llen("list1"))
print(db.lrange("list1",0,-1))

db.sadd("set1", 55, 44 ,77)
print(db.scard("set1"))
print(db.smembers("set1"))

db.zadd("zset1",{"item1":1,"item2":2,"item3":2})
print(db.zcard("zset1"))
print(db.zrange("zset1",0,-1))
print(db.zrange("zset1",0,-1,withscores=True))

(四)Redis数据保存至mongodb数据库

import redis
import pymongo
import json

db_redis = redis.Redis(host="localhost", port="6379", decode_responses=True)

client_mongo = pymongo.MongoClient("mongodb://localhost:27017")
db_mongo = client_mongo["RedisToMongo"]
col_mongo = db_mongo["C1"]

for i in db_redis.lrange("app:items", 0 -1):
    page = {
        "title":json.loads(i)["title"]
    }
    res = col_mongo.insert_one(page)
    print(res.inserted_id)

二、分布式爬虫实战

实现一个简单的分布式:

1.创建爬虫项目和文件同scrapy一样的步骤

2.修改settings.py文件中的user-agent、robotstxt_obey、log_level、打开注释掉的item_piplines

3.终端安装scrapy-redis:pip install scrapy-redis

4.在app.py文件中修改如下代码:

import scrapy
from ..items import C07L07Item
from scrapy_redis.spiders import RedisSpider

class AppSpider(RedisSpider):
    name = "app"
    redis_key = "app"
    # start_urls = ["http://127.0.0.1:5000/C07L07"]

    def __init__(self, *args, **kwargs):
        domain = kwargs.pop("domain","")
        self.allowed_domains = filter(None, domain.split(","))
        super(AppSpider, self).__init__(*args, **kwargs)

    def parse(self, response):
        links = response.xpath('//a/@href').getall()
        for link in links:
            link = "http://127.0.0.1:5000"+link
            yield scrapy.Request(url=link,callback=self.parse_details, dont_filter=True)
    
    def parse_details(self, response):
        item = C07L07Item()
        item["title"] = response.text
        yield item
import scrapy
import re
from scrapy_redis.spiders import RedisSpider
from ..items import C07L09Item

class AppSpider(RedisSpider):
    name = "app"
    redis_key = "jingdong"
    # allowed_domains = ["list.jd.com"]
    # start_urls = ["https://list.jd.com/list.html?cat=1713%2C3258&ev=2953_75727%5E&page=1&s=1&click=0"]

    def __init__(self, *args, **kwargs):
        domain = kwargs.pop("domain","")
        self.allowed_domains = filter(None, domain.split(","))
        super(AppSpider, self).__init__(*args, **kwargs) 
   
    def parse(self, response):
        item = C07LO9Item()
        books = response.xpath('//*[@id="J_goodslist"]/ul/li')
        if len(book) != 0:
            for book in books:
                item["title"] = book.xpath('.//div[@class="p-name"]//em/text()').get()
                item["price"] = book.xpath('.//div[@class="p-name"]//i/text()').get()
                yield item
        exp = re.compile('page=(\d*?)&s=(\d*?)&')
        result = exp.findall(response.url)[0]
        page = str(int(result[0] +1)
        s = str(int(result[1] +30)
        next_url = "https://list.jd.com/list.html?cat=1713%2C3258&ev=2953_75727%5E&page={}&s={}&click=0".format(page,s)
        print(next_url)
        yield scrapy.Request(url=next_url, callback=self.parse, dont_filter=True)

在items.py文件中修改数据结构

import scrapy

class C07L07Item(scrapy.Item):
    title = scrapy.Field()

在pipelines.py文件中修改代码

from itemdapter import ItemAdapter

class C07L07Pipeline:
    def process_item(self, item, spider):
        print(item["title"])
        return item

5.在settings.py文件中添加如下代码,修改ITEM_PIPELINES

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True

REDIS_URL = "redis://127.0.0.1:6379"
DOWNLOAD_DELAY = 1

ITEM_PIPELINES = {
    "C07LO7.pipelines.C07LO7Pipeline":300,
    "scrapy_redis.pipelines.RedisPipeline":400
}

6.在终端链接redis数据库:redis-cli

                                           lpush app http://127.0.0.1:5000/C07L07

7.运行爬虫代码:scrapy crawl app(可以开多进程)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

攻防世界-web-bug

1. 问题描述 没有额外的描述,仅仅是这样的一个登录界面 但是,我们注意到有注册(Register)和找回密码(Findpwd)这俩按钮 注册界面如下:需要输入用户名,密码,生日及地址 …

自动曝光算法(第一讲)

序言 失业在家无事,想到以后换方向不做自动曝光了,但是自动曝光的工作经验也不能浪费了,准备写一个自动曝光的教学,留给想做自动曝光的小伙伴参考。笔者当时开发自动曝光没有按摄影的avtvevbvsv公式弄,而是按正确的增…

K-means(K-均值)算法

K-means(k-均值,也记为kmeans)是聚类算法中的一种,由于其原理简单,可解释强,实现方便,收敛速度快,在数据挖掘、聚类分析、数据聚类、模式识别、金融风控、数据科学、智能营销和数据运…

UML类图关系

1.依赖 依赖关系由箭头表示,含义为A类在类中用到了B类,如B类作为A类的属性、参数、返回值等都属于依赖关系。 2.泛化(继承) 泛化用三角箭头和直线表示,extend。 3.实现 实现用三角箭头和虚线表示,在…

Mac 配置环境变量

Mac 配置环境变量 修改配置文件 vim ~/.bash_profile i进入编辑模式. Esc:wq 保存文件 esc:q 退出 如:jdk环境变量配置 JAVA_HOME/Library/Java/JavaVirtualMachines/jdk1.8.0_361.jdk/Contents/HomeCLASSPATH$JAVA_HOME/lib/tools.jar:$JAVA_HOME/…

11月的『备考学习计划』+高效的作息时间表 超好用~

每日作息时间表 每天有三个时间段学习效率高 上午10点左右 下午4点左右 晚上8点-10点左右 坚持住了,学习效果事半功倍 有同感的同学 可以举举手🤚,点点赞💓 每日作息时间表 6:30-7:00起床 6:30---7:00是起床的最佳时刻&am…

Ubuntu自建git服务器

Ubuntu 安装 gitlab-ce sudo apt-get update sudo apt-get install gitlab-ce 安装成功 sudo apt-get install gitlab-ce 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 下列【新】软件包将被安装:gitlab-ce 升…

解决方案 | 便民提效,电子签助力医疗保障服务模式创新

2023年2月,中共中央、国务院印发了《数字中国建设整体布局规划》,并发出通知,要求各地区各部门结合实际认真贯彻落实。《规划》指出,提升数字化服务水平,加快推进“一件事一次办”,推进线上线下融合&#x…

呼叫中心的重要考核指标

呼叫中心在运营过程中越来越精细化,在信息化管理的时代,呼叫中心系统是必不可少的,而呼叫中心的管理人员为了提升运营效率,通常会根据业务目标设置各种业务的考核指标,而我也根据OKCC在呼叫中心项目运营过程中的经验&a…

Window下SRS服务器的搭建

---2023.7.23 准备材料 srs下载:GitHub - ossrs/srs at 3.0release 目前srs release到5.0版本。 srs官方文档:Introduction | SRS (ossrs.net) Docker下载:Download Docker Desktop | Docker 进入docker官网选择window版本直接下载。由…

中颖单片机SH367309全套量产PCM,专用动力电池保护板开发资料

方案总体介绍 整套方案硬件部分共2块板子,包括MCU主板,采用SH79F6441-32作为主处理器。MCU主板包括2个版本。PCM动力电池保护板采用SH367309。 软件方案采用Keil51建立的工程,带蓝牙的版本,支持5~16S电池。 硬件方案--MCU主板 MC…

Android开发知识学习——TCP / IP 协议族

文章目录 学习资源来自:扔物线TCP / IP 协议族TCP连接TCP 连接的建立与关闭TCP 连接的建立为什么要三次握手? TCP 连接的关闭为什么要四次挥手? 为什么要⻓连接? 常见面试题课后题 学习资源来自:扔物线 TCP / IP 协议…

Simulink HDL--如何生成Verliog代码

Simulink生成HDL的方法可以快速设计出工程,并结合FPGA验证,相比于手写HDL代码虽然存在代码优化不足的问题。但是方法适合做工程的快速验证和基本框架搭建。本文将介绍Simulink HDL生成Verliog代码的基本操作 1、逻辑分析仪功能 Simulink生成HDL前需要通…

想翻译pdf文档,试了几个工具对比:有阿里(完全免费,快,好用,质量高,不用注册登录)道最好(有限免费) 百度(有限免费)和谷歌完全免费(网不好)

文档翻释作为基础设施,工作必备。 阿里 (完全免费,快,好用,质量高,不用注册登录,无广告)我给满分 https://translate.alibaba.com/#core-translation 先选好语言。 Google(完全免…

数据结构和算法——用C语言实现所有图状结构及相关算法

文章目录 前言图的基本概念图的存储方式邻接矩阵邻接表十字链表临界多重表 图的遍历最小生成树普里姆算法(Prim)克鲁斯卡尔算法(Kruskal) 最短路径BFS求最短路径迪杰斯特拉算法(Dijkstra)弗洛伊德算法&…

03-对象

对象 对象1.对象的创建字面量模式构造函数模式 2.对象的访问3.新增删除对象中的属性4.Object显示类型转换(强制类型转换)ECMAScript中可用的3种强制类型转换如下:Boolean(value)String(value)Number(value)Object类型到Boolean类型Object类型转String类型转换规则&a…

leetcode-字符串

1.反转字符串LeetCode344. 20230911 难度为0,此处就不放代码了 注意reverse和swap等一系列字符串函数什么时候该用,记一记库函数 swap可以有两种实现,涨知识了,除了temp存值还可以通过位运算:s[i] ^ s[j]; s[j] ^ s[i…

Unity Animator cpu性能测试

测试案例: 场景中共有4000个物体,挂在40个animtor 上,每个Animator控制100个物体的动画。 使用工具: Unity Profiler. Unity 版本: unity 2019.4.40f1 测试环境: 手机 测试过程: 没有挂…

Java 设计模式——命令模式

目录 1.概述2.结构3.案例实现3.1.命令接口3.2.具体命令3.3.接受者3.4.调用者3.5.测试 4.优缺点5.使用场景6.JDK 源码解析——Runnable 1.概述 (1)日常生活中,我们出去吃饭都会遇到下面的场景: (2)命令模…

医学AI智能导诊系统源码

医院智能导诊系统是一款基于人工智能和大数据技术开发的医疗辅助软件,旨在为患者提供更加便捷、精准的医疗服务。 一、什么是智能导诊系统? 智能导诊系统是一种基于人工智能和大数据技术开发的医疗辅助软件,它能够通过对患者的症状、病史等信…