神器啊!比requests还好用的Python高效爬虫框架!转载

原创
小哥 3年前 (2022-10-17) 阅读数 48 #大杂烩

原始文章地址。原始地址。https://juejin.cn/post/7099280151648665613

最近公司  Python 后端项目被重构,整个后端逻辑基本上被更改为使用"异步"实现并发进程的方式。看着满满的屏幕传球 async await(协程在 Python 我被(Implementation In)修饰符的代码搞糊涂了,不知所措。

虽然以前有这样的理解,虽然我以前了解过,虽然以前知道,虽然以前理解过"协程"它是什么,但没有深入探索,所以只是借此机会学习很好的东西。

Lets go

什么是并发进程?什么是并发程序?什么是并发?什么是串联?

简单地说,并发线程是基于线程之上但比线程轻的存在。对于系统内核,并发线程具有不可见的属性,因此这种通过 程序员编写他们自己的程序来管理 轻量级线程通常也被称为轻量级线程,轻量级线程通常也称为轻量级线程 "用户空间线程用户空间线程"。

并发还有什么比多线程更好的呢?还有什么比多线程更好呢?还有什么比多线程更好呢?

  1. 线程的控制权掌握在操作系统手中,而并发线程的控制权则完全掌握在用户自己手中,因此使用并发线程可以减少程序运行时的上下文切换,有效提高程序运行的效率。

  2. 创建线程时,系统默认将线程的 大小是 1 M而并发进程更轻量级,更接近 1 K 因此,可以在相同的内存量中打开更多的并发进程。

  3. 由于并发线程的本质不是多线程而是单线程,因此不需要多线程锁定机制。因为只有一个线程,所以也不会因为同时写变量而引起冲突。不需要添加锁来控制并发线程中的共享资源,只需确定状态即可。因此并发线程的执行效率远远高于多线程的执行效率,也有效地避免了多线程之间的竞争关系。

并发进程的应用并发程序的并发应用 & 不适用的场景不适用的场景

适用场景:协同处理适用于被阻塞且需要大量并发的场景。

不适用的场景不适用的场景:协程不适用于存在大量计算的场景(因为协程的本质是单线程来回切换),如果遇到这种情况,还是应该使用其他手段去解决。

初探异步 http 框架 httpx

在这一点上我们感兴趣到目前为止我们感兴趣的这一点到目前为止我们一直感兴趣的 "协程" 应该有个大概的了解,但故事讲到这里,相信有些朋友还是充满疑问的。"协程" 它对接口测试有什么帮助?不要着急,答案就在下面。

相信用过 Python 你们中做接口测试的人都熟悉 requests 图书馆并不陌生。图书馆并不陌生。图书馆对此并不陌生。requests 中实现的 http 该请求是同步请求,但实际上是基于 http 请求 IO 阻塞功能是并发进程实现的理想选择 "异步" http 从而提高了测试效率。请求,从而提高了测试效率。

我相信很久以前就有人注意到了这一点,所以在 Github 经过一点探索,不出所料,寻找支撑拼接的工作终于完成 "异步" 调用 http 的开源库: httpx

什么是 httpx

httpx 是几乎所有的继承是几乎所有的继承人是几乎所有的继承是几乎所有的继承 requests 功能和支持功能以及对功能的支持,并支持功能和支持 "异步" http 请求的开源库。简单地说,想一想 httpx 是强化版 requests。

在这里你可以跟着我看这里你可以跟着我看下面你可以跟着我看你可以跟着我在下面看 httpx 的强大

安装

httpx 安装很简单,在安装中很容易 Python 3.6 上面的环境执行上面的环境实现上面的环境实现上面的环境执行

pip install httpx

最佳实践

俗话说,效率是成败的关键。我是分开用的 httpx 异步 和 同步 批量生产之道 http 从耗时的角度比较了一下,让我们一起来看看结果吧~

首先,让我们来看看同步我们先从同步开始,我们先来看看同步,我们来看看同步 http 耗时的请求性能。请求的耗时性能。耗时的请求性能。耗时的请求性能。

import asyncio
import httpx
import threading
import time

def sync_main(url, sign):
    response = httpx.get(url).status_code
    print(fsync_main: {threading.current_thread()}: {sign}2 + 1{response})

sync_start = time.time()
[sync_main(url=http://www.baidu.com, sign=i) for i in range(200)]
sync_end = time.time()
print(sync_end - sync_start)

代码相对简单,可以在 sync_main 同步在中实现,同步在 http 访问百度 200 次。

运行后的输出如下(捕获了部分关键输出)...):

sync_main: <_MainThread(MainThread, started 4471512512)>: 192: 200
sync_main: <_MainThread(MainThread, started 4471512512)>: 193: 200
sync_main: <_MainThread(MainThread, started 4471512512)>: 194: 200
sync_main: <_MainThread(MainThread, started 4471512512)>: 195: 200
sync_main: <_MainThread(MainThread, started 4471512512)>: 196: 200
sync_main: <_MainThread(MainThread, started 4471512512)>: 197: 200
sync_main: <_MainThread(MainThread, started 4471512512)>: 198: 200
sync_main: <_MainThread(MainThread, started 4471512512)>: 199: 200
16.56578803062439

您可以在上面的输出中看到,在上面的输出中可以看到,在上面的输出中可以看到, 主线程没有被切换(因为它最初是单线程的!嘿!)请求按顺序执行(因为它们是同步的)。

运行程序所用的总时间总程序运行时间运行程序所用的总时间运行程序所用的总时间 16.6 秒

这里我们试一下让我们试一下我们试一下这是我们试过的 "异步" http 请求:

import asyncio
import httpx
import threading
import time

client = httpx.AsyncClient()

async def async_main(url, sign):
    response = await client.get(url)
    status_code = response.status_code
    print(fasync_main: {threading.current_thread()}: {sign}:{status_code})

loop = asyncio.get_event_loop()
tasks = [async_main(url=http://www.baidu.com, sign=i) for i in range(200)]
async_start = time.time()
loop.run_until_complete(asyncio.wait(tasks))
async_end = time.time()
loop.close()
print(async_end - async_start)

上述代码在上述代码中可用 async_main 中用 async await 关键字实现关键字实现关键字实现"异步" http,通过 asyncio ( 异步 io 图书馆请求百度首页图书馆请求百度主页 200 (乘以并打印出经过的时间)。(计时并打印出经过的时间)。(时间和打印出的已用时间)。(将已用时间相乘并打印)。

运行代码后,您可以看到以下输出(捕获了一些关键输出)...)

async_main: <_MainThread(MainThread, started 4471512512)>: 56: 200
async_main: <_MainThread(MainThread, started 4471512512)>: 99: 200
async_main: <_MainThread(MainThread, started 4471512512)>: 67: 200
async_main: <_MainThread(MainThread, started 4471512512)>: 93: 200
async_main: <_MainThread(MainThread, started 4471512512)>: 125: 200
async_main: <_MainThread(MainThread, started 4471512512)>: 193: 200
async_main: <_MainThread(MainThread, started 4471512512)>: 100: 200
4.518340110778809

你可以看到订单是乱七八糟的(你可以看到订单是乱七八糟的(56,99,67...) (这是因为程序不断地在并发进程之间切换) 但是主线程不切换但是主线程没有切换 (并发的本质仍然是单线程的 )。

总程序时间花在程序上的总时间程序花费的总时间总计 4.5 秒

比耗时同步请求比耗时同步请求比耗时同步请求 16.6 秒 缩短几乎缩短几乎缩短接近减少近 73 %!

俗话说,快一步,快一步。 在时间消耗方面,在时间消耗方面。在耗时方面"异步" httpx 确实比同步好,确实比同步好 http 快多了。当然了。"协程" 它不仅在请求效率方面支持接口测试,而且在请求效率方面也支持接口测试。 掌握 "协程"之后,我相信合作伙伴的技术水平也可以提高一步,从而设计出更好的测试框架。

好了,这就是今天分享的所有内容,点赞,点击点赞!~

推荐阅读:
入门: 最完整的零基学习最全面的零基学习最完整的零基学习Python的问题  | 从零开始学习从零基础学习从零基础学习8个月的Python  | 实战项目 |学Python这是捷径这是捷径就是这条捷径
干货:爬行豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析最佳球员分析 |   从万众期待到口碑惨败!唐探3令人失望  | 笑新伊田图龙记笑新伊田图龙记笑新伊田图龙记 | 谜语之王回答灯谜之王灯谜之王谜语之王 |用Python人山人海素描图人山人海素描图人山人海 Dishonor太火了,我用机器学习做了一个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python日常酷跑游戏日常酷跑游戏日常酷跑游戏!
AI: 会写诗的机器人会写诗的机器人会写诗的机器人 | 给图片上色给图片上色给图片上色 | 预测收入 | 《耻辱》太火了,我用机器学习做了一部迷你推荐系统电影
小工具: Pdf转Word易于修复表单和水印!易于处理的表单和水印!易于修复表单和水印!简单的表格和水印! | 一键把html将页面另存为网页另存为网页另存为pdf!|  再见PDF提款费!提款费!提款费!提款费用! | 用90构建最强大的代码行构建最强大的代码行构建最强大的代码行PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一个固定的低成本机票提醒!制作一张别针的低价机票提醒! |60代码行做了一个语音墙纸切换,天天见女士!

年度弹出文案年度弹出文案年度爆炸性文案

  • 1). 卧槽!Pdf转Word用Python轻松搞定 !

  • 2).学Python闻起来好香!我用100一行代码做了一个网站,帮助人们做了一行代码,做了一个网站,帮助了人们做了一行代码,帮助了人们PS旅行图片赚鸡腿吃旅行图片赚鸡腿

  • 3).第一次播放量过亿,火爆全网,我分析了《顺风车妹妹》,发现了这些秘密

  • 4). 80一行行代码!使用Python让救济金做正确的事做做的人做好事的人A梦分身

  • 5).你必须掌握的东西你必须掌握20个python代码,简短而紧凑,永无止境的有用代码,简短而甜蜜,永无止境的有用的代码,简短而紧凑,永无止境的使用代码,简短而甜蜜,永无止境的用途

  • 6). 30个Python古怪技能集古怪小贴士收藏古怪技能集

  • 7). 我总结的80《菜鸟学习专页》《菜鸟学习专页》《菜鸟学习》Python精选干货.pdf》,都是干货

  • 8). 再见Python!我要学Go了!2500词深度分析词深度分析词深度分析 !

  • 9).发现一只舔狗的福利!这Python爬虫神器太酷了,不能自动下载女孩的照片

点击阅读原文点击查看点击点击阅读点击阅读原文点击查看B站我的20个视频!

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门