深入理解协程(四):async/await异步爬虫实战

本文目录:

  • 同步方式爬取博客标题
  • async/await异步爬取博客标题

本片为深入理解协程系列文章的补充

你将会在从本文中了解到:async/await如何运用的实际的爬虫中。

案例

从CSDN上批量爬取指定文章的标题。文章列表如下:

urls = [
    'https://blog.csdn.net/Jmilk/article/details/103218919',
    'https://blog.csdn.net/stven_king/article/details/103256724',
    'https://blog.csdn.net/csdnnews/article/details/103154693',
    'https://blog.csdn.net/dg_lee/article/details/103951021',
    'https://blog.csdn.net/m0_37907797/article/details/103272967',
    'https://blog.csdn.net/zzq900503/article/details/49618605',
    'https://blog.csdn.net/weixin_44339238/article/details/103977138',
    'https://blog.csdn.net/dengjin20104042056/article/details/103930275',
    'https://blog.csdn.net/Mind_programmonkey/article/details/103940511',
    'https://blog.csdn.net/xufive/article/details/102993570',
    'https://blog.csdn.net/weixin_41010294/article/details/104009722',
    'https://blog.csdn.net/yunqiinsight/article/details/103137022',
    'https://blog.csdn.net/qq_44210563/article/details/102826406',
]

同步爬虫

import requests
import time
from lxml import etree

urls = [
    'https://blog.csdn.net/Jmilk/article/details/103218919',
    'https://blog.csdn.net/stven_king/article/details/103256724',
    ...此处略
]

def get_title(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
    }
    r = requests.get(url, headers)
    html = r.content
    title = etree.HTML(html).xpath('//h1[@class="title-article"]/text()')[0]
    print(title)

def main():
    for url in urls:
        get_title(url)

if __name__ == '__main__':
    start = time.time()
    main()
    print(f'cost time: {time.time() - start}s')

输出结果如下:

4G LTE/EPC 协议栈
Android-Universal-Image-Loader源码分析
8年经验面试官详解 Java 面试秘诀
AES中ECB模式的加密与解密(Python3.7)
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
java进阶(四)------java编程规范---代码质量检测工具FindBugs、PMD和CheckStyle的安装
这是一份集合一线大厂Android工程师必备技能体系+学习路线!
【程序人生】程序员接私活常用平台汇总
你不得不了解的卷积神经网络发展史
致 Python 初学者
OOM别慌,手把手教你定位
中国数据库OceanBase登顶之路
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
cost time: 6.065227508544922s

用时:6.065227508544922s

async/await异步爬虫

要实现一个真正的异步爬虫,就需要引入aiohttp模块,aiohttp是一个利用asyncio的库,可以暂时看成协程版的requests

import asyncio
import time
import aiohttp
from lxml import etree

urls = [
    'https://blog.csdn.net/Jmilk/article/details/103218919',
    'https://blog.csdn.net/stven_king/article/details/103256724',
    ...此处略
]

async def async_get_url(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
    }
    async with aiohttp.ClientSession() as session:  # 解释1
        async with session.get(url, headers=headers) as r:
            html = await r.read()
            title = etree.HTML(html).xpath('//h1[@class="title-article"]/text()')[0]
            print(title)

def async_main():
    loop = asyncio.get_event_loop()
    tasks = [async_get_url(url) for url in urls]
    loop.run_until_complete(asyncio.wait(tasks))
    loop.close()

if __name__ == '__main__':
    start = time.time()
    async_main()
    print(f'cost time: {time.time() - start}s')

输出结果:

网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
【程序人生】程序员接私活常用平台汇总
致 Python 初学者
中国数据库OceanBase登顶之路
Android-Universal-Image-Loader源码分析
OOM别慌,手把手教你定位
这是一份集合一线大厂Android工程师必备技能体系+学习路线!
AES中ECB模式的加密与解密(Python3.7)
4G LTE/EPC 协议栈
【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?
8年经验面试官详解 Java 面试秘诀
java进阶(四)------java编程规范---代码质量检测工具FindBugs、PMD和CheckStyle的安装
你不得不了解的卷积神经网络发展史
cost time: 0.6428999900817871s

说明

解释1:此处为异步的上下文管理器,是aiohttp官方文档提供的写法。如果对上下文管理器不是很了解的话,可以参看【吃透Python上下文管理器】

用时:0.6428999900817871s。从两种爬虫的输出结果中可以看到:

  • 文章标题的顺序不同。同步爬虫会按照urls内部的url顺序依次爬取文章标题。而异步爬虫爬取的顺序并不完全和urls中的url顺序相同。
  • 爬取速度差异很大。异步爬虫速度大概是普通同步爬虫的8~10倍。异步爬虫充分利用了网络请求这段时间。从而提高了爬取效率。

关于aiohttp的更多用法。会在后面文章讲到。

推荐阅读

深入理解协程(一):协程的引入

深入理解协程(二):yield from实现异步协程

深入理解协程(三):async/await实现异步协程

