【爬虫5年保更新专栏】异步协程典型案例,一篇掌握~

news/2024/5/13 23:14:37/文章来源:https://blog.csdn.net/hihell/article/details/128220526

最近收到 C 友反馈,说 《听说过 python 协程没?听说过 asyncio 库没?都在这一篇博客了》 这篇博客的目标图片站,已经不能使用了,橡皮擦查阅之后,发现是对方网站已经不运营了,所以更新一下案例。
感谢 C 友【彬】

如果你在订阅之后,发现其它站点出现类似情况,一定第一时间联系橡皮擦,每个爬虫都 质保 5 年
版权声明:本案例涉及所有内容仅供学习使用,请勿用于商业目的,如有侵权,请及时联系。

⚡⚡ 学习注意事项 ⚡⚡

  1. 文章会自动省略 http 和 https 协议,学习时请自行在地址中进行补充。
  2. 目标站点域名为 huanghelou.cc,在下文统一用 橡皮擦 代替,学习时请自行拼接。

文章目录

    • ⛳️ asynico 复盘简介
    • ⛳️ 原案例分析
    • ⛳️ 实战编码

⛳️ asynico 复盘简介

原博客主要讲解的是异步 I/O 库 asynico,知识点可以继续通过原文学习,本篇博客对原文案例进行更新。

再补充一下 asynico 的简介
asynico 是一个 Python 库,它可以帮助用户使用 async/await 语法来编写非阻塞代码。async/await 语法是一种用于处理异步操作的新方法,它使得编写异步代码更加简单和直观。使用 asynico,用户可以在不改变现有代码结构的情况下将同步代码转换为异步代码,从而提高代码的效率和性能。

基本语法
async/await 语法是 Python 3.5 中引入的新特性。它用于在异步编程中处理异步操作。下面是一个基本的 async/await 示例:

async def do_something():# Do some async operation hereresult = await something()return result

上面的示例中,do_something 是一个异步函数,它包含一个异步操作 something()。在这个例子中,something() 可能是一个异步 I/O 操作,例如读取文件或者发送 HTTP 请求。

do_something 函数中,我们使用 await 关键字来等待 something() 函数的执行结果。await 关键字会暂停当前函数的执行,等待 something() 函数的执行结果返回。

something() 函数返回结果后,await关键字会恢复 do_something 函数的执行,并将 something() 的执行结果赋值给 result 变量。最后,do_something 函数会返回 result 的值。

这就是 async/await 语法的基本用法。通过使用 async/await,我们可以编写更加简洁和优雅的异步代码,提高代码的可读性和可维护性。

了基本的使用方法,还有一些需要注意的点。

首先,如果要在 Python 程序中使用 async/await,需要确保运行环境支持 Python 3.5 或更高版本。async/await 语法在 Python 3.5 中才引入,如果运行环境版本低于 3.5,就无法使用 async/await。

其次,使用 async/await 时,需要注意代码的执行顺序。因为 async/await 会暂停函数的执行,等待异步操作的结果,所以在写 async/await 代码时需要注意函数的执行顺序。

例如,下面是一个异步函数的例子:

async def do_something():result = await something()print(result)async def main():await do_something()main()

在上面的例子中,do_something 函数包含一个异步操作 something(),并在操作结束后打印结果。main 函数则调用 do_something 函数,并等待它的执行结果。

在这个例子中,由于 do_something 函数中包含一个异步操作,所以它会暂停执行,等待 something() 的执行结果。如果我们没有使用 await 关键字,那么 main 函数会继续执行,而不会等待 do_something 函数的结果。

所以,在使用 async/await 时,需要注意代码的执行顺序。

⛳️ 原案例分析

首先对原文代码进行整理分析,使用的模块如下:

  • threading:多线程模块;
  • asyncio:异步 I/O 模块;
  • time:时间模块;
  • requests:请求包;
  • lxmlbs4:解析模块。

主函数部分代码说明如下图所示。

在这里插入图片描述
其中最主要的就是 main() 函数,其完成异步逻辑,原文代码及说明如下所示。

在这里插入图片描述

main() 函数内部实现了任务调度,其中调用了 2 个异步函数 get_html()save_img(),这两个函数就是普通的采集函数,无学习难度,具体如下所示。

在这里插入图片描述
接下来,我们完成修复代码环节。

⛳️ 实战编码

基于黄鹤楼的代码修改如下。

