一、介绍

1、原生的scrapy框架

原生的scrapy框架是实现不了分布式的,其原因有:

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

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

2、基于scrapy-redis组件的分布式爬虫

1. scrapy-redis组件中为我们封装好了可以被多台机器共享的调度器和管道,我们可以直接使用并实现分布式数据爬取。

2. 实现方式
基于该组件的RedisSpider类
基于该组件的RedisCrawlSpider类 3. 配置
1,下载scrapy-redis组件:pip install scrapy-redis
2,redis配置文件的配置
- 注释该行:bind 127.0.0.1,表示可以让其他ip访问redis
- 将yes该为no:protected-mode no,表示可以让其他ip操作redis

二、搭建分布式爬虫

1、搭建分布式的流程

1.下载scrapy-redis组件:pip install scrapy-redis

2.创建scrapy工程和爬虫文件(可以创建基于原生的分布式,可以创建基于CrawlSpider的分布式)
scrapy startproject projectName
scrapy genspider -t crawl spiderName www.xxx.com 3.修改爬虫文件中的代码:
3.1 导包:from scrapy_redis.spiders import RedisCrawlSpider
3.2 将爬虫类的父类修改成基于RedisSpider或者RedisCrawlSpider
注意:如果原始爬虫文件是基于Spider的,则应该将父类修改成RedisSpider
如果原始爬虫文件是基于CrawlSpider的,则应该将其父类修改成RedisCrawlSpider
3.3 allowed_domains 和 start_urls删除
3.4 增加一个新的属性:redis_key = xxx 这个属性值xxx就是scrpy-redis组件中调度器队列的名称 4.修改配置文件settings.py
4.0 scrapy_redis是scrapy-redis组件中提供的一个类
4.1 开启使用scrapy-redis组件中封装好的调度器(可以被共享的调度器)
# 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
SCHEDULER_PERSIST = True # 是否允许暂停
4.2 指定可以被共享的管道:
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400
} 5. 指定持久化存储时,数据存储的数据库的相关信息:
REDIS_HOST = 'redis服务的ip地址'
REDIS_PORT = 6379
REDIS_ENCODING = 'utf-8'
REDIS_PARAMS = {'password':''} # 不设密码可不写这行 6.配置redis数据库:redis.windows.conf
protected-mode no
#bind 127.0.0.1 7.开启redis的server and client (windows下开启)
redis-server.exe redis.windows.conf
redis-cli 8.运行当前的爬虫文件
scrapy runspider spiderName.py
注意此时不是:scrapy crawl spiderName 9.处理起始url:
在redis-cli中执行:lpush redis_key属性的值 起始url

2、代码实现

爬取抽屉网站的所有页码的链接标题和提交方

1. settings.py
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
ROBOTSTXT_OBEY = False # 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis组件自己的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
SCHEDULER_PERSIST = True ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400
} REDIS_HOST = '192.168.3.16'
REDIS_PORT = 6379 2. 爬虫文件
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_redis.spiders import RedisCrawlSpider
from chouti_redis.items import ChoutiRedisItem class ChoutiSpider(RedisCrawlSpider):
name = 'chouti'
# allowed_domains = ['https://dig.chouti.com/']
# start_urls = ['https://dig.chouti.com/'] # scrapy-redis组件中提供的调度器队列的名称
redis_key = 'ct'
link = LinkExtractor(allow=r'/all/hot/recent/\d+')
rules = (
# 规则解析器
# follow = True:将链接提取器继续作用到链接提取器提取出的链接所对应的页面中
Rule(link, callback='parse_item', follow=True),
) def parse_item(self, response):
div_list = response.xpath('//div[@id="content-list"]/div')
for div in div_list:
title = div.xpath('./div[4]/div[1]/a[1]/text()').extract_first()
submitted = div.xpath('./div[4]/div[2]/a[4]/b/text()').extract_first() item = ChoutiRedisItem()
item['title'] = title
item['submitted'] = submitted
yield item 3. items.py
class ChoutiRedisItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
title = scrapy.Field()
submitted = scrapy.Field() 4. 开启分布式爬虫
1,在多台机器上开启爬虫程序
scrapy runspider spiderName.py 2,在主机器上开启redis
# 开启服务端
redis-server.exe redis.windows.conf # 开启客户端
redis-cli # 在redis客户端中设置起始url
lpush ct https://dig.chouti.com/ # 爬取到数据后,在redis中会生成下面几个key
"chouti:items"
"chouti:requests"
"chouti:dupefilter"

