文章目录

  • 前言
  • 协程
    • 协程快速上手
    • 协程异步运行
    • 工作流程
    • 任务管理
  • aiohttp
    • 异步保存
    • 异步回调

前言

爬虫是个好东西,最近要用用这玩意,所以顺便把以前的小东西给发出来,水几篇博客~

协程

首先明确一点,线程不是多线程,线程本质上还是单线程,但是这个线程的特点是当当前线程进入到IO状态的时候,CPU会自动切换任务从而提高系统的整体运行效率。没错这个协程其实就和操作系统的多道处理机制是一样的。实现的效果有点类似使用多线程,或者线程池,但是协程是更加轻量级的,本质上就是一个单线程在来回切换。

协程快速上手

那么接下来我们先来体会一下这个协程的功效。
在python里面使用协程,也就是异步,我们需要掌握两个关键字,await 和 async。当然还有一个支持协程的库,asyncio。
我们先来看看代码。

import asyncio
import time
# 协程函数
async def do_some_work(x):print('doing: ', x)await asyncio.sleep(2)return 'done {}'.format(x)# 协程对象
xs = [1,2,3]
# 将协程转成task,并组成list
tasks = []
start  = time.time()
for x in xs:c = do_some_work(x)tasks.append(asyncio.ensure_future(c))loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))print(time.time()-start

咋一看我们好像是实现了多线程,那好我把代码改一下。


看到没6秒,怎么会这样咧,如果是多线程显然必然是2秒。所以协程不是多线程,这是第一点

那好既然不是多线程,为啥刚刚是两秒呢。

协程异步运行

这个其实很简单,在此之前我们得先来说说一个方法

asyncio.sleep(2)
就是这个有什么特殊的嘛,有的,特殊点就是这个sleep相当于在进行io操作,所以明白我什么意思了不
这个sleep就是IO操作

我们这里开起来3个异步,所有的IO都交个了系统执行,所以最后我们只花了2秒。

工作流程

好了,我们现在已经体会了这个结果,那么我们是时候来说说why了。
首先第一个关键字 async 是声明这个方法,代码块是一个异步的玩意,相当于申明
await 是什么意思呢,这个就是我们为什么是两秒的“秘诀”了。这个玩意,当发现被它修饰的东西是个耗时的IO操作的时候,它就会告诉操作系统去执行IO操作,让CPU去切换其他的任务,在一个单线程程序里面,可以有多个任务。

任务管理

我们说了那两个关键字,那么问题来了,谁来告诉操作系统,谁来给我干活呢。这个时候就需要用到asyncio喽。

没错就是这部分代码。

当然协程的创建还有很多方法,只不过在爬虫里面这个用的比较多罢了,所以我这里只写这一个,事实上三个。(这个和java里面的furtertask有点类似)

aiohttp

现在到了咱们的异步爬取了,请求一,爬取资源是什么,这个其实就是一个IO操作嘛。所以我们就可以使用异步,不过这个时候,我们不能再用requests了。

得用这个,先下载

pip install aiohttp
import asyncio
import time
import aiohttp#随便访问三次bing主页吧
urls = ["https://cn.bing.com/?FORM=Z9FD1","https://cn.bing.com/?FORM=Z9FD1","https://cn.bing.com/?FORM=Z9FD1"]async def get_page(url):print("开始爬取网站", url)#异步块,在执行异步方法的时候加上await才能切换,不然就是串行咯async with aiohttp.ClientSession() as session:async with await session.get(url) as resp:page = await resp.text()print("爬取完成->",url)return pagetasks = []
start  = time.time()
for url in urls:c = get_page(url)tasks.append(asyncio.ensure_future(c))loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))print(time.time()-start)

那么这个aiohttp这个玩意呢,怎么说呢,里面有很多方法是和request类似的,例如刚刚的那个方法就是和requests.Session()是一样滴(高度相似)

异步保存

都说了这个了,自然还有aiofiles啦

import asyncio
import time
import aiohttp
import aiofiles
#随便访问三次bing主页吧
urls = ["https://cn.bing.com/?FORM=Z9FD1","https://cn.bing.com/?FORM=Z9FD1","https://cn.bing.com/?FORM=Z9FD1"]async def get_page(url):print("开始爬取网站", url)#异步块,在执行异步方法的时候加上await才能切换,不然就是串行咯async with aiohttp.ClientSession() as session:async with await session.get(url) as resp:page = await resp.text()print("爬取完成->",url)# async with aiofiles.open("a.html",'w',encoding='utf-8') as f:#     await f.write(page)#     await f.flush()#     await f.close()with open("a.html",'w',encoding='utf-8') as f:f.write(page)f.flush()f.close()return pagetasks = []
start  = time.time()
for url in urls:c = get_page(url)tasks.append(asyncio.ensure_future(c))loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))print(time.time()-start)

先说明一下这个不一定比直接写入文件块,而且有些第三方库并不支持!

异步回调

我们现在异步保存了文件,问题来了我想要直接拿到结果,然后解析呀。所以我们得来个异步回调。

