Centos7__Scrapy + Scrapy_redis 用Docker 实现分布式爬虫

原理:其实就是用到redis的优点及特性,好处自己查---

1,scrapy 分布式爬虫配置:

settings.py

BOT_NAME = ‘first‘

SPIDER_MODULES = [‘first.spiders‘]
NEWSPIDER_MODULE = ‘first.spiders‘

# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = ‘first (+http://www.yourdomain.com)‘

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16

# Disable cookies (enabled by default)
#COOKIES_ENABLED = False

ITEM_PIPELINES = {
   # ‘first.pipelines.FirstPipeline‘: 300,
   ‘scrapy_redis.pipelines.RedisPipeline‘:300,
   ‘first.pipelines.VideoPipeline‘: 100,
}

#分布式爬虫
#指定redis数据库的连接参数
REDIS_HOST = ‘172.17.0.2‘
REDIS_PORT = 15672
REDIS_ENCODING = ‘utf-8‘
# REDIS_PARAMS ={
#     ‘password‘: ‘123456‘,  # 服务器的redis对应密码
# }
#使用了scrapy_redis的调度器,在redis里分配请求
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# # 确保所有爬虫共享相同的去重指纹
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# Requests的调度策略,默认优先级队列
SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.PriorityQueue‘
#(可选). 在redis中保持scrapy-redis用到的各个队列,从而允许暂停和暂停后恢复,也就是不清理redis queues
SCHEDULER_PERSIST = True

spider.py