基于scrapy-redis的分布式爬虫的更多相关文章

  1. 基于Python,scrapy,redis的分布式爬虫实现框架

    原文  http://www.xgezhang.com/python_scrapy_redis_crawler.html 爬虫技术,无论是在学术领域,还是在工程领域,都扮演者非常重要的角色.相比于其他 ...

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

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

  3. Scrapy+redis实现分布式爬虫

    概述 什么是分布式爬虫 需要搭建一个由n台电脑组成的机群,然后在每一台电脑中执行同一组程序,让其对同一网络资源进行联合且分布的数据爬取. 原生Scrapy无法实现分布式的原因 原生Scrapy中调度器 ...

  4. 基于scrapy-redis组件的分布式爬虫

    scrapy-redis组件安装 分布式实现流程 scrapy-redis组件安装 - 下载scrapy-redis组件:pip install scrapy-redis - 更改redis配置文件: ...

  5. 基于Scrapy的B站爬虫

    基于Scrapy的B站爬虫 最近又被叫去做爬虫了,不得不拾起两年前搞的东西. 说起来那时也是突发奇想,想到做一个B站的爬虫,然后用的都是最基本的Python的各种库. 不过确实,实现起来还是有点麻烦的 ...

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

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

  7. 阿里云Centos7.6上面部署基于redis的分布式爬虫scrapy-redis将任务队列push进redis

    Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取.但是当我们要爬取的页面非常多的时候,单个服务器的处理能力就不能满足我们的需求了(无论是处理速度还是网络请 ...

  8. 在阿里云Centos7.6上面部署基于Redis的分布式爬虫Scrapy-Redis

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_83 Scrapy是一个比较好用的Python爬虫框架,你只需要编写几个组件就可以实现网页数据的爬取.但是当我们要爬取的页面非常多的 ...

  9. scrapy——7 scrapy-redis分布式爬虫,用药助手实战,Boss直聘实战,阿布云代理设置

    scrapy——7 什么是scrapy-redis 怎么安装scrapy-redis scrapy-redis常用配置文件 scrapy-redis键名介绍 实战-利用scrapy-redis分布式爬 ...

  10. scrapy如何实现分布式爬虫

    使用scrapy爬虫的时候,记录一下如何分布式爬虫问题: 关键在于多台主机协作的关键:共享爬虫队列 主机:维护爬取队列从机:负责数据抓取,数据处理,数据存储 队列如何维护:Redis队列Redis 非 ...

随机推荐

  1. 不指定源ip时,系统选择哪个ip作为ping包的源ip?

    问题:当centos 有多个网口,发起ping包时,是根据什么规则来确定是使用哪个源ip? 解答:根据目的ip来确定,迭代可以确定源ip 具体的确定方法是, (1)先根据目的ip来确定使用哪个路由表项 ...

  2. Android连续点击多次事件的实现

    有时候我们需要实现这样的场景,类似进入开发者模式,即多次点击后执行操作. 首先我们先看一个方法: System提供的一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制. publi ...

  3. SSIS的部署和配置

    参考:http://www.cnblogs.com/JasonLiao/p/SSISDeploy.htmlhttps://msdn.microsoft.com/en-us/library/ms1401 ...

  4. Maven构建项目出现No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

    No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 你应该 ...

  5. python基础篇实战

    1. 判断下面的结果 # 1. 判断下面的结果 # 1 > 1 or 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6 pri ...

  6. springboot mybatis搭建

    非常easy直接写,没有搭建成分 1.目录 2. @RestController public class UserController { @RequestMapping("/hello& ...

  7. Iris jwt 使用

    jwt分为三个部分: ​ 1.header,用来存储算法和token类型等信息 ​ 2.payload, 一些简单的信息 ​ 3.签名,来验证token是否合法 iris-jwt 这是初始化jwt中间 ...

  8. 使用springMVC时的web.xml配置文件

    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" " ...

  9. 24 python初学(异常)

    try, except, else, finally执行顺序:1. 先执行 try 里面的代码块,如果发生异常就会去捕获. 2. 没有错误就会执行 else 里面的信息. 3. 无论怎样都会执行 fi ...

  10. python3 闭包函数

    '''闭包函数:内部函数引用外部函数变量(非全局变量)'''def func(y): x = 1 def func1(): print(x, y) return func1 f = func(2)pr ...