Python进阶:上下文管理器

关注公众号西加加先生一起玩转Python

原文地址:https://www.cnblogs.com/ghostlee/p/12208564.html

时间: 2024-11-03 04:35:03

深入理解协程(四):async/await异步爬虫实战的相关文章

Python的异步编程[0] -> 协程[1] -> 使用协程建立自己的异步非阻塞模型

使用协程建立自己的异步非阻塞模型 接下来例子中,将使用纯粹的Python编码搭建一个异步模型,相当于自己构建的一个asyncio模块,这也许能对asyncio模块底层实现的理解有更大的帮助.主要参考为文末的链接,以及自己的补充理解. 完整代码 1 #!/usr/bin/python 2 # ============================================================= 3 # File Name: async_base.py 4 # Author: L

Python 中的进程、线程、协程、同步、异步、回调

进程和线程究竟是什么东西?传统网络服务模型是如何工作的?协程和线程的关系和区别有哪些?IO过程在什么时间发生? 在刚刚结束的 PyCon2014 上海站,来自七牛云存储的 Python 高级工程师许智翔带来了关于 Python 的分享<Python中的进程.线程.协程.同步.异步.回调>. 一.上下文切换技术 简述 在进一步之前,让我们先回顾一下各种上下文切换技术. 不过首先说明一点术语.当我们说"上下文"的时候,指的是程序在执行中的一个状态.通常我们会用调用栈来表示这个状

[C#] 开始接触 async/await 异步编程

开始接触 async/await 异步编程 序 之前已经整理了 4 篇关于 LINQ 的随笔,想换换口味. 目录 What's 异步? async/await 结构 What’s 异步方法? 一.What's 异步? 启动程序时,系统会在内存中创建一个新的进程.进程是构成运行程序资源的集合. 在进程内部,有称为线程的内核对象,它代表的是真正的执行程序.系统会在 Main 方法的第一行语句就开始线程的执行. 线程: (1)默认情况,一个进程只包含一个线程,从程序的开始到执行结束: (2)线程可以派

【WePY小程序框架实战四】-使用async&amp;await异步请求数据

[WePY小程序框架实战一]-创建项目 [WePY小程序框架实战二]-页面结构 [WePY小程序框架实战三]-组件传值 async await 是对promise的近一步优化,既解决了promise链式then的这种写法壁垒,又让异步请求更像同步,若对async await不太了解的同学可以直接参考阮一峰老师的文章async 函数的含义和用法,这里我们只关注怎么在小程序wepy架构中如何使用. 依赖库 import 'wepy-async-function' app.wpy中启用 export

深入理解协程

目录 深入理解python协程 概述 生成器变形 yield/send yield send yield from asyncio.coroutine和yield from async和await 深入理解python协程 概述 由于 cpu和 磁盘读写的 效率有很大的差距,往往cpu执行代码,然后遇到需要从磁盘中读写文件的操作,此时主线程会停止运行,等待IO操作完成后再继续进行,这要就导致cpu的利用率非常的低. 协程可以实现单线程同时执行多个任务,但是需要自己手动的通过send函数和yiel

Async await 异步编程说明

希望在编程上有些许提高所以 最近连续2篇博客都在说明多线程和异步编程的使用,异步和多线程之间区别请自行百度,因为理解不是特别透彻就不在叙述以免误导大家,这里写下新研究整理 task  和 await 的异步编程使用 调用子方法和耗时方法如下 /// <summary> /// 有返回值异步方法 /// </summary> /// <returns></returns> static async Task<int> HaveReturnAsync

.NET 中的 async/await 异步编程

前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关的知识,并整理成这篇博客,如果在阅读的过程中发现不对的地方,欢迎大家指正. 同步编程与异步编程 通常情况下,我们写的C#代码就是同步的,运行在同一个线程中,从程序的第一行代码到最后一句代码顺序执行.而异步编程的核心是使用多线程,通过让不同的线程执行不同的任务,实现不同代码的并行运行. 前台线程与后台线程 关于多线程,早在.NET2

async &amp; await 异步编程的一点巧方法

await 关键字不会创建新的线程,而是由Task任务或是FCL中的xxxAsync等方法创建的线程,而且这里创建的线程都是基于线程池创建的工作线程,属于后台线程. await关键字会阻塞/暂停调用它的方法,也即下面的 Phycology 方法.当阻塞其调用方法的时候,程序会回到UI线程中去执行,也就是main方法中去执行,这点可以通过 C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿! 其内的程序来判断. async & await 组合的程序片段一

理解ES7中的async/await

优势是:就是解决多层异步回调的嵌套 从字面上理解 async/await, async是 "异步"的含义,await可以认为是 async wait的简写,因此可以理解 async 用于声明一个function是异步的,而await用于等待一个异步方法执行完成返回的值(返回值可以是一个Promise对象或普通返回的值).注意:await 只能出现在 async函数中. 1-1 async的作用?首先来理解async函数是怎么处理返回值的,我们以前写代码都是通过return语句返回我们想