路飞学城—Python爬虫实战密训班 第三章

一、scrapy-redis插件实现简单分布式爬虫

scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫:- 定义调度器- 定义去重规则: 本质利用redis 集合元素不重复(被调度器使用) # 看源码request_seen函数安装: pip3 install scrapy-redis

  

1. redis配置文件settings.py

#from scrapy_redis import defaults                         # 查看默认配置

REDIS_HOST = '192.168.11.81'                            # 主机名
REDIS_PORT = 6379                                       # 端口
# REDIS_URL = 'redis://user:pass@hostname:9001'           # 连接URL(优先于以上配置)
# REDIS_PARAMS  = {}                                      # Redis连接参数             默认:REDIS_PARAMS = {'socket_timeout': 30,'socket_connect_timeout': 30,'retry_on_timeout': True,'encoding': REDIS_ENCODING,})
# REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient'     # 指定连接Redis的Python模块  默认:redis.StrictRedis
REDIS_ENCODING = "utf-8"                                # redis编码类型             默认:'utf-8'

连接Redis

from scrapy_redis.scheduler import Scheduler
SCHEDULER = "scrapy_redis.scheduler.Scheduler"        # 使用该调度器,scrapy-redis原生调度器被替换掉from scrapy_redis.queue import PriorityQueue
from scrapy_redis import picklecompat
SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'              # 默认使用优先级队列(默认),其他:PriorityQueue(有序集合),FifoQueue(列表)、LifoQueue(列表)
SCHEDULER_QUEUE_KEY = '%(spider)s:requests'                              # 调度器中请求存放在redis中的key
SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"                      # 对保存到redis中的数据进行序列化,默认使用pickle
SCHEDULER_PERSIST = True                                                  # 是否在关闭时候保留原来的调度器和去重记录,True=保留,False=清空
SCHEDULER_FLUSH_ON_START = False                                          # 是否在开始之前清空 调度器和去重记录,True=清空,False=不清空。本地测试可以为true,实际工作中False
SCHEDULER_IDLE_BEFORE_CLOSE = 10                                          # 去调度器中获取数据时,如果为空,最多等待时间(最后没数据,未获取到)。
SCHEDULER_DUPEFILTER_KEY = '%(spider)s:dupefilter'                      # 去重规则,在redis中保存时对应的key
SCHEDULER_DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'      # 去重规则对应处理的类

设置调度器

from scrapy_redis.pipelines import RedisPipelineITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline': 300,
}REDIS_ITEMS_KEY = '%(spider)s:items'
REDIS_ITEMS_SERIALIZER = 'json.dumps'    # 指定下序列化

数据持久化

2. 当url太长时,数据库保存占空间,创建唯一标识符

from scrapy.utils import request
from scrapy.http import Requestobj1 = Request(url='http://www.baidu.com?id=1&name=3')
obj2 = Request(url='http://www.baidu.com?name=3&id=1')        # 当传参一致时,创建的标识符也一样

v = request.request_fingerprint(obj1)
print(v)
v = request.request_fingerprint(obj2)
print(v)

test.py

3. 起始URL相关

from scrapy_redis.pipelines import RedisSpider
class ChoutiSpider(scrapy.RedisSpider):name = "chouti"allowed_domains = ["chouti.com"]def parse(self, response):for i in range(0,10):yield

chouti.py:不用写起始url,但是这个爬虫不会终止, 不用redis的话 爬虫下载完url后会终止。

4. 小结

1. memcached2. Django缓存3. redis- 连接- StrictRedis()- Redis(StrictRedis)    # 继承StrictRedis- 连接池- 基本操作..- 事务- 发布和订阅4. scrapy-redis流程4.1 引擎,获取起始Request对象, 添加(pickle)到调度器- scrapy内部调度器- scrapy-redis调度器三个选择:先进先出列表,后进先出列表,有序集合4.2 调度器通知下载器可以开始下载,去调度器中获取request对象(通过pickle存储request对象),下载器进行下载           4.3 爬虫parse方法,yield返回对象item或request- item              交给pipeline处理- request           交给调度去处理,调用DUPEFILTER_CLASS去检查是否已经访问过,来决定request重新放置调度器或者丢弃scrapy-redis扩种:- 中间件- 基于信号的扩展