import threading
import asyncio
import time
import requests
import lxml
from bs4 import BeautifulSoupasync def get(url):return requests.get(url)async def get_html(url):print("准备抓取:", url)res = await get(url)return res.textasync def save_img(img_url):print("图片下载中:", img_url)res = await get(img_url)if res is not None:with open(f'./imgs/{time.time()}.jpg', 'wb') as f:f.write(res.content)return img_url,"ok"async def main(url_list):# 创建 5 个任务tasks = [asyncio.ensure_future(get_html(url_list[_])) for _ in range(len(url_list))]dones, pending = await asyncio.wait(tasks)for task in dones:html = task.result()soup = BeautifulSoup(html, 'lxml')div_tag = soup.find(attrs={'class': 'lbox'})imgs = div_tag.find_all('img')for img in imgs:ret = await save_img(img["data-original"])print(ret)if __name__ == '__main__':# 修改为黄鹤楼,测试方便,仅使用10页urls = [f"https://www.huanghelou.cc/category-44_{page}.html" for page in range(1, 10)]totle_page = len(urls) // 5 if len(urls) % 5 == 0 else len(urls) // 5 + 1# 对 urls 列表进行切片,方便采集for page in range(0, totle_page):start_page = 0 if page == 0 else page * 5end_page = (page + 1) * 5# 循环事件对象loop = asyncio.get_event_loop()loop.run_until_complete(main(urls[start_page:end_page]))

简单操作即可获得大量图片。

在这里插入图片描述

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 790 篇原创博客

从订购之日起,案例 5 年内保证更新

  • ⭐️ Python 爬虫 120,点击订购 ⭐️
  • ⭐️ 爬虫 100 例教程,点击订购 ⭐️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_232516.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

寻找适配网红很迷茫?最全秘笈来了

根据《2022年全球数字概览》报告显示,全球社交媒体用户超过46.2亿,相当于全球总人口的58.4%。全球用户每天在社交媒体上平均花费近2.5个小时,并且每天以2分钟的速度增长。 社交媒体成为全球网民生活中不可或缺的一部分,而对于跨境…

2022全年度冰箱十大热门品牌销量榜单

自2022年年初以来,各地纷纷部署支持包括冰箱在内的家电大宗消费政策措施,其中家电补贴政策是刺激家电消费的主旋律。宏观经济政策环境改善,利好冰箱行业的长期发展。 根据鲸参谋数据统计,今年京东平台冰箱的年度累计销量达到1400多…

有趣且重要的css知识合集(6)动态控制css伪元素【var()】

在vue里,js和css的属性可以随意控制,比如:class和:style,但是我们想要动态控制伪元素的属性该怎么做呢? 比如下图,右下角小圆圈就是通过伪元素定义上去的,那我们想要自由实现伪元素的显示和隐藏该怎么做呢…

研究一段WPF 3D 机械臂代码

网上下一段代码&#xff0c;运行如下&#xff1b;显示了一个3D机械臂&#xff1b; xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"&#xff0c;这是WPF命名空间&#xff0c;一般写在xaml头部&#xff0c;它的是这样的&#xff0c;<Viewport3D…

浅学Linux内核MMU

1 MMU基本知识 1.1 什么是MMU MMU是 MemoryManagementUnit 的缩写即&#xff0c;内存管理单元. 针对各种CPU, MMU是个可选的配件. MMU负责的是虚拟地址与物理地址的转换. 提供硬件机制的内存访问授权.&#xff08;现代 CPU 的应用中&#xff0c;基本上都选择了使用 MMU&#…

Kafka 为什么那么快?

有人说&#xff1a;他曾在一台配置较好的机子上对 Kafka 进行性能压测&#xff0c;压测结果是 Kafka 单个节点的极限处理能力接近每秒 2000万 条消息&#xff0c;吞吐量达到每秒 600MB。 那 Kafka 为什么这么快&#xff1f;如何做到这个高的性能&#xff1f; 本篇文章主要从这…

面试官:MySQL 中 varchar(n) 中 n 最大取值为多少?

前置知识 要回答这个问题&#xff0c;首先我们得先知道 MySQL 存储一条记录的格式长什么样子。 以 Compact 行格式作为例子&#xff0c;它长这样&#xff1a; 可以看到&#xff0c;一条完整的记录分为「记录的额外信息」和「记录的真实数据」两个部分。 这里重点讲讲记录的…

安卓APP源码和设计报告——健身系统

一、设计背景 1.需求分析 对于很多人来说拥有一副好身材能让自己增添不少魅力;对于爱吃而又担心自己发胖的人来说适当的运动健身是最好的选择。移动互联网时代&#xff0c;市场上“约跑”“约健身”健身APP软件成为新时代闺蜜朋友的互动模式&#xff0c;健身热潮的来临&#…

