twisted 模拟scrapy调度循环
"""
模拟scrapy调度循环
"""
from ori_test import pr_type
import logging
import time
from twisted.internet import defer, task, reactor
from scrapy.utils.reactor import CallLaterOnce
log = logging.getLogger(__name__)
logger_m = log
class Slot(object):
def __init__(self, start_requests, nextcall):
self.start_requests = iter(start_requests)
self.nextcall = nextcall
self.heartbeat = task.LoopingCall(nextcall.schedule)
class Engine():
@defer.inlineCallbacks
def open_spider(self, spider, start_requests):
nextcall = CallLaterOnce(self._next_request, spider)
#start_requests = yield self.scraper.spidermw.process_start_requests(start_requests, spider)
slot = Slot(start_requests, nextcall)
self.slot = slot
self.spider = spider
yield 8
slot.nextcall.schedule()
slot.heartbeat.start(5)
def _next_request(self, spider):
print('next_request')
slot = self.slot
if not slot:
return
try:
v = next(slot.start_requests)
except StopIteration:
slot.start_requests = None
except Exception:
slot.start_requests = None
else:
def task_print(k):
#k = next(slot.start_requests)
d = defer.Deferred()
reactor.callLater(0, d.callback, k)
return d
d = task_print(v)
d.addCallback(lambda x: print('d is done', x))
d.addErrback(lambda x: print('d is not done'))
d.addCallback(self._next_request)
d.addErrback(lambda x: print('d is error'))
class Spider():
def __init__(self):
pass
self._before_start()
def start_requests(self):
logger_m.info('start spider the first page!')
# USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
for x in range(1000):
#time.sleep(3)
print('from spider yield', x )
yield x
#print(x)
# req = scrapy.Request(url='https://httpbin.org/ip', dont_filter=True)
yield 8888
def _before_start(self):
# 注册爬虫,信息内容为{spider_id, time()}
def spider_alive():
print('from looptask:spider alive')
# print(res)
pass
# 添加到定时任务,定时声明爬虫生死
# twisted 任务
looptask = task.LoopingCall(spider_alive)
looptask.start(5, now=True)
#looptask.start(60, now=True)
spider = Spider()
s_r = spider.start_requests()
pr_type(s_r)
s_r = iter(s_r)
pr_type(s_r)
a = Engine()
a.open_spider(spider, s_r)
reactor.run()
twisted 模拟scrapy调度循环的更多相关文章
- 非main goroutine的退出及调度循环(15)
本文是<Go语言调度器源代码情景分析>系列的第15篇,也是第二章的第5小节. 上一节我们说过main goroutine退出时会直接执行exit系统调用退出整个进程,而非main goro ...
- Golang源码学习:调度逻辑(三)工作线程的执行流程与调度循环
本文内容主要分为三部分: main goroutine 的调度运行 非 main goroutine 的退出流程 工作线程的执行流程与调度循环. main goroutine 的调度运行 runtim ...
- 详解Go语言调度循环源码实现
转载请声明出处哦~,本篇文章发布于luozhiyun的博客: https://www.luozhiyun.com/archives/448 本文使用的go的源码15.7 概述 提到"调度&q ...
- python---twisted的使用,使用其模拟Scrapy
twisted的网络使用 twisted的异步使用 一:简单使用 from twisted.internet import defer from twisted.web.client import g ...
- scrapy 基础组件专题(七):scrapy 调度器、调度器中间件、自定义调度器
一.调度器 配置 SCHEDULER = 'scrapy.core.scheduler.Scheduler' #表示scrapy包下core文件夹scheduler文件Scheduler类# 可以通过 ...
- hdu1047(模拟大量的循环添加)
标题信息:总结多个大整数,(使用add循环相加的功能) http://acm.hdu.edu.cn/showproblem.php? pid=1047 AC代码: /** *大数的循环加法,转化为字 ...
- CodeForces - 1175B Catch Overflow!(栈模拟多重for循环)
You are given a function ff written in some basic language. The function accepts an integer value, w ...
- JS,JQ实现模拟暂停FOR循环,间隔几秒后再继续执行
<!DOCTYPE html><head><script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquer ...
- Servlet+AJAX实现的模拟电梯调度
需求产生: 大三下学期天天在学校的同一栋教学楼上课,每天要等四次电梯,有次等电梯无聊了,就想到电梯的运行逻辑该如何用程序来表达呢? 问题描述: 大学的那栋楼有21层,不过在页面中画21层有点密,所以只 ...
随机推荐
- P&R 4
Floorplan 要做好fp需要掌握哪些知识和技能? 通常遇到fp问题大致的debug步骤和方法有哪些? 如何衡量fp的QA? 通常FP是做PR 最关键也最具技术含量的一个环节.相对于后续的PR步骤 ...
- Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解
Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解 说明:Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解,实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返 ...
- 被女朋友三番五次拉黑后,我用 Python 写了个“舔狗”必备神器
在一个阳光明媚的周日,我打开窗户呼吸了一口新鲜空气.阳光灿烂,岁月静好,又是一个约女朋友出去爬山吃饭看电影的好日子. 想到女朋友的大眼睛,我脸上不禁洋溢起了幸福的微笑.打开微信,给女朋友发出去一个美好 ...
- Vue基础笔记2
目录 1. 如何获取Vue对象中的成员? 2. pre指定 3. for循环 4. todolist 5. 分隔符 6. computed 计算后的 7. vue的生命周期(讲解不全) 8. watc ...
- java ArrayList添加元素全部一样
#开始 今天遇到了一个很神奇的事情 也即是我在用ArrayList的add方法循环加入对象的时候 发现添加的元素全部都是一样的 定位错误定位了一个下午.... 错误位置就是哪一个位置 但是就是不知道为 ...
- Cookie API介绍
一.Java提供的操作Cookie的API Java中的javax.servlet.http.Cookie类用于创建一个Cookie Cookie类的主要方法 No. 方法 类型 描述 Cookie( ...
- 消息队列(四)--- RocketMQ-消息发送2
概述 接着我们上一篇继续分析消息发送,上节讲到消息发送前有可能遇到 broker 失效的情况,RocketMQ 主要是采用两种策略 : 重试发送 broker 故障延迟机制 后者指的是当发送给 ...
- C语言-对字符串二维数组各个元素进行比较-十进制数转化为其他进制数-进行规则矩阵的输出-190225
//编写一个函数:从传入的num个字符中找到最长的一个字符,并通过max传回该串地址. //重点:切记这里a[0]就是一个地址. #include<conio.h> #include< ...
- js中ES6的Set的基本用法
ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. const s = new Set(); [2,3,5,4,5,2,2].forEach(x => s. ...
- java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter 可能是我们运行的java版本过高导致
最近给自己写了个 SpringBoot 应用程序 顺便练练手,准备把程序过到 树莓派 上,结果登陆报错