python爬虫-提高爬虫效率
httpx
1 | 比 requests 更强大 Python 库,让你的爬虫效率提高一倍 |
什么是协程?
1 | 简单来说,协程是一种基于线程之上,但又比线程更加轻量级的存在。对于系统内核来说,协程具有不可见的特性,所以这种由 程序员自己写程序来管理 的轻量级线程又常被称作 "用户空间线程" |
协程比多线程好在哪呢?
1 | 1. 线程的控制权在操作系统手中,而 协程的控制权完全掌握在用户自己手中,因此利用协程可以减少程序运行时的上下文切换,有效提高程序运行效率。 |
协程的适用 & 不适用场景
1 | 适用场景:协程适用于被阻塞的,且需要大量并发的场景。 |
初探异步 http 框架 httpx
1 | 至此我们对 "协程" 应该有了个大概的了解,但故事说到这里,相信有朋友还是满脸疑问:"协程" 对于接口测试有什么帮助呢?不要着急,答案就在下面。 |
什么是 httpx
1 | httpx 是一个几乎继承了所有 requests 的特性并且支持 "异步" http 请求的开源库。简单来说,可以认为 httpx 是强化版 requests。 |
安装
1 | httpx 的安装非常简单,在 Python 3.6 以上的环境执行 |
最佳实践
1 | 俗话说得好,效率决定成败。我分别使用了 httpx 异步 和 同步 的方式对批量 http 请求进行了耗时比较,来一起看看结果吧~ |
同步 http 请求
1 | import asyncio |
1 | 代码比较简单,可以看到在 sync_main 中则实现了同步 http 访问百度 200 次 |
1 | 可以看到在上面的输出中, 主线程没有进行切换(因为本来就是单线程啊喂!)请求按照顺序执行(因为是同步请求)。 |
异步 http请求
1 | import asyncio |
1 | 上述代码在 async_main 中用 async await 关键字实现了"异步" http,通过 asyncio ( 异步 io 库请求百度首页 200 次并打印出了耗时 |
1 | async_main: <_MainThread(MainThread, started 4471512512)>: 56: 200 |
1 | 可以看到顺序虽然是乱的(56,99,67...) (这是因为程序在协程间不停切换) 但是主线程并没有切换 (协程本质还是单线程 ) |
1 | 程序共耗时 4.5 秒 |
多线程和多进程(不建议使用)
线程池或进程池(适当使用)
1 | import re |
单线程+异步协程(爬虫推荐使用)
单线程
1 | import time |
进程池或线程池
1 | import time |
协程
协程相关的概念
1 | - event_loop:事件循环,相当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足某些条件的时候,函数就会被循环执行。程序是按照设定的顺序从头执行到尾,运行的次数也是完全按照设定。当在编写异步程序时,必然其中有部分程序的运行耗时是比较久的,需要先让出当前程序的控制权,让其在背后运行,让另一部分的程序先运行起来。当背后运行的程序完成后,也需要及时通知主程序已经完成任务可以进行下一步操作,但这个过程所需的时间是不确定的,需要主程序不断的监听状态,一旦收到了任务完成的消息,就开始进行下一步。loop就是这个持续不断的监视器。 |
创建一个协程对象
1 | 创建一个协程对象,只需要在函数名前加上一个async关键字即可 |
基本使用
1 | import time |
task的使用
1 | import time |
future的使用
1 | import time |
回调函数
1 | import time |
回调函数(真正发送请求)
1 | import time |
多任务异步协程
多任务异步协程的基本使用
1 | import time |
多任务异步协程(解决方案)
1 | import time |
将多任务异步协程应用到爬虫中
1 | import time |
将多任务异步协程应用到爬虫中(解决方案)
1 | import time |
如何实现数据解析(任务的绑定回调机制)
1 | import time |
参考文献
1 | https://www.cnblogs.com/youhongliang/p/12177380.html |
你给世界什么姿态,世界将还你什么样的人生。