采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师好,请教个问题。我在一个服务器上部署爬虫,有20个可用的IP。想开20个并发,每个request都有一个自己的IP。现在想对这20个request分别做限速。这么才能做到呢?
我做了这么一个中间件,貌似能实现这个功能,但是不能调试,也不知会有什么隐患,老师帮忙看一下。
import randomimport gevent, timefrom scrapy import signalsfrom gevent.queue import JoinableQueuefrom gevent import monkeyclass GeventPoolExecutor(object): def __init__(self, max_works): self._q = JoinableQueue() self.count = 0 for i in range(max_works): gevent.spawn(self.worker) self._q.join() def worker(self): while True: fn = self._q.get() try: exec(fn) except Exception as e: print(e) finally: self._q.task_done() def submit(self, fn): self._q.put(fn) def func(self): self.count += 1 count = self.count print('阻塞函数%s' % count,os.getpid()) block_time = random.randint(1, 4) time.sleep(block_time) print('阻塞完成%s' % count, '阻塞时间%s' % block_time)class DelayMiddlware(object): # 随机针对每次请求延时 def __init__(self, ): super(DelayMiddlware, self).__init__() self.gevent_pool_executor = GeventPoolExecutor(max_works=1000)
你这个是用的gevent,不是scrapy啊, 但是你要注意gevent的sleep一定不能用同步的time.sleep(block_time)方法 不然所有的请求都会block住, 你要使用gevent提供的sleep方法
好的,谢谢老师。还有一个问题,以前在windows上运行scrapy的时候需要一个pypiwin32 库,但是我到linux下怎么也安装不上,是不linux下不需要或者有别的代替?
在linux下面也有报错 不报错的话就不用安装了
要做到这个需要自己去修改一些源码才行 目前scrapy还没有针对具体某个request限速的方法
登录后可查看更多问答,登录/注册
带你彻底掌握Scrapy,用Django+Elasticsearch搭建搜索引擎
4.4k 30
2.3k 18
818 18
1.1k 15
2.1k 15