0.参考

Scrapy 隐含 bug: 强制关闭爬虫后从 requests.queue 读取的已保存 request 数量可能有误

1.说明

Scrapy 设置 jobdir,停止爬虫后,保存文件目录结构:

crawl/apps/
├── requests.queue
│   ├── active.json
│   ├── p0
│   └── p1
├── requests.seen
└── spider.state

requests.queue/p0 文件保存 priority=0 的未调度 request, p-1 对应实际 priority=1 的高优先级 request,转移到 redis 有序集合时,score 值越小排序越靠前,因此取 score 为 -1。以此类推,p1 对应 priority=-1 的低优先级 request。

requests.seen 保存请求指纹过滤器对已入队 request 的 hash 值,每行一个值。

spider.state 涉及自定义属性的持久化存储,不在本文处理范围以内。

2.实现代码

import os
from os.path import join
import re
import structimport redisdef sadd_dupefilter(jobdir, redis_server, name):"""See python/lib/site-packages/scrapy/dupefilters.py"""file = join(jobdir, 'requests.seen')with open(file) as f:print('Processing %s, it may take minutes...'%file)key = '%s:dupefilter'%namefor x in f:redis_server.sadd(key, x.rstrip())print('Result: {} {}'.format(key, redis_server.scard(key)))def zadd_requests(jobdir, redis_server, name):"""See python/lib/site-packages/queuelib/queue.py"""SIZE_FORMAT = ">L"SIZE_SIZE = struct.calcsize(SIZE_FORMAT)key = '%s:requests'%namequeue_dir = join(jobdir, 'requests.queue')file_list = os.listdir(queue_dir)file_score_dict = dict([(f, int(f[1:])) for f in file_list if re.match(r'^p-?\d+$', f)])for (file, score) in file_score_dict.items():print('Processing %s, it may take minutes...'%file)f = open(join(queue_dir, file), 'rb+')qsize = f.read(SIZE_SIZE)total_size, = struct.unpack(SIZE_FORMAT, qsize)f.seek(0, os.SEEK_END)actual_size = 0while True:if f.tell() == SIZE_SIZE:breakf.seek(-SIZE_SIZE, os.SEEK_CUR)size, = struct.unpack(SIZE_FORMAT, f.read(SIZE_SIZE)) f.seek(-size-SIZE_SIZE, os.SEEK_CUR)data = f.read(size)redis_server.execute_command('ZADD', key, score, data)f.seek(-size, os.SEEK_CUR)actual_size += 1print('total_size {}, actual_size {}, score {}'.format(total_size, actual_size, score))print('Result: {} {}'.format(key, redis_server.zlexcount(key, '-', '+')))if __name__ == '__main__':name = 'test'jobdir = '/home/yourproject/crawl/apps'database_num = 0# apps/# ├── requests.queue# │   ├── active.json# │   ├── p0# │   └── p1# ├── requests.seen# └── spider.state
    password = 'password'host = '127.0.0.1'port = '6379'redis_server = redis.StrictRedis.from_url('redis://:{password}@{host}:{port}/{database_num}'.format(password=password, host=host,port=port, database_num=database_num))sadd_dupefilter(jobdir, redis_server, name)zadd_requests(jobdir, redis_server, name)

3.运行结果

转载于:https://www.cnblogs.com/my8100/p/scrapy_jobdir_to_redis.html

