一、介绍

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. vue项目中vscode格式化配置和eslint配置冲突

    问题描述 使用vscode开发vue项目的时候,从远端拉下一个新的项目后,安装完依赖后跑起项目时,发现直接报了一堆语法错误:包括换行.空格.单双引号.分号等各种格式问题 因为我的 vscode 安装使 ...

  2. Ansible第一篇:介绍及安装

    Ansible介绍 Ansible是个什么东西呢?官方的title是"Ansible is Simple IT Automation"--简单的自动化IT工具.ansible基于P ...

  3. 解决jest处理es模块

    解决jest处理es模块 问题场景 项目使用jest进行测试时, 当引入外部库是es模块时, jest无法处理导致报错. Test suite failed to run Jest encounter ...

  4. vue安装和使用

    首先这里记录的是基于安装node.js 的npm安装vue  如果你不是用的node与npm  那就不必往下看了 1.安装node.js这个不多说   百度有很多 2.安装webpack 全局安装we ...

  5. web.xml文件介绍

    每个javaEE工程中都有web.xml文件,那么它的作用是什么呢?它是每个web.xml工程都必须的吗? 一个web中可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的. ...

  6. BCP SQL导出EXCEL常见问题及解决方法;数据导出存储过程

    一.‘xp_cmdshell’的启用 SQL Server阻止了对组件‘xp_cmdshell’的过程‘sys.xp_cmdshell’的访问.因为此组件已作为此服务嚣安全配置的一部分而被关 闭.系统 ...

  7. Asp.net mvc 项目返回Json

    因mvc控制器返回类型JsonResult 在处理对象转JSON的时候,对日期的格式化处理并不太符合要求,所以重新继承抽象类ActionResult使用Newtonsoft.Json来系列化 usin ...

  8. LeetCode算法题-Merge Two Binary Trees(Java实现)

    这是悦乐书的第274次更新,第290篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第142题(顺位题号是617).提供两个二叉树,将其合并为新的二叉树,也可以在其中一个二 ...

  9. mysql导出表的字段及相关属性

    需要导出数据库中表的字段及属性,制成表格保存到word中 首先找到要导的库, 在查询页面输入sql SELECT COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE ...

  10. Python开发【内置模块篇】datetime

    获取当前日期和时间 >>> from datetime import datetime >>> now = datetime.now() >>> ...