# -*- coding: utf-8 -*-
import scrapy
import redis
from ..items import Video
from scrapy.http import Request
from scrapy_redis.spiders import RedisSpider
class VideoRedis(RedisSpider):
    name = ‘video_redis‘
    allowed_domains = [‘zuidazy2.net‘]
    # start_urls = [‘http://zuidazy2.net/‘]
    redis_key = ‘zuidazy2:start_urls‘
    def parse(self, response):
        item = Video()
        res= response.xpath(‘//div[@class="xing_vb"]/ul/li/span[@class="xing_vb4"]/a/text()‘).extract_first()
        url = response.xpath(‘//div[@class="xing_vb"]/ul/li/span[@class="xing_vb4"]/a/@href‘).extract_first()
        v_type = response.xpath(‘//div[@class="xing_vb"]/ul/li/span[@class="xing_vb5"]/text()‘).extract_first()
        u_time  = response.xpath(‘//div[@class="xing_vb"]/ul/li/span[@class="xing_vb6"]/text()‘).extract_first()
        if res is not None:
            item[‘name‘] = res
            item[‘v_type‘] = v_type
            item[‘u_time‘] = u_time
            url = ‘http://www.zuidazy2.net‘ + url
            yield scrapy.Request(url, callback=self.info_data,meta={‘item‘: item},dont_filter=True)
        next_link =  response.xpath(‘//div[@class="xing_vb"]/ul/li/div[@class="pages"]/a[last()-1]/@href‘).extract_first()
        if next_link:
            yield scrapy.Request(‘http://www.zuidazy2.net‘+next_link,callback=self.parse,dont_filter=True)

    def info_data(self,data):
        item = data.meta[‘item‘]
        res = data.xpath(‘//div[@id="play_2"]/ul/li/text()‘).extract()
        if res:
            item[‘url‘] = res
        else:
            item[‘url‘] = ‘‘
        yield item

items.py

import scrapy

class FirstItem(scrapy.Item):
    # define the fields for your item here like:
    content = scrapy.Field()

class Video(scrapy.Item):
    name = scrapy.Field()
    url = scrapy.Field()
    v_type = scrapy.Field()
    u_time = scrapy.Field()

pipelines.py

from pymysql import *
import aiomysql
class FirstPipeline(object):
    def process_item(self, item, spider):
        print(‘*‘*30,item[‘content‘])
        return item

class VideoPipeline(object):
    def __init__(self):
        self.conn = connect(host="39.99.37.85",port=3306,user="root",password="",database="queyou")
        self.cur = self.conn.cursor()

    def process_item(self, item, spider):

        # print(item)
        try:
            # insert_sql = f"insert into video values(0,‘{item[‘name‘]}‘,‘{item[‘url‘]}‘,‘{item[‘v_type‘]}‘,‘{item[‘u_time‘]}‘)"
            # self.cur.execute(insert_sql)
            # # self.cur.execute("insert into video values(0,‘"+item[‘name‘]+"‘,‘"+item[‘url‘]+"‘,‘"+item[‘v_type‘]+"‘,‘"+item[‘u_time‘]+"‘)")
            self.cur.execute("insert into video values(0,‘"+item[‘name‘]+"‘,‘"+item[‘v_type‘]+"‘)")
            self.conn.commit()
        except Exception as e:
            print(e)
        finally:
            return item
    def close_spider(self, spider):
        self.conn.commit()  # 提交数据
        self.cur.close()
        self.conn.close()

2,Docker 安装和pull centos7 及安装依赖  (跳过)

3,cp 宿主机项目到 Centos7 容器中

docker cp /root/first 35fa:/root

4,安装redis 及 开启远程连接服务

具体在 /etc/redis.conf 中设置和开启redis服务

redis-server /etc/redis.conf

5,Docker虚拟主机多个及建立通信容器

运行容器
docker run -tid --name 11  CONTAINER_ID 

建立通信容器
docker run  -tid --name 22 --link 11 CONTAINER_ID

进入容器  docker attach CONTAINER_ID

退出容器,不kill掉容器(通常exit会kill掉的) ctrl+q+p
查看网络情况 cat /etc/hosts

5,开启所有容器的spider 及定义start_url

完工!

附上打包好的镜像:链接: https://pan.baidu.com/s/1Sj244da0pOZvL3SZ_qagUg 提取码: qp23

原文地址:https://www.cnblogs.com/xcsg/p/12368072.html

时间: 2024-11-01 09:23:50

Centos7__Scrapy + Scrapy_redis 用Docker 实现分布式爬虫的相关文章

python3下scrapy爬虫(第十三卷:scrapy+scrapy_redis+scrapyd打造分布式爬虫之配置)

之前我们的爬虫都是单机爬取,也是单机维护REQUEST队列, 看一下单机的流程图: 一台主机控制一个队列,现在我要把它放在多机执行,会产生一个事情就是做重复的爬取,毫无意义,所以分布式爬虫的第一个难点出来了,共享请求队列,看一下架构: 三台主机由一个队列控制,意味着还需要一个主机来控制队列,我们一般来用REDIS来控制队列,形成如下分布式架构 从机抓取,存储主机负责控制队列 SCRAPY_REDIS这个插件解决了SCRAPY不能做分布式爬取的问题 它内部的CONNECTION.PY作为连接MAS

使用Docker Swarm搭建分布式爬虫集群

在爬虫开发过程中,你肯定遇到过需要把爬虫部署在多个服务器上面的情况.此时你是怎么操作的呢?逐一SSH登录每个服务器,使用git拉下代码,然后运行?代码修改了,于是又要一个服务器一个服务器登录上去依次更新? 有时候爬虫只需要在一个服务器上面运行,有时候需要在200个服务器上面运行.你是怎么快速切换的呢?一个服务器一个服务器登录上去开关?或者聪明一点,在Redis里面设置一个可以修改的标记,只有标记对应的服务器上面的爬虫运行? A爬虫已经在所有服务器上面部署了,现在又做了一个B爬虫,你是不是又得依次

分布式爬虫scrapy_redis

1. from scrapy_redis.spiders import RedisSpider 导入依赖包更改继承类 2.打开redis服务 redis-server --server-start 3.修改配置文件 #启用Redis调度存储请求队列 SCHEDULER = "scrapy_redis.scheduler.Scheduler" #确保所有的爬虫通过Redis去重 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDup

一个简单的分布式爬虫

下载scrapy-redis: https://github.com/rmax/scrapy-redis 下载zip文件之后解压 建立两个批处理文件,start.bat和clear.batstart.bat的内容为redis-server redis.windows.confclear.bat的内容为redis-cli flushdb双击start.bat启动 这样就说明下好了,运行正常. 我们需要构建一个分布式爬虫系统:由一个master爬虫和slave爬虫组成,master端部署了redis

第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中

第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详解 基本概念 如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定.链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢.不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构.它可以通过一

scrapy进行分布式爬虫

今天,参照崔庆才老师的爬虫实战课程,实践了一下分布式爬虫,并没有之前想象的那么神秘,其实非常的简单,相信你看过这篇文章后,不出一小时,便可以动手完成一个分布式爬虫! 1.分布式爬虫原理 首先我们来看一下scrapy的单机架构: 可以看到,scrapy单机模式,通过一个scrapy引擎通过一个调度器,将Requests队列中的request请求发给下载器,进行页面的爬取. 那么多台主机协作的关键是共享一个爬取队列. 所以,单主机的爬虫架构如下图所示: 前文提到,分布式爬虫的关键是共享一个reque

scrapy-redis 更改队列和分布式爬虫

这里分享两个技巧 1.scrapy-redis分布式爬虫 我们知道scrapy-redis的工作原理,就是把原来scrapy自带的queue队列用redis数据库替换,队列都在redis数据库里面了,每次存,取,删,去重,都在redis数据库里进行,那我们如何使用分布式呢,假设机器A有redis数据库,我们在A上把url  push到redis里面,然后在机器B上启动scrapy-redis爬虫,在机器B上connect到A,有远程端口可以登入,在爬虫程序里,保存的时候注意启用追加模式,而不是每

Python分布式爬虫、信息检索、搜索引擎原理及应用视频教程

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv

python3 分布式爬虫

背景 部门(东方IC.图虫)业务驱动,需要搜集大量图片资源,做数据分析,以及正版图片维权.前期主要用node做爬虫(业务比较简单,对node比较熟悉).随着业务需求的变化,大规模爬虫遇到各种问题.python爬虫具有先天优势,社区资源比较齐全,各种框架也完美支持.爬虫性能也得到极大提升.本次分享从基础知识入手,涉及python 的两大爬虫框架pyspider.scrapy,并基于scrapy.scrapy-redis 做了分布式爬虫的介绍(直接粘贴的ppt截图)会涉及 redis.mongodb