请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

scrapy限速配置

老师好,请教个问题。我在一个服务器上部署爬虫,有20个可用的IP。想开20个并发,每个request都有一个自己的IP。现在想对这20个request分别做限速。这么才能做到呢? 


正在回答 回答被采纳积分+3

2回答

提问者 慕尼黑530398 2017-12-31 11:34:53

我做了这么一个中间件,貌似能实现这个功能,但是不能调试,也不知会有什么隐患,老师帮忙看一下。


import random
import gevent, time

from scrapy import signals
from gevent.queue import JoinableQueue
from gevent import monkey


class 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)

0 回复 有任何疑惑可以回复我~
  • bobby #1
    你这个是用的gevent,不是scrapy啊, 但是你要注意gevent的sleep一定不能用同步的time.sleep(block_time)方法 不然所有的请求都会block住, 你要使用gevent提供的sleep方法
    回复 有任何疑惑可以回复我~ 2018-01-02 18:22:34
  • 提问者 慕尼黑530398 回复 bobby #2
    好的,谢谢老师。还有一个问题,以前在windows上运行scrapy的时候需要一个pypiwin32 库,但是我到linux下怎么也安装不上,是不linux下不需要或者有别的代替?
    回复 有任何疑惑可以回复我~ 2018-01-03 22:35:00
  • bobby 回复 提问者 慕尼黑530398 #3
    在linux下面也有报错 不报错的话就不用安装了
    回复 有任何疑惑可以回复我~ 2018-01-05 17:10:58
bobby 2017-12-29 17:23:45

要做到这个需要自己去修改一些源码才行 目前scrapy还没有针对具体某个request限速的方法

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信