三、scrapy-redis示例

# DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
#
#
# from scrapy_redis.scheduler import Scheduler
# from scrapy_redis.queue import PriorityQueue
# SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.PriorityQueue'          # 默认使用优先级队列(默认),其他:PriorityQueue(有序集合),FifoQueue(列表)、LifoQueue(列表)
# SCHEDULER_QUEUE_KEY = '%(spider)s:requests'                         # 调度器中请求存放在redis中的key
# SCHEDULER_SERIALIZER = "scrapy_redis.picklecompat"                  # 对保存到redis中的数据进行序列化,默认使用pickle
# SCHEDULER_PERSIST = True                                            # 是否在关闭时候保留原来的调度器和去重记录,True=保留,False=清空
# SCHEDULER_FLUSH_ON_START = False                                    # 是否在开始之前清空 调度器和去重记录,True=清空,False=不清空
# SCHEDULER_IDLE_BEFORE_CLOSE = 10                                    # 去调度器中获取数据时,如果为空,最多等待时间(最后没数据,未获取到)。
# SCHEDULER_DUPEFILTER_KEY = '%(spider)s:dupefilter'                  # 去重规则,在redis中保存时对应的key
# SCHEDULER_DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'# 去重规则对应处理的类
#
#
#
# REDIS_HOST = '10.211.55.13'                           # 主机名
# REDIS_PORT = 6379                                     # 端口
# # REDIS_URL = 'redis://user:pass@hostname:9001'       # 连接URL(优先于以上配置)
# # REDIS_PARAMS  = {}                                  # Redis连接参数             默认:REDIS_PARAMS = {'socket_timeout': 30,'socket_connect_timeout': 30,'retry_on_timeout': True,'encoding': REDIS_ENCODING,})
# # REDIS_PARAMS['redis_cls'] = 'myproject.RedisClient' # 指定连接Redis的Python模块  默认:redis.StrictRedis
# REDIS_ENCODING = "utf-8"                              # redis编码类型             默认:'utf-8'

配置文件

import scrapyclass ChoutiSpider(scrapy.Spider):name = "chouti"allowed_domains = ["chouti.com"]start_urls = ('http://www.chouti.com/',)def parse(self, response):for i in range(0,10):yield

爬虫文件

四、总结

  WuSir为了给我们介绍分布式爬虫,他首先用了个典型的例子举例。问题是:在不考虑开进程和线程(比如这些都已经做好了)如何提高爬虫的性能?说到这可能大家心里都已经有答案了,没错,我最帅!

  好了,回到正题;既然进程和线程都不需要我们考虑的情况下,那么我们的一般选择就应该是多加些机器一起爬,但是随之而来的又有一个问题、单纯的增加机器,不让它们相互协调的工作,这会造成会重复的做相同的无用功,也就是会爬到相同的URL。要是不让它们协调在一起,这个方案也就没意义了。
  既然问题已经抛出,那么我们就可以引入答案了,也就是如题所说的:scrapy-redis、使用该模块可以帮助我们实现分布式爬虫。我们需要做的则是对他进行相应的操作和配置或者扩展,来进行使用它即可达到我们的目的。

  

转载于:https://www.cnblogs.com/sunday294/p/9301584.html