import asyncio
import time
import aiohttp
import aiofiles
#随便访问三次bing主页吧
urls = ["https://cn.bing.com/?FORM=Z9FD1","https://cn.bing.com/?FORM=Z9FD1","https://cn.bing.com/?FORM=Z9FD1"]async def get_page(url):print("开始爬取网站", url)#异步块,在执行异步方法的时候加上await才能切换,不然就是串行咯async with aiohttp.ClientSession() as session:async with await session.get(url) as resp:page = await resp.text()print("爬取完成->",url)return pagedef parse(task):page = task.result() #得到返回结果print(len(page))tasks = []
start  = time.time()
for url in urls:c = get_page(url)task = asyncio.ensure_future(c)task.add_done_callback(parse)tasks.append(task)loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))print(time.time()-start)

好了这个就是异步的玩意,这里也是为啥我用的是 未来任务,因为可以拿到参数嘛,在java里面的话就是那个callabel呗。
接下来还有个神级工具 scapy 稍后更新(看情况吧,周五呢!)

Python小爬虫之协程爬虫快速上手相关推荐

  1. python从网址爬图片协程_Python爬虫多任务协程爬取虎牙MM图片

    查看: 4420|回复: 241 [作品展示] Python爬虫多任务协程爬取虎牙MM图片 电梯直达 发表于 2019-4-17 21:35:47 | 只看该作者 |倒序浏览 |阅读模式 马上注册,结 ...

  2. python获取get请求的耗时时间_突破python爬取极限,超牛逼的异步协程爬虫

    异步协程 1. event_loop 2. coroutine 中文翻译叫协程,在 Python 中昌指代为协程对象类型,可以将协程对象注册到时间循环中被调用.使用 async 关键字来定义的方法在调 ...

  3. python 异步协程爬虫-半次元图片

    python 异步协程爬虫-半次元图片 1. 页面分析 2.代码大体构思 3.源码分析 3.1 完成效果 4.异步协程的优势 5.难点分析 6.可扩展性 欢迎私信或评论区交流 爬取网址 : https ...

  4. python协程池爬虫_Python之协程爬虫 小说网协程爬虫案例

    在Gevent协程的使用中我们已经学会简单的使用协程,这篇文章我们通过协程爬虫来测试一下具体的效果.Gevent遇到IO阻塞时会自动切换任务: from gevent import monkey mo ...

  5. 小爬爬4.协程基本用法多任务异步协程爬虫示例(大数据量)

    1.测试学习 (2)单线程: from time import sleep import time def request(url):print('正在请求:',url)sleep(2)print(' ...

  6. python3异步协程爬虫,simpyder

    Simpyder - Simple Python Spider Simpyder - 轻量级协程Python爬虫 特点 轻量级:下载便利,依赖较少,使用简单. 协程:单线程,通过协程实现并发. 可定制 ...

  7. 超牛逼的异步协程爬虫

    写在前面: 本来这篇文章只是用来记录一下学习异步协程爬虫的笔记,感谢CSDN的大力支持,引来了很多关注和浏览,也有很多大佬的批评指针. 事先声明:本文只是学习使用,在爬虫的实战应用中还要添加诸多限制, ...

  8. 【python小课堂专栏】python小课堂31 - 初识原生爬虫

    python小课堂31 - 初识原生爬虫 前言 在上一期介绍了爬虫之前必会浏览器的开发者工具,忘记的童鞋可以在回顾一下: python小课堂30 - 爬虫之前必会的浏览器开发者工具. 本篇文章将以实战 ...

  9. python并发编程:协程asyncio、多线程threading、多进程multiprocessing

    python并发编程:协程.多线程.多进程 CPU密集型计算与IO密集型计算 多线程.多进程与协程的对比 多线程 创建多线程的方法 多线程实现的生产者-消费者爬虫 Lock解决线程安全问题 使用线程池 ...

最新文章

  1. 从Win8预览版的发布来选择最合适的虚拟机软件
  2. cocos2dx多线程以及线程同步 与 cocos2dx内存管理与多线程问题
  3. 宝塔php安装那个合_通过宝塔面板一键搭建wordpress博客
  4. 做移动应用使用地图API时需要注意的问题
  5. c# 两个数的加减乘除
  6. 有没有必要买python课_请问自学 Python 有必要买课程吗?
  7. 【Elasticsearch】Elasticsearch 索引 模板 template
  8. Codeforces Round #302 (Div. 2)
  9. [转载] python中断响应_用Python脚本监测.py脚本的进程状态,并实现中断重启。
  10. 如何评估语音质量好坏?
  11. 13个免费的开源GIS软件
  12. 全球顶尖!StarVR推出搭载集成眼动追踪的VR设备
  13. Linux命令大全(常用的命令解析)
  14. XCode7 iOS8.X Simulator 离线下载地址
  15. vs2015上的html可以编译,libcef编译使用--使用VS2015
  16. Delphi 人民币大小写转换
  17. miniconda的介绍和基本使用
  18. Oracle数据库服务器端和客服端的安装
  19. C语言学习之认识exit()函数
  20. html 导出excel 列被合并,前端实现导出excel单元格合并和调整样式

热门文章

  1. [算法入门笔记] 18. 动态规划
  2. 区间DP例题(持续更新)
  3. LaTex粗略的学习笔记(表格)
  4. RobotFrameWork Web自动化测试之测试环境搭建
  5. 电子厂计算机常用英语,电子厂常用英语
  6. 在本地计算机无法启动clipbook,依赖服务组无法启动 win7依赖服务或组无法启动 怎么弄啊...
  7. 如何自学3D游戏场景建模和设计?
  8. python随机森林库_随机森林算法入门(python)
  9. F1值(F-Measure)、准确率(Precision)、召回率(Recall) 菜鸡版理解
  10. SoX使用手册(中文版)