MySQL分区详解

目录 一、定义 1.1 概述 1.2 分区的优势 二、分区的类型 2.1 检查MySQL是否支持分区 2.2 类型 2.3 分区的其他操作 一、定义 1.1 概述 数据库分区是一种物理数据库设计技术。虽然分区技术可以实现很多效果&#xff0c;但其主要目的是为了在特定的SQL操作中减少数据读写…

第17章 事件和概率空间

第17章 事件和概率空间 17.1 做个交易吧 假设你有三扇门可供选择。其中一扇门背后是一辆汽车&#xff0c;另外两扇门背后是一只山羊。你选择了一扇门&#xff0c;比如1号门。然后知道门后面有什么的主持人&#xff0c;开启了另一扇后面有山羊的门&#xff0c;假设是3号门。现…

The reference to entity “useSSL“ must end with the ‘;‘ delimiter.

The reference to entity "useSSL" must end with the ; delimiter.& 替换为 &amp; < 替换为 < > 替换为 > " 替换为 &quot;替换为 &apos; jdbc:mysql://127.0.0.1:3306/dbname?characterEncodingutf8&amp;useSSLfalse&am…

Redis vs MongoDB

Redis vs MongoDB 通常情况下&#xff0c;应用系统的技术选型&#xff0c;对于如何选择非关系型数据库&#xff0c;是一个不小的挑战。这不仅考验架构师在技术上的广度和深度&#xff0c;同时也考究对业务细节了解和熟悉程度。只有将业务场景、业务特点、数据特征跟具体的技术…

Qt 多线程之QtConcurrent::map(处理序列容器)

QtConcurrent::map()、QtConcurrent::mapped() 和 QtConcurrent::mappedReduced() 函数对一个序列中&#xff08;例如&#xff1a;QList、QVector&#xff09;的项目并行地进行计算。 1、map函数 map函数的功能是在其他线程运行指定的函数&#xff0c;map函数有两个参数 第一…

玩好.NET高级调试,你也要会写点汇编

一&#xff1a;背景 1. 简介 .NET 高级调试要想玩的好&#xff0c;看懂汇编是基本功&#xff0c;但看懂汇编和能写点汇编又完全是两回事&#xff0c;所以有时候看的多&#xff0c;总手痒痒想写一点&#xff0c;在 Windows 平台上搭建汇编环境不是那么容易&#xff0c;大多还是…

web课程设计:HTML非遗文化网页设计题材【京剧文化】HTML+CSS+JavaScript

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

提高技术质量标准 | Google Play 持续打造优质平台

作者 / Google Play 统筹产品经理 Lauren Mytton在上一篇文章中&#xff0c;我们为大家总结了 Google Play 在近期将要推出多项新功能&#xff0c;接下来我们将会陆续展开逐一详细说明。应用质量是我们在 Google Play 所做一切努力的基础。Android 用户希望从他们下载的应用和游…

kubernetes 1.18 部署 ingress-nginx

文章目录kubernetes 1.18 部署 ingress-nginx1. 下载 yaml 文件2. 安装 ingress-nginx3. 检查安装情况4. 测试验证4.1 查看ingress规则4.2 访问测试5. 其他内容kubernetes 1.18 部署 ingress-nginx 1. 下载 yaml 文件 在 GitHub 下载完成之后可以直接使用&#xff0c;不需要修…

Linux 部署主从DNS服务器

几个概念&#xff1a; 域名解析为IP地址&#xff1a;正向解析 IP地址解析为域名&#xff1a;反向解析 主DNS服务器&#xff1a;在特定区域内具有唯一性&#xff0c;负责维护该区域内的域名和IP地址之间的对应关系。 从DNS服务器&#xff1a;从服务器中获得域名和IP地址对应关系…

Android桌面图标快捷方式

一、背景 长按桌面图标实现快捷方式最早是iOS提供的功能,而Android最早在Android 7.1版本也提供了对这方面的支持,于是在短时间内,像微信,支付宝,头条等流量级应用都提供了这方面的支持,如下图。 现在,长按桌面图标快捷方式已经是很成熟的功能,实现上也比较简单,主…

爆火的OpenAi的ChatGPT聊天机器人注册和使用攻略

先来看看他的效果怎木样: 哇塞!是不是很奈斯!!! 一. 对OpenAi进行注册登录(需要翻墙) OpenAI APIAn API for accessing new AI models developed by OpenAIhttps://beta.openai.com/ 二. 购买一个虚拟号码用于手机号注册 nullReceive sms online on virtual numbers of SMS…