一、介绍

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. git克隆github上的代码(整个分支),并使用vs code上传到github

    好久没写博客辣,之前一直用sublime text3,最近开始用vc写,感觉很良好.然后公司也在用git,就写一个克隆上传的教程吧 1.下载git https://www.git-scm.com/do ...

  2. Android 解析标准的点击第三方文件管理器中的视频的intent

    解析标准的第三方视频intent private List<String> mCurPlayList = new ArrayList<String>(); private in ...

  3. 下拉框 JComboBox,文本框JTextField

    1. 下拉框 JComboBox //导入Java类 import javax.swing.*; import java.awt.*; import java.awt.event.ActionEven ...

  4. foaf

    <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http: ...

  5. JSON.Net 自定义Json序列化时间格式

    JSON.Net 自定义Json序列化时间格式 Intro 和 JAVA 项目组对接,他们的接口返回的数据是一个json字符串,里面的时间有的是Unix时间戳,有的是string类型,有的还是空,默认 ...

  6. nexus3.X环境搭建

    nexus3比以前的版本相比 多支持了管理不同的格式 比如Docker npm NuGet maven …等 下载编译好的二进制安装 wget https://sonatype-download.gl ...

  7. mean项目的分模块开发

    全文字版: 新建maven工程在,作为父工程用于最后集合使用,该工程不需要src,只需要一个pom.xml文件,规定一下依赖版本之类的,再建一个工具类的工程,不需要放配置文件,和工程中方法接口有关的不 ...

  8. Ubuntu下面MySQL的参数文件my.cnf浅析

    前几天刚接手一个MySQL数据,操作系统为Ubuntu 16.04.5 LTS,  数据库版本为5.7.23-0ubuntu0.16.04.1(APT方式安装的MySQL).这个操作系统下的MySQL ...

  9. Greenplum扩容

    Greenplum支持原有主机扩展Segment个数.新增主机.和混合扩展 本文以在已有机器上扩展节点为例 1.可按照hostname:address:port:fselocation:dbid:co ...

  10. 爬虫之scrapy--基本操作

    参考博客  :https://www.cnblogs.com/wupeiqi/p/6229292.html Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘, ...