python异步爬虫_Python异步爬虫试验[Celery,gevent,requests]
以往爬虫都是用自己写的一个爬虫框架,一群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]相关推荐
- python多线程异步爬虫-Python异步爬虫试验[Celery,gevent,requests]
以往爬虫都是用自己写的一个爬虫框架,一群Workers去Master那领取任务后开始爬.进程数量等于处理器核心数,通过增开线程数提高爬取速度. 最近看了Celery,接口真是优美,挺想试验下异步模型来 ...
- python执行cmd命令行异步执行_Python 异步调用命令行工具
当你在自己的 Python 程序中采用了基于事件循环的异步编程方法之后,你就会发现自己不自觉地被其牢牢吸引住,并不是说这一方法多么棒,而是因为你不得不想办法保证程序中的任意环节都不能是阻塞的! 例如当 ...
- python2异步编程_python异步编程入门
这几天看代码,总是会接触到很多异步编程,之前只想着实现功能,从来没考虑过代码的运行快慢问题,故学习一番. 从0到1,了解python异步编程的演进 1.urllib与requests爬虫 reques ...
- python2异步编程_python异步编程 (转载)
转自:https://zhuanlan.zhihu.com/p/27258289 本文将会讲述Python 3.5之后出现的async/await的使用方法,以及它们的一些使用目的,如果错误,欢迎指正 ...
- python3多线程异步爬虫_python 多线程爬虫问题
practicer 2016-06-14 12:42:08 +08:00 @alexapollo @YUX @likuku @geek123 @EchoUtopia @Jblue 最后我放弃用多线程| ...
- python断点续传下载_Python 3 爬虫|第12章:并发下载大文件 支持断点续传
1. stream 流式下载大文件 1.1 stream=True 和 iter_content() 我们将继续使用 Python 3 爬虫|第3章:同步阻塞下载 所搭建的测试环境,在 Nginx 默 ...
- python scrapy框架爬虫_Python Scrapy爬虫框架学习
Scrapy 是用Python实现一个为爬取网站数据.提取结构性数据而编写的应用框架. 一.Scrapy框架简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数 ...
- python网络信息提取_python网络爬虫与信息提取I
一.Requests库的安装 安装Requests非常简单,只需一行代码即可.首先以管理员身份运行cmd,输入如下代码: 1.pip的安装 其实一般安装的python其Script文件包下都会自带有p ...
- python网络爬虫_Python网络爬虫——爬取视频网站源视频!
原标题:Python网络爬虫--爬取视频网站源视频! 学习前提 1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 ...
- python 百度百科 爬虫_python简单爬虫
爬虫真是一件有意思的事儿啊,之前写过爬虫,用的是urllib2.BeautifulSoup实现简单爬虫,scrapy也有实现过.最近想更好的学习爬虫,那么就尽可能的做记录吧.这篇博客就我今天的一个学习 ...
最新文章
- 爱因斯坦谜题解答(三种算法比较)
- kali linux wps 2019 删除_一分钟,轻松上手 Linux 安装QQ,让你简单开启聊天办公新环境...
- Uva 11572 唯一的雪花
- Git如何修改文件夹看不清的蓝色显示
- jsp 中包含 一个路径为变量的文件
- Python 爬虫 实例项目 大全
- excel上传java_java:Excel操作之Excel上传
- Poj 1503 Integer Inquiry
- 10、Cocos2dx 3.0游戏开发找小三之容器篇:Vector、Map、Value
- 喜乐美容美发管理系统 v20070625 加强版 下载
- swift压缩图片的方法
- stm32定时器的ETR、CH1N、CH2N、CH3N
- 自动输入填写qq 旺旺密码
- excel链接隐藏工作表_自动隐藏Excel工作表
- Java学习----多态性
- cogs 997. [東方S2] 射命丸文
- 9招教你防止电脑辐射
- mongodb持久化
- 【LeetCode】1823. 找出游戏的获胜者 Find the Winner of the Circular Game
- 测量系统分析(MSA)在企业质量管理中的应用(转载)