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

news2024/12/23 6:08:02

最近收到 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 here
    result = 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 BeautifulSoup


async def get(url):
    return requests.get(url)


async def get_html(url):
    print("准备抓取:", url)
    res = await get(url)
    return res.text


async 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 * 5
        end_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.coloradmin.cn/o/71994.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SessionJSPCookie

今日内容 会话技术。会话技术包括两个: CookieSession JSP的入门学习:JSP也是一种服务器的动态资源,servlet也是一种服务器的动态资源。 会话技术 会话:一次会话中包含多次请求和响应。一次会话就像是人与人的一次见面聊天&…

Maya多边形物体批量材质传递工具v1.0发布及教程

一、插件介绍: 在大量场景制作时,当前期模型和材质没有同时完成,而用白模进行场景搭建后,能否后期,快速根据相同模型结构,快速识别物体并批量赋材质吗?答案是现在可以了。下面介绍的就是解决此…

使用SBT构建和发布基于SpringBoot的Scala应用

SBT 是 Scala 生态圈里的经典构建工具,虽然很多人觉得 SBT 很复杂,还戏称其为 SB Tool,但其全称确是 Simple Build Tool。 实际上,很多产品(包括像 SBT 这样的工具和技术产品)只有一个打动用户的特性就够了…

面经攻略:详谈Redis常见数据类型

👉本篇速览 早在最开始学Redis的时候,我们就学到了这九种数据类型:String、Hash、List、Set、Zset、BitMap、HyperLogLog、GEO、Stream,但其实在学的时候并不了解它的底层是怎么存储这些数据,而不同的数据类型又有哪些…

深兰科技|党政干部科技学习权威读本《元宇宙与社会治理新范式》

近日,由中共中央党校出版社出版,深兰科技创始人、深兰科技科学院创始院长陈海波撰写的《元宇宙与社会治理新范式》一书正式发售。 该书与陈海波主编的《与领导干部谈AI——人工智能推动第四次工业革命》、《与领导干部谈量子科技》一同入选了中共中央党校…

Web3中文|微软:黑客通过Telegram侵害加密公司

微软最近调查了一次攻击,在该攻击中,被追踪为 DEV-0139 的威胁参与者通过加入加密货币交易平台的Telegram群来寻找目标用户。 10月19日,威胁参与者冒充加密资产管理公司的代表邀请目标用户到另一个Telegram群,在那里威胁参与者要…

osgEarth示例分析——osgearth_eci

前言 osgearth_eci示例,展示了J2000的天体坐标系和ECEF地固系的转换,绘制坐标系,以及读取卫星参数绘制卫星的功能。绘制卫星轨迹,添加差值效果和未添加差值的效果。 关于卫星两行根数的数据文件下载路径:CelesTrak: …

0基础怎么转行软件测试?

前言 0基础转行软件测试难吗?怎么学才能找到工作?这应该是所有新人都会面临的问题,所以我结合自己的经历,做了一些总结和学习方法,希望能对大家有所帮助。 我按照薪资的不同大致划分成3个档位: 月薪5-9k&…

高压直流输电(HVDC)的最优潮流(OPF)(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清…

ZIP压缩包的自动设置密码可以这样解除

WinRAR设置了自动添加密码,每次压缩完ZIP文件后,都会自带打开密码,打开压缩包里的文件都需要输入密码。如果后续不需要每个ZIP文件都带有密码,要如何去除这个设置呢? 首先,打开WinRAR压缩软件,点…

晶品特装在科创板上市:总市值约为48亿元,前三季度收入下滑12%

12月8日,北京晶品特装科技股份有限公司(下称“晶品特装”,SH:688084)在上海证券交易所科创板上市。本次上市,晶品特装的发行价格为60.98元/股,发行数量为1900万股,募资总额约为11.59亿元&#x…

IncepFormer:用于语义分割的高效inception transformer

前言 语义分割通常得益于全局上下文、精细定位信息、多尺度特征等。为了在这些方面改进基于Transformer的分割器,本文提出了一种简单而强大的语义分割架构——IncepFormer。IncepFormer介绍了一种新颖的金字塔结构Transformer编码器,它同时获取全局上下文…

中药中天然类固醇—艾美捷胆固醇肉豆蔻酸酯

艾美捷胆固醇肉豆蔻酸酯相关参数说明: CAS Registry No.: 1989-52-2 Formal Name: (3β)-cholest-5-en-3-ol 3-tetradecanoate Synonyms: Cholesterol Myristate, Cholesteryl Tetradecanoate, Myristic Acid cholesteryl ester, NSC 226867 MF: C41H72O2 FW: …

[附源码]Python计算机毕业设计Django预约挂号app

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

密码学-1-数字签名体制

密码学-1-数字签名体制密码学-2-RSA签名验签方案写在前面 1 数字签名 1.1 什么是数字签名 1.2 数字签名的作用 1.3 数字签名的特性 1.4 数字签名的算法 2 数字签名的原理 2.1 签名过程:创建数字签名 2.2 验证过程:验证数字签名 写在前面 …

Matlab|模拟电动汽车的充放电【充电顺序,波动发电,电池缓冲】

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清…

使用redis Zset根据score和时间从多个维度进行排序(Zset榜单多维度排序)

文章目录1. 分段bit位实现排序2. 除数实现排序(推荐)3. 基于分段bit为实现的redis排序工具类一般我们都会用redis的Zset这个数据结构来做排行榜 问题引入:使用zSet进行排序的时候一直有一个痛点,就是只能根据score进行排序&#x…

牛客算法刷题-BM6 判断链表中是否有环

描述 判断给定的链表中是否有环。如果有环则返回true,否则返回false。 数据范围:链表长度 0≤\leq≤ n ≤\leq≤ 10000,链表中任意节点的值满足 |val| ≤\leq≤ 100000。 要求:空间复杂度 O(1),时间复杂度 O(n)。 输…

思科模拟器 | 静态路由和默认路由的配置

静态路由与默认路由一、静态路由1、自定义IP地址2、基本配置与接线3、接口配置与指令描述4、静态路由配置【⭐】5、主机测试连接二、默认路由1、基本命令配置2、测试连接一、静态路由 1、自定义IP地址 以下是我自己分配的主机和个接口的IP地址、子网掩码以及默认网关&#xf…

SSL协议

目录 理论部分 实验部分 环境搭建 web1配置 配置负载均衡 web2配置 lb配置 实验目标:模拟颁发证书实现https访问,搭建负载均衡。 理论部分 1. SSL:安全套接字层 它是由Netscape公司于1994年创建,它旨在通过Web创建安全的Internet通信。 它是…