嘘~ 正在从服务器偷取页面 . . .

Scrapy-Redis


scrapy-redis

1.普通爬虫


  • 普通爬虫正常处理完 scrapy 流程后修改 settings 配置文件即可。
  • 在 redis 中会出现存储的 item,和链接指纹,下次指纹相同的 url 将不会再次请求
    • item 的作用只是帮你在 redis 中存储一份数据
    • 通用爬虫原理相同(写完流程修改配置文件即可)
    • 需要在 redis 中存储 item,需要将 redis 的中间件加入管道,否则就只会存储链接指纹
    • 增加了 redis 的普通爬虫,支持断点续传,增量爬取
# 使用scrapy_redis的去重机制
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

# 去重规则,在redis中保存时对应的key
# SCHEDULER_DUPEFILTER_KEY = '%(spider)s:dupefilter'

# 使用scrapy_redis的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

# 在redis中保持scrapy-redis用到的各个队列,从而允许暂停和暂停后恢复,也就是不清理redis queues
SCHEDULER_PERSIST = True

# 默认情况下,RFPDupeFilter只记录第一个重复请求。将DUPEFILTER_DEBUG设置为True会记录所有重复的请求。
DUPEFILTER_DEBUG = True

# 指定排序爬取地址时使用的队列

# 只在使用SpiderQueue或者SpiderStack时有效的参数,指定爬虫关闭的最大间隔时间
# SCHEDULER_IDLE_BEFORE_CLOSE = 10

# 默认的 按优先级排序(Scrapy默认),由sorted set实现的一种非FIFO、LIFO方式。
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"

# 可选的 按先进先出排序(FIFO)
# SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"

# 可选的 按后进先出排序(LIFO)
# SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"


# 在ITEM_PIPELINES中添加redis管道(可以添加自己的管道,数据也会进入redis)
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 400,
}

# redis连接信息
REDIS_HOST = '192.168.229.128'
REDIS_PORT = 6379

# 设置密码,并且指定数据库
REDIS_PARAMS = {
    'password': 'redis',
    'db': 11
}

# 带密码访问(指定数据库)(这项优先级比上面的HOST高)
REDIS_URL = "redis://:redis@192.168.229.128:6379/11"


# 编码设置(redis数据库也要设置)
REDIS_ENCODING = 'utf-8'


2.分布式爬虫


  • 1.在处理完正常爬取流程后,将 settings 配置文件修改为上面通用配置文件
  • 2.修改 scrapy 爬虫继承的类
    • 1.from scrapy_redis.spiders import RedisSpider
    • 2.如果是通用爬虫,就继承 RedisCrawlSpider
  • 2.没有了 start_urls 属性,取而代之的是 redis_key = ‘name’
    • 后面的 name 表示在 redis 中可以被共享的队列名
      • 之后进入到要启动的爬虫文件位置
      • 启动指令为:scrapy runspider pa.py
      • 最后面的 pa.py 为爬虫文件的文件名
      • 如果日志文件等级太高将不会有任何输出
    • scrapy 将在队列内 pop 出一个 url 进行爬取
    • 4.配置文件中修改好 redis 数据库的信息
    • 5.在 redis 内执行 lpush redis_keys 的名字 需要爬取的 url
    • 完毕!

传参

  • 但有时候并不是只传一个 url 过去就好了,还需要传递一些参数什么。
  • 可以进行以下操作
from json import loads
def make_request_from_data(self, data):
    # 在scrapy-redis读取数据进来的时候,就会传递给data
    # 就是在lpush的时候第三个参数
    data = loads(data)
    # 在loads后,即可像字典一样使用
    yield scrapy.Request(url=data['url'], callback=self.parse, method='GET', cb_kwargs={'value': int(data['value'])})
  • 在 Linux 服务器内 lpush
# 格式要求,第二个参数是redis-key名
# 第三个参数为传入的地址,以及参数 ( 注意最外面要单引号,内部参数都要用双引号 )
lpush redis-key '{"url":"https://www.xxx.com","value":5}'

# 在loads处理后就可以以字典形式进行操作

3.主机端


  • 之后可以再写一个 scrapy 只负责抓取 url,写入 redis 中,实现分布式。

注意事项:

  • 这里导入 item 不要使用..item,会导致启动分布式爬虫的时候报错
    • 推荐:from spider.items import SpiderItem
    • redis 链接时中文乱码:redis-cli –raw -h ip -p 端口


文章作者: 林木木
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 林木木 !
评论
 上一篇
Xpath表达式 Xpath表达式
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。 XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。
2021-08-03
下一篇 
Scrapy Scrapy
Scrapy 是一套基于基于Twisted的异步处理框架,纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便
2021-07-28
  目录