加速爬虫:异步加载asyncio
之前就一直想学习asyncio,然后就去网上查,发现讲的花里胡哨而且异常难懂,就放弃了一段时间,今天来重新学习一下,发现了一个大佬的文章,根据例子来理解就容易多了,文章最后放上大佬的连接。
传统的单线程下载处理网页可能就像下图(来源)左边蓝色那样, 计算机执行一些代码, 然后等待下载网页, 下好以后, 再执行一些代码… 或者在等待的时候, 用另外一个线程执行其他的代码, 这是多线程的手段. 那么 asyncio 就像右边, 只使用一个线程, 但是将这些等待时间统统掐掉, 下载应该都调到了后台, 这个时间里, 执行其他异步的功能, 下载好了之后, 再调回来接着往下执行.
如果换一张 Python 自家解释 asyncio 的图(来源), 虽然稍微复杂一点, 但是就是和上图想要表达的是一个意思.
Asyncio 库 ¶
Asyncio 库是 Python 的原装库, 但是是在 Python 3 的时候提出来的, Python 2 和 Python 3.3- 是没有的. 而且 Python 3.5 之后, 和 Python 3.4 前在语法上还是有些不同, 比如 “await” 和 “yield” 的使用, 下面的教程都是基于 Python 3.5+, 使用 Python3.4 的可能会执行有点问题. 调整一下就好.
在 3.5+ 版本中, asyncio 有两样语法非常重要, async
, await
. 弄懂了它们是如何协同工作的, 我们就完全能发挥出这个库的功能了. 剧透一下, 等会使用单线程爬网页的 asyncio 和之前多进程写的爬网页效果差不多, 而且当并行的进程数少的时候, asyncio 效果还会比多进程快.
基本用
对比:
(1) 普通操作
import timedef job(t):print("开始工作",t)time.sleep(t)print("任务",t,'花费',t,'s')
def main():[job(t) for t in range(1,3)]
t1 = time.time()
main()
print("没有异步加载花费的时间:",time.time()-t1)
这个花费时间就是3秒了
(2)使用异步
import asyncio
import time
async def job(t):print("开始工作",t)await asyncio.sleep(t)print("任务",t,'花费',t,'s')
async def main(loop):tasks = [loop.create_task(job(t)) for t in range(1,3)]await asyncio.wait(tasks)
t1=time.time()
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))
loop.close()
print("异步总共花费",time.time()-t1)
花费的时间只有2s,只是因为异步操作的时候在任务一执行等待时间的的时候直接进行第二个任务了,所有总共花费了2s,也就是任务执行时间最长的时间
实际操作爬虫:
在爬虫的过程中使用的是aiohttp的异步请求包,
import asyncio
import aiohttp
import time
async def get_html(sess,url):html = await sess.get(url)r = await html.text()return rasync def main(loop):num = 1async with aiohttp.ClientSession() as sess:tasks=[]for i in range(1,3):url = 'http://lab.scrapyd.cn/page/{url}/'url = url.format(url=str(i))tasks.append(loop.create_task(get_html(sess,url)))finished,unfinised = await asyncio.wait(tasks)num=0for i in finished:with open(str(num)+".txt",'w') as f:f.write(i.result())num+=1
if __name__ == '__main__':t1 = time.time()loop = asyncio.get_event_loop()loop.run_until_complete(main(loop))print("花费时间",time.time()-t1)
本篇博客是基于莫烦大佬的文章 https://morvanzhou.github.io/tutorials/data-manipulation/scraping/4-02-asyncio/
加速爬虫:异步加载asyncio相关推荐
- 网页加速系列(七)、 网页加速之异步加载
本文可参加原文(英文) Asynchrony: Loved Your Performance http://msdn.microsoft.com/library/default.asp?url=/li ...
- js如何将数据放在一个内置窗口里面_Java 爬虫遇上数据异步加载,试试这两种办法!...
这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...
- java 爬虫 异步_Java 爬虫遇上数据异步加载,试试这两种办法!
这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...
- JAVA异步爬虫_Java 爬虫遇上数据异步加载,试试这两种办法!
这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...
- 从入门到入土:Python爬虫学习|实例练手|详细讲解|爬取腾讯招聘网|一步一步分析|异步加载|初级难度反扒处理|寻找消失的API来找工作吧
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...
- Python爬虫 解决异步加载问题--以爬取PEXELS图片为例
第一次尝试爬取->[Python爬虫]爬虫实例:三种方式爬取PEXELS图片 在爬取PEXELS时,遇到了这样问题: 页面使用Ajax的异步加载技术来实现分页,所以通过request.text无 ...
- Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3)
Python爬虫获取异步加载站点pexels并下载图片(Python爬虫实战3) 1. 异步加载爬虫 对于静态页面爬虫很容易获取到站点的数据内容,然而静态页面需要全量加载站点的所有数据,对于网站的访问 ...
- SpiderMan:异步加载,图片爬取,数据库存储,多进程爬虫,IP代理
1,使用API 1.1,API使用方法 API是通过Requests请求和服务端的Response回应来完成API的一次调用,所以用Python语言进行API的调用时,便可以使用Requests库来进 ...
- php 滑块 爬虫_phpspider爬虫框架如何爬取异步加载的数据?
我找到些资料希望对楼主有所帮助 什么是异步加载? 向网站进行一次请求,一次只传部分数据.如:有些网页不需要点击下一页,其内容也可以源源不断地加载. 如何发现异步加载? 1.打开浏览器,右键选择&quo ...
- 爬虫案例:ajax异步加载,爬取豆瓣电影排行榜
from urllib.request import Request,urlopen from fake_useragent import UserAgent #导入相应的库 base_url ='h ...
最新文章
- C#操作Excel导入导出
- 通过源代码研究ASP.NET MVC中的Controller和View(二)
- 推荐10个毕业3年,月入5万技术大神的公众号!
- win7删除桌面文件需要刷新才会消失(2种解决方法)
- 《AngularJS深度剖析与最佳实践》一2.2 模块
- 基于tensorflow框架的神经网络结构处理mnist数据集
- Application log save debug - how log data is persisted to database table
- C++string容器-字符存取
- charles抓取手机APP,配置正确却抓不到数据
- MySQL什么是关系_MySQL教程-关系模型
- linux 进程崩溃 wait,Linux信号机制有关问题
- Python实例:通过字典某个关键字排序
- numpy tricks(一)—— 多维数组的阈值化处理
- Fisker大师用ZBrush制作兽人萨尔全过程
- (FPGA学习)环境及入门-------基于黑金FPGA cyclone IV EP4CE15F17开发板
- mysql uroot pg t_【原创】MySQL和PostgreSQL 导入数据对比
- 5分钟学会图片优化 之 七伤拳
- java求多项式回归_通过LINEST进行多项式回归(Polynomial Regression via LINEST)
- 浅谈微信营销的价值与优势
- 线性代数笔记6——直线和曲线的参数方程