路飞学城—Python爬虫实战密训班 第三章相关推荐

  1. 路飞学城—Python—爬虫实战密训班 第二章

    请求库之requests模块总结 request: # 必须背会 method url params data json headers cookies :param proxies: 如果被封IP ...

  2. 路飞学城-Python爬虫实战密训-第1章

    正式的开始学习爬虫知识,Python是一门接触就会爱上的语言.路飞的课真的很棒,课程讲解不是告诉你结论,而是在告诉你思考的方法和过程. 第一章,学习了如何爬取汽车之家以及抽屉登录并点赞. 1 impo ...

  3. 路飞学城-Python 爬虫实战密训-第 1 章

    本节学习体会: 鸡汤心得: 1.时代发展太快,要不断学习新东西,武装自己,才能跟得上时代的潮流,不然就是面临被pass的命运 2.要看清楚趋势,不要闭门造车 3.学习编程语言就跟学英语一样,方法很重要 ...

  4. 路飞学城python电子书_路飞学城-Python爬虫实战密训-第1章

    7 8 The Dormouse's story总共9 f 10 11 12

  5. 路飞学成-Python爬虫实战密训-第3章

    1,本节学习体会.心得 : 本章的内容非常多,scrapy框架的使用.对于学过django的人来说.可能要更好理解一些把.个人感觉还是挺简单的.所有的知识点一听就懂,唯一不好的就是时间太紧迫了,不的不 ...

  6. 路飞学院-Python爬虫实战密训班-第2章

    通过架设flask或django web服务器,同时后台采用requests和bs4模块来爬取web微信程序相关信息. 在代码过程中遇到一些问题,1.需要认真分析网络请求包. 2.cookies 在获 ...

  7. 路飞学院python官网-路飞学院-Python爬虫实战密训班-第1章

    学习笔记: 通过本章的学习,学习到了requests和BeautifulSoup模块的安装及使用方法.以及爬取给类网站的方法和知识点. 1.requests和BeautifulSoup 安装 pip ...

  8. 路飞学院 python_路飞学院-Python爬虫实战密训班-第1章

    学习笔记: import requests from bs4 import BeautifulSoup GET请求 r = requests.get('http://') r.text 返回heade ...

  9. 路飞学城python全栈开发_[Python] 老男孩路飞学城Python全栈开发重点班 骑士计划最新100G...

    简介 老男孩&路飞学城Python全栈开发重点班课程,作为Python全栈教学系列的重头戏,投入了全新的课程研发和教学精力,也是Python骑士计划的核心教学,由ALEX老师开班镇守,一线技术 ...

最新文章

  1. [elixir! #0007] [译] 理解Elixir中的宏——part.5 重塑AST by Saša Jurić
  2. 屏蔽朋友圈的第一天的感悟
  3. 【完全开源】微信客户端.NET版
  4. elementui的tree组件页面显示不出数据_只要10分钟,教你配置出炫酷的数据可视化大屏...
  5. java模拟洗衣机程序,JAVA洗衣机仿真程序实验报告及代码
  6. 【Arduino实验03 智能红绿灯】
  7. arduino 实现时钟和计算器
  8. protobuf 微信小程序_微信小程序使用Protobuf
  9. 程序员怎么跨年?跨年烟花网页支持自定义文本烟花
  10. oracle建表案例,oracle创建表语句
  11. 配置高可用Eureka Server遇到的神坑:无法注册服务
  12. javaweb 图书管理系统完整代码_群晖 + Docker + Calibre-Web 搭建电子书管理系统
  13. 2022年RocketMQ面试题及答案
  14. 自动驾驶系统进阶与项目实战(三)基于全卷积神经网络的点云三维目标检测和ROS实战
  15. 双系统下Ubuntu20.04使用Pavucontrol无法连接pulseaudio解决办法
  16. 摩根大通银行被黑客攻克, ATM机/网银危在旦夕,winxp退市灾难来临了
  17. 防止matplotlib画完图后自动关闭NN
  18. python画人脸肖战_立个flag,蒋凡即将离开程序猿.肖战战:阿里?一刀10…
  19. 华大芯片时钟调试配置记录
  20. 五、DMSP/OLS和NPP/VIIRS夜间灯光数据拟合校正

热门文章

  1. 50年间,高水平论文数量国家排名是怎样变化的?| 可视化数据
  2. AI为癌细胞杀手“染色”,辅助医生选择治疗方案 | 附论文
  3. Linux就该这么学-第三课
  4. 《iOS应用安全攻防实战》第六章:无法销毁的文件
  5. DeepMind智能体自学跑酷:略显智障,结果尚好
  6. 全面分析RHCE7(红帽认证工程师)考试题目之 ----Samba文件共享篇
  7. 给angularJs grid列上添加自定义按钮
  8. android-async-http取消请求
  9. Android开发自定义View之滑动按钮与自定义属性
  10. “隐私经济”有未来吗?