分布式概念

分布式爬虫:
1.概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取。
2.原生的scrapy是不可以实现分布式爬虫?
a)调度器无法共享
b)管道无法共享
3.scrapy-redis组件:专门为scrapy开发的一套组件。该组件可以让scrapy实现分布式。
a)下载:pip install scrapy-redis
4.分布式爬取的流程:
a)redis配置文件的配置:
i.bind 127.0.0.1 进行注释
ii.protected-mode no 关闭保护模式
b)redis服务器的开启:基于配置配置文件
c)创建scrapy工程后,创建基于crawlSpider的爬虫文件
d)导入RedisCrawlSpider类,然后将爬虫文件修改成基于该类的源文件
e)将start_url修改成redis_key = ‘XXX’
f)在配置文件中进行相应配置:将管道配置成scrapy-redis集成的管道
g)在配置文件中将调度器切换成scrapy-redis集成好的调度器
h)执行爬虫程序:scrapy runspider xxx.py
i)redis客户端:lpush 调度器队列的名称 “起始url”
          j)keys * redis客户端查看数据,如:lrange qiubai:items 0 -1 【补充】
#如果redis服务器不在自己本机,则需要在setting中进行如下配置
REDIS_HOST = 'redis服务的ip地址'
REDIS_PORT = 6379 【注意】近期糗事百科更新了糗图板块的反爬机制,更新后该板块的页码链接/pic/page/2/s=5135066,末尾的数字每次页面刷新都会变化,因此爬虫文件中链接提取器的正则不可写为/pic/page/\d+/s=5135066而应该修改成/pic/page/\d+

一.redis简单回顾

  1.启动redis:

    mac/linux:   redis-server redis.conf

    windows: redis-server.exe redis-windows.conf

  2.对redis配置文件进行配置:

    - 注释该行:bind 127.0.0.1,表示可以让其他ip访问redis

    - 将yes该为no:protected-mode no,表示可以让其他ip操作redis

二.scrapy基于redis的数据持久化操作流程

  1.安装scrapy-redis组件:

    - pip install scrapy-redis

    - scrapy-redis是基于scrapy框架开发出的一套组件,其作用就是可以让scrapy实现分布式爬虫。

  2.编写爬虫文件:

    - 同之前scrapy中基于Spider或者CrawlSpider的编写方式一致。

  3.编写管道文件:

    - 在scrapy-redis组件中已经帮助我们封装好了一个专门用于连接存储redis数据库的管道(RedisPipeline),因此我们直接使用即可,无需自己编写管道文件。

  4.编写配置文件:

    - 在settings.py中开启管道,且指定使用scrapy-redis中封装好的管道。

ITEM_PIPELINES = {

    'scrapy_redis.pipelines.RedisPipeline': 400

}

- 该管道默认会连接且将数据存储到本机的redis服务中,如果想要连接存储到其他redis服务中需要在settings.py中进行如下配置:

REDIS_HOST = 'redis服务的ip地址'

REDIS_PORT = 6379

REDIS_ENCODING = ‘utf-8’

REDIS_PARAMS = {‘password’:’123456’}

三.redis分布式部署

  1.scrapy框架是否可以自己实现分布式?

    - 不可以。原因有二。

      其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls列表中的url。(多台机器无法共享同一个调度器)

      其二:多台机器爬取到的数据无法通过同一个管道对数据进行统一的数据持久出存储。(多台机器无法共享同一个管道)

  2.redis实现分布式基本流程:

    - 使用基于scrapy-redis组件中的爬虫文件。

import scrapy

from scrapy.linkextractors import LinkExtractor

from scrapy.spiders import CrawlSpider, Rule

from movieproject.items import MovieprojectItem

#导入scrapy-redis中的模块

from scrapy_redis.spiders import RedisCrawlSpider

class NnSpider(RedisCrawlSpider):

    name = 'nn' 

    allowed_domains = ['www.id97.com']

    #redis_key表示调度器中的队列(将要爬取的页面数据对应的url都需要放置到调度器队列中)

    redis_key = 'nnspider:start_urls'

    # 根据规则提取所有的页码链接

    page_link = LinkExtractor(allow=r'/movie/\?page=\d')

    detail_link = LinkExtractor(restrict_xpaths='//div[contains(@class,"col-xs-1-5")]/div/a')

    # detail_link = LinkExtractor(allow=r'/movie/\d+\.html$')

    # follow : 是否跟进

    rules = (

        # 所有的页码不用处理,跟进即可

        Rule(page_link, follow=True),

        # 所有的详情页处理,不用跟进

        Rule(detail_link, callback='parse_item', follow=False),

    )

    def parse_item(self, response):

        # 创建一个item对象

        item = MovieprojectItem()

        # 电影海报

        item['post'] = response.xpath('//a[@class="movie-post"]/img/@src').extract_first()

        # 电影名字

        item['name'] = response.xpath('//h1').xpath('string(.)').extract_first()

        yield item

