以往爬虫都是用自己写的一个爬虫框架,一群Workers去Master那领取任务后开始爬。进程数量等于处理器核心数,通过增开线程数提高爬取速度。

最近看了Celery,接口真是优美,挺想试验下异步模型来写个爬虫。

模拟目标

为了方便测试,用Tornado搭了一个简易的服务器,用来模拟被爬的网站。

功能很简单,每个请求阻塞6秒才回复import tornado.webimport tornado.ioloopimport timefrom concurrent.futures import ThreadPoolExecutorfrom tornado.concurrent import run_on_executorimport tornado.genclass MainHandler(tornado.web.RequestHandler):

executor = ThreadPoolExecutor(40) @tornado.web.asynchronous @tornado.gen.coroutine

def get(self):

print(time.asctime()) yield self.sleep(6)

self.write('from server:' + time.asctime())

self.finish() @run_on_executor

def sleep(self, sec):

time.sleep(sec)if __name__ == '__main__':

app = tornado.web.Application(handlers=[

('^/.*', MainHandler)

])

app.listen(10240)

tornado.ioloop.IOLoop.instance().start()

消费者

task里就一个spider函数,功能是利用gevent去请求给定的目标import gevent.monkey

gevent.monkey.patch_socket()from celery import Celeryimport socketimport requestsimport gevent

app = Celery('tasks',

broker='redis://127.0.0.1:6379/3',

backend='redis://127.0.0.1:6379/3')@app.taskdef spider(url):

resp = gevent.spawn(requests.get, url)

tmp = 0

while True:

print('wait...', tmp) if resp.ready(): return 'from:' + socket.getfqdn() + '\nres:' + str(resp.value.text)

gevent.sleep(1)

tmp += 1

用gevent模式启动Celerycelery worker -A tasks --loglevel info -c 100 -P gevent

生产者

利用刚刚编写的spider函数去爬取目标

测试中,下面代码开了6个进程,结果均在7秒内返回,证明成功了。from tasks import spiderimport timeimport random

res = spider.delay('http://127.0.0.1:10240/{}'.format(random.randint(1, 999)))

i = 0while True: if res.ready():

print('res:', res.get()) break

else:

print('wait...', i)

time.sleep(1)

i += 1

Celery的部分日志输出:

可以看出在一个Celery进程内,多个spider函数轮替执行的[2016-08-20 21:27:11,281: INFO/MainProcess] Starting new HTTP connection (1): 127.0.0.1[2016-08-20 21:27:11,313: INFO/MainProcess] Received task: tasks.spider[7b8b6f63-2bef-491e-a3a8-fdbcff824b9c][2016-08-20 21:27:11,314: WARNING/MainProcess] wait...[2016-08-20 21:27:11,314: WARNING/MainProcess] 0[2016-08-20 21:27:11,316: INFO/MainProcess] Starting new HTTP connection (1): 127.0.0.1[2016-08-20 21:27:11,354: INFO/MainProcess] Received task: tasks.spider[5aa05e65-504d-4a04-8247-3f5708bfa46f][2016-08-20 21:27:11,356: WARNING/MainProcess] wait...[2016-08-20 21:27:11,356: WARNING/MainProcess] 0[2016-08-20 21:27:11,357: INFO/MainProcess] Starting new HTTP connection (1): 127.0.0.1[2016-08-20 21:27:11,821: WARNING/MainProcess] wait...[2016-08-20 21:27:11,821: WARNING/MainProcess] 1[2016-08-20 21:27:11,989: WARNING/MainProcess] wait...[2016-08-20 21:27:11,990: WARNING/MainProcess] 1[2016-08-20 21:27:12,059: WARNING/MainProcess] wait...[2016-08-20 21:27:12,059: WARNING/MainProcess] 2[2016-08-20 21:27:12,208: WARNING/MainProcess] wait...[2016-08-20 21:27:12,209: WARNING/MainProcess] 1[2016-08-20 21:27:12,225: WARNING/MainProcess] wait...[2016-08-20 21:27:12,225: WARNING/MainProcess] 1[2016-08-20 21:27:12,246: WARNING/MainProcess] wait...[2016-08-20 21:27:12,247: WARNING/MainProcess] 2[2016-08-20 21:27:12,282: WARNING/MainProcess] wait...[2016-08-20 21:27:12,282: WARNING/MainProcess] 1[2016-08-20 21:27:12,316: WARNING/MainProcess] wait...[2016-08-20 21:27:12,316: WARNING/MainProcess] 1[2016-08-20 21:27:12,357: WARNING/MainProcess] wait...[2016-08-20 21:27:12,357: WARNING/MainProcess] 1[2016-08-20 21:27:12,823: WARNING/MainProcess] wait...[2016-08-20 21:27:12,823: WARNING/MainProcess] 2[2016-08-20 21:27:12,991: WARNING/MainProcess] wait...[2016-08-20 21:27:12,992: WARNING/MainProcess] 2[2016-08-20 21:27:13,061: WARNING/MainProcess] wait...[2016-08-20 21:27:13,061: WARNING/MainProcess] 3[2016-08-20 21:27:13,210: WARNING/MainProcess] wait...[2016-08-20 21:27:13,211: WARNING/MainProcess] 2[2016-08-20 21:27:13,227: WARNING/MainProcess] wait...[2016-08-20 21:27:13,227: WARNING/MainProcess] 2