scrapy_redis 相关: 将 jobdir 保存的爬虫进度转移到 Redis相关推荐

  1. Git常用操作(清除工作区未跟踪文件、保存和恢复进度、打标签)

    git clean 清除工作区未跟踪文件 git clean 命令去除冗余文件或者清理工作目录 git clean -f -d 移除工作目录中所有未追踪的文件以及空的子目录.(-f强制删除) git ...

  2. 使用git stash命令保存和恢复进度

    上一篇博客我们使用git checkout命令来切换分支. 我们有时会遇到这样的情况,正在dev分支开发新功能,做到一半时有人过来反馈一个bug,让马上解决,但是新功能做到了一半你又不想提交,这时就可 ...

  3. git stash 强制恢复_git stash 保存和恢复进度

    1. stash当前修改 git stash会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录. 比如下面的中间状态,通过git stash命令推送一个新的储藏,当前的工 ...

  4. Python 爬虫 性能 相关( asyncio 模块 --- 高性能爬虫 )

    From:https://www.cnblogs.com/bravexz/p/7741633.html 爬虫应用 asyncio 模块 ( 高性能爬虫 ):https://www.cnblogs.co ...

  5. python下载图片并保存_Python爬虫获取图片并下载保存至本地的实例

    1.抓取煎蛋网上的图片. 2.代码如下: import urllib.request import os #to open the url def url_open(url): req=urllib. ...

  6. 用户dsn保存位置‘_苹果iOS 13.6终于能保存文章阅读进度了 朋友都等秃了

    几天前,iOS 13.6 Beta 2和iPadOS 13.6 Beta 2发布,据外媒iPhoneHacks消息,苹果此次通过新软件更新对Apple News应用程序进行了改进,更新后的iOS 13 ...

  7. 使用MemCache进行相关缓存的保存处理

    一. 首先,需要导入相关工具包,xmemcached-1.4.2.jar 为必须导入的工具包. 二. 进行具体工具类的编写工作,下面直接上代码. CacheCallback.java package ...

  8. python requests cookie保存_Python爬虫教程:爬取知乎网

    知乎已经成为了爬虫的训练场,本文利用Python中的requests库,模拟登陆知乎,获取cookie,保存到本地,然后这个cookie作为登陆的凭证,登陆知乎的主页面,爬取知乎主页面上的问题和对应问 ...

  9. scrapy 保存mysql_scrapy爬虫事件以及数据保存为txt,json,mysql

    今天要爬取的网页是虎嗅网 我们将完成如下几个步骤: 创建一个新的Scrapy工程 定义你所需要要抽取的Item对象 编写一个spider来爬取某个网站并提取出所有的Item对象 编写一个Item Pi ...

  10. python批量读取图片并批量保存_Python爬虫:批量抓取花瓣网高清美图并保存

    原标题:Python爬虫:批量抓取花瓣网高清美图并保存 昨天看到了不错的图片分享网--花瓣,里面的图片质量还不错,所以利用selenium+xpath我把它的妹子的栏目下爬取了下来,以图片栏目名称给文 ...

最新文章

  1. 学 Python 必看书单汇总
  2. Spring整合Mybatis之注解方式,(注解整合Junit)
  3. Cortex-M3基础
  4. jquery data()
  5. 两个变量实现查找坏环c语言,C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)...
  6. python网络爬虫与信息提取视频_Python网络爬虫与信息提取入门5
  7. html 页面数据显示溢出bug? - 提问篇
  8. 自动注入、加载 properties 文件、scope 属性、单例设计模式
  9. CXF整合Spring开发WebService
  10. css中绝对定位和浮动的异同
  11. 从零开始学习编程,会很难学吗?新手想快速掌握应该怎么学?
  12. 使用Python来计算均值、中位数、标准差
  13. 计算机类课题研究方法,课题研究方法有哪些
  14. 严版数据结构总结--绪论
  15. pandas数据绘制直方图、饼状图、线形图
  16. php实训制作登录界面总结,php实训报告心得体会
  17. 使用PS中的GCP点应用于SBAS轨道精炼
  18. c语言学生综合测评系统_c语言图书管理系统_c语言学生综合测评系统_c语言个人账本管理系统...
  19. linux磁盘合盘,超强启动盘制作工具MBROSTool(可隐藏,多分区,多启动)
  20. 免费的内网穿透(钉钉)

热门文章

  1. 海外硕士苏明哲回国后哀叹:我美本英硕,找不到工作很难受
  2. 技术出身要创业,容易吗?
  3. 2019 年中国互联网企业 100 强揭晓,你的公司排在第几位呢?
  4. 一次性搞清楚线上CPU100%,频繁FullGC排查套路
  5. three 天空球_three.js添加场景背景和天空盒(skybox)代码示例
  6. python为何排名越来越前_为什么C#排名和Python相差越来越大?
  7. ActiveMQ下载与安装(Linux环境下进行)
  8. 制作Makefile中 ** missing separator 错误解决
  9. 电子书分页,翻页效果,字体大小调整和基本功能实现
  10. word2vec 数学原理