scrapy_redis 相关: 将 jobdir 保存的爬虫进度转移到 Redis
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相关推荐
- Git常用操作(清除工作区未跟踪文件、保存和恢复进度、打标签)
git clean 清除工作区未跟踪文件 git clean 命令去除冗余文件或者清理工作目录 git clean -f -d 移除工作目录中所有未追踪的文件以及空的子目录.(-f强制删除) git ...
- 使用git stash命令保存和恢复进度
上一篇博客我们使用git checkout命令来切换分支. 我们有时会遇到这样的情况,正在dev分支开发新功能,做到一半时有人过来反馈一个bug,让马上解决,但是新功能做到了一半你又不想提交,这时就可 ...
- git stash 强制恢复_git stash 保存和恢复进度
1. stash当前修改 git stash会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录. 比如下面的中间状态,通过git stash命令推送一个新的储藏,当前的工 ...
- Python 爬虫 性能 相关( asyncio 模块 --- 高性能爬虫 )
From:https://www.cnblogs.com/bravexz/p/7741633.html 爬虫应用 asyncio 模块 ( 高性能爬虫 ):https://www.cnblogs.co ...
- python下载图片并保存_Python爬虫获取图片并下载保存至本地的实例
1.抓取煎蛋网上的图片. 2.代码如下: import urllib.request import os #to open the url def url_open(url): req=urllib. ...
- 用户dsn保存位置‘_苹果iOS 13.6终于能保存文章阅读进度了 朋友都等秃了
几天前,iOS 13.6 Beta 2和iPadOS 13.6 Beta 2发布,据外媒iPhoneHacks消息,苹果此次通过新软件更新对Apple News应用程序进行了改进,更新后的iOS 13 ...
- 使用MemCache进行相关缓存的保存处理
一. 首先,需要导入相关工具包,xmemcached-1.4.2.jar 为必须导入的工具包. 二. 进行具体工具类的编写工作,下面直接上代码. CacheCallback.java package ...
- python requests cookie保存_Python爬虫教程:爬取知乎网
知乎已经成为了爬虫的训练场,本文利用Python中的requests库,模拟登陆知乎,获取cookie,保存到本地,然后这个cookie作为登陆的凭证,登陆知乎的主页面,爬取知乎主页面上的问题和对应问 ...
- scrapy 保存mysql_scrapy爬虫事件以及数据保存为txt,json,mysql
今天要爬取的网页是虎嗅网 我们将完成如下几个步骤: 创建一个新的Scrapy工程 定义你所需要要抽取的Item对象 编写一个spider来爬取某个网站并提取出所有的Item对象 编写一个Item Pi ...
- python批量读取图片并批量保存_Python爬虫:批量抓取花瓣网高清美图并保存
原标题:Python爬虫:批量抓取花瓣网高清美图并保存 昨天看到了不错的图片分享网--花瓣,里面的图片质量还不错,所以利用selenium+xpath我把它的妹子的栏目下爬取了下来,以图片栏目名称给文 ...
最新文章
- 学 Python 必看书单汇总
- Spring整合Mybatis之注解方式,(注解整合Junit)
- Cortex-M3基础
- jquery data()
- 两个变量实现查找坏环c语言,C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)...
- python网络爬虫与信息提取视频_Python网络爬虫与信息提取入门5
- html 页面数据显示溢出bug? - 提问篇
- 自动注入、加载 properties 文件、scope 属性、单例设计模式
- CXF整合Spring开发WebService
- css中绝对定位和浮动的异同
- 从零开始学习编程,会很难学吗?新手想快速掌握应该怎么学?
- 使用Python来计算均值、中位数、标准差
- 计算机类课题研究方法,课题研究方法有哪些
- 严版数据结构总结--绪论
- pandas数据绘制直方图、饼状图、线形图
- php实训制作登录界面总结,php实训报告心得体会
- 使用PS中的GCP点应用于SBAS轨道精炼
- c语言学生综合测评系统_c语言图书管理系统_c语言学生综合测评系统_c语言个人账本管理系统...
- linux磁盘合盘,超强启动盘制作工具MBROSTool(可隐藏,多分区,多启动)
- 免费的内网穿透(钉钉)
热门文章
- 海外硕士苏明哲回国后哀叹:我美本英硕,找不到工作很难受
- 技术出身要创业,容易吗?
- 2019 年中国互联网企业 100 强揭晓,你的公司排在第几位呢?
- 一次性搞清楚线上CPU100%,频繁FullGC排查套路
- three 天空球_three.js添加场景背景和天空盒(skybox)代码示例
- python为何排名越来越前_为什么C#排名和Python相差越来越大?
- ActiveMQ下载与安装(Linux环境下进行)
- 制作Makefile中 ** missing separator 错误解决
- 电子书分页,翻页效果,字体大小调整和基本功能实现
- word2vec 数学原理