最后

借助Celery,爬虫很容易实现横向扩展,在多台服务器上增加消费者进程即可;

借助gevent,单进程内requests做到了非阻塞,而我过去是用多线程对付阻塞的。

Celery,gevent我也是初学一天,这小玩意儿做出来后,得开始看文档了深入了解了!

作者:spencer404

链接:https://www.jianshu.com/p/c1e53cc32d4d

python异步爬虫_Python异步爬虫试验[Celery,gevent,requests]相关推荐

  1. python多线程异步爬虫-Python异步爬虫试验[Celery,gevent,requests]

    以往爬虫都是用自己写的一个爬虫框架,一群Workers去Master那领取任务后开始爬.进程数量等于处理器核心数,通过增开线程数提高爬取速度. 最近看了Celery,接口真是优美,挺想试验下异步模型来 ...

  2. python执行cmd命令行异步执行_Python 异步调用命令行工具

    当你在自己的 Python 程序中采用了基于事件循环的异步编程方法之后,你就会发现自己不自觉地被其牢牢吸引住,并不是说这一方法多么棒,而是因为你不得不想办法保证程序中的任意环节都不能是阻塞的! 例如当 ...

  3. python2异步编程_python异步编程入门

    这几天看代码,总是会接触到很多异步编程,之前只想着实现功能,从来没考虑过代码的运行快慢问题,故学习一番. 从0到1,了解python异步编程的演进 1.urllib与requests爬虫 reques ...

  4. python2异步编程_python异步编程 (转载)

    转自:https://zhuanlan.zhihu.com/p/27258289 本文将会讲述Python 3.5之后出现的async/await的使用方法,以及它们的一些使用目的,如果错误,欢迎指正 ...

  5. python3多线程异步爬虫_python 多线程爬虫问题

    practicer 2016-06-14 12:42:08 +08:00 @alexapollo @YUX @likuku @geek123 @EchoUtopia @Jblue 最后我放弃用多线程| ...

  6. python断点续传下载_Python 3 爬虫|第12章:并发下载大文件 支持断点续传

    1. stream 流式下载大文件 1.1 stream=True 和 iter_content() 我们将继续使用 Python 3 爬虫|第3章:同步阻塞下载 所搭建的测试环境,在 Nginx 默 ...

  7. python scrapy框架爬虫_Python Scrapy爬虫框架学习

    Scrapy 是用Python实现一个为爬取网站数据.提取结构性数据而编写的应用框架. 一.Scrapy框架简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数 ...

  8. python网络信息提取_python网络爬虫与信息提取I

    一.Requests库的安装 安装Requests非常简单,只需一行代码即可.首先以管理员身份运行cmd,输入如下代码: 1.pip的安装 其实一般安装的python其Script文件包下都会自带有p ...

  9. python网络爬虫_Python网络爬虫——爬取视频网站源视频!

    原标题:Python网络爬虫--爬取视频网站源视频! 学习前提 1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 ...

  10. python 百度百科 爬虫_python简单爬虫

    爬虫真是一件有意思的事儿啊,之前写过爬虫,用的是urllib2.BeautifulSoup实现简单爬虫,scrapy也有实现过.最近想更好的学习爬虫,那么就尽可能的做记录吧.这篇博客就我今天的一个学习 ...

最新文章

  1. 爱因斯坦谜题解答(三种算法比较)
  2. kali linux wps 2019 删除_一分钟,轻松上手 Linux 安装QQ,让你简单开启聊天办公新环境...
  3. Uva 11572 唯一的雪花
  4. Git如何修改文件夹看不清的蓝色显示
  5. jsp 中包含 一个路径为变量的文件
  6. Python 爬虫 实例项目 大全
  7. excel上传java_java:Excel操作之Excel上传
  8. Poj 1503 Integer Inquiry
  9. 10、Cocos2dx 3.0游戏开发找小三之容器篇:Vector、Map、Value
  10. 喜乐美容美发管理系统 v20070625 加强版 下载
  11. swift压缩图片的方法
  12. stm32定时器的ETR、CH1N、CH2N、CH3N
  13. 自动输入填写qq 旺旺密码
  14. excel链接隐藏工作表_自动隐藏Excel工作表
  15. Java学习----多态性
  16. cogs 997. [東方S2] 射命丸文
  17. 9招教你防止电脑辐射
  18. mongodb持久化
  19. 【LeetCode】1823. 找出游戏的获胜者 Find the Winner of the Circular Game
  20. 测量系统分析(MSA)在企业质量管理中的应用(转载)

热门文章

  1. 静态代理和动态代理的代码笔记
  2. WPF多线程更新UI的一个解决途径
  3. 七. 并发编程 (进程队列)
  4. 【小记】-007--前端SEO优化
  5. 用python进行wifi密码生成
  6. mysql字符集插入中文数据乱码问题
  7. 利用百度搜索结果爬取邮箱
  8. C++公有、私有、保护继承的关系
  9. 设计一个移动应用的本地缓存机制(转)
  10. [转]Linux启动界面切换:图形界面-字符界面