- 使用scrapy-redis组件中封装好的调度器,将所有的url存储到该指定的调度器中,从而实现了多台机器的调度器共享。

# 使用scrapy-redis组件的去重队列

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

# 使用scrapy-redis组件自己的调度器

SCHEDULER = "scrapy_redis.scheduler.Scheduler"

# 是否允许暂停

SCHEDULER_PERSIST = True

- 使用scrapy-redis组件中封装好的管道,将每台机器爬取到的数据存储通过该管道存储到redis数据库中,从而实现了多台机器的管道共享。

ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400,
}

- 执行:scrapy runspider xxx.py,然后向调度器队列中传入起始url:lpush nnspider:start_urls "http://www.xxx.com/"

scrapy框架之分布式操作的更多相关文章

  1. 6 scrapy框架之分布式操作

    分布式爬虫 一.redis简单回顾 1.启动redis: mac/linux:   redis-server redis.conf windows: redis-server.exe redis-wi ...

  2. 爬虫开发14.scrapy框架之分布式操作

    分布式爬虫 一.redis简单回顾 1.启动redis: mac/linux:   redis-server redis.conf windows: redis-server.exe redis-wi ...

  3. (六--二)scrapy框架之持久化操作

    scrapy框架之持久化操作 基于终端指令的持久化存储 基于管道的持久化存储 1 基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过 ...

  4. scrapy框架之持久化操作

    1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的形式写入指定格式的文件中进行持久化操作. 执行输出指定格式进行存储: ...

  5. 爬虫开发8.scrapy框架之持久化操作

    今日概要 基于终端指令的持久化存储 基于管道的持久化存储 今日详情 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的 ...

  6. scrapy框架之CrawlSpider操作

    提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基 ...

  7. 爬虫开发11.scrapy框架之CrawlSpider操作

    提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法二:基 ...

  8. 基于scrapy框架的分布式爬虫

    分布式 概念:可以使用多台电脑组件一个分布式机群,让其执行同一组程序,对同一组网络资源进行联合爬取. 原生的scrapy是无法实现分布式 调度器无法被共享 管道无法被共享 基于 scrapy+redi ...

  9. Scrapy框架之基于RedisSpider实现的分布式爬虫

    需求:爬取的是基于文字的网易新闻数据(国内.国际.军事.航空). 基于Scrapy框架代码实现数据爬取后,再将当前项目修改为基于RedisSpider的分布式爬虫形式. 一.基于Scrapy框架数据爬 ...

随机推荐

  1. Spring事务管理机制的实现原理-动态代理

    之前在做项目中遇到spring无法进行事务代理问题,最后发现是因为没有写接口,原因当时明白了,看到这篇文章写的清楚些,转过来 我们先来分析一下Spring事务管理机制的实现原理.由于Spring内置A ...

  2. Serv-U设置被动模式(FTP工具)

    FTP服务器在公司内网,通过端口映射把21端口映射出去. 公司一些机器也在各个省的机房内网.好在这些机器可以访问公网.由于各个地区的机器托管在各个地区机房. 我有公司防火墙的权限,可以做防火墙上做端口 ...

  3. openstack--1--基础环境搭建

    Openstack介绍 OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目. Openstack包含三大项 ...

  4. 路由器外接硬盘做nas可行吗?

    话说把家里的newifi mini升级到最新版后,又外接了个移动硬盘做nas,第一部就打算吧手机的视频移过去.一试才发现这速度慢的不行.只有几百kb 所以说,用是能用,单着速度也太慢了 再就是貌似硬盘 ...

  5. parcel (另一个打包工具)知识点

    ParcelJS 本身是 0 配置的,但 HTML.JS 和 CSS 分别是通过 posthtml.babel 和 postcss 处理的,所以我们得分别配 .posthtmlrc..babelrc ...

  6. scala IDE for Eclipse开发Spark程序

    1.开发环境准备 scala IDE for Eclipse:版本(4.6.1) 官网下载:http://scala-ide.org/download/sdk.html 百度云盘下载:链接:http: ...

  7. sql 语句收集

    SELECT type as 'plan cache store', buckets_count  FROM sys.dm_os_memory_cache_hash_tables WHERE type ...

  8. Flask-状态保持-CSRF

    问题:cookies基于浏览器的同源策略,不同域名的cookie不能相互访问,为什么可以进行跨站请求伪造呢? 原因:cookie基于浏览器的同源策略,确实是在实现状态保持的时候,不能跨域访问. 跨站请 ...

  9. nginx简单学习(tomcat)

    一.负载均衡的简单配置 1.下载nginx 2.tomcat*2 配置不同的端口用于正常启动,在jsp中<%= session.getId()%>可以查看jSessionId,tomcat ...

  10. ALGO-10_蓝桥杯_算法训练_集合运算(排序)

    问题描述 给出两个整数集合A.B,求出他们的交集.并集以及B在A中的余集. 输入格式 第一行为一个整数n,表示集合A中的元素个数. 第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素. 第三行 ...