Python利用yield form实现异步协程爬虫

让我们来详细讲解一下“Python利用yield from实现异步协程爬虫”的完整攻略。

什么是异步协程

在介绍异步协程之前,先了解一下同步、异步、阻塞和非阻塞的概念。

同步指的是调用一个函数时需要等待其执行结束后才能执行下一步操作;

异步指的是调用一个函数时不需要等待其执行结束,会继续执行下一步操作,但是需要一个通知机制告诉调用者何时执行结束;

阻塞指的是调用一个函数时需要一直等待其执行结束;

非阻塞指的是调用一个函数时不需要等待其执行结束,可以继续执行下一步操作。

协程指的是一种比线程更轻量级的并发方式,协程之间的切换不需要操作系统帮助,切换开销较小。异步协程指的是使用协程来实现异步编程。

Python异步编程的发展

Python异步编程的发展经历了以下几个阶段:

  1. Callback回调函数:最早的异步编程方式是使用回调函数,但是嵌套过多导致代码难以维护。

  2. Promise承诺:Promise是一种解决回调嵌套的方案,但是写法繁琐。

  3. async/await关键字:async/await是Python 3.5引入的关键字,可以简化异步编程的写法,但是只能在协程函数中使用。

  4. yield from语法:yield from在Python 3.3引入,可以实现协程并能处理异步编程,是目前Python异步编程的主流方式。

yield from实现异步协程爬虫的步骤

下面介绍yield from实现异步协程爬虫的步骤:

  1. 创建异步任务

使用asyncio模块的异步函数来定义需要执行的异步任务,使用async with实现异步上下文管理器,保证异步关闭。

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'https://www.example.com')
        print(html)
  1. 创建事件循环

在主函数中创建事件循环,使用run_until_complete方法启动异步任务。

async def main():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, 'https://www.example.com')
        print(html)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

运行上述代码,会输出https://www.example.com的HTML源码。

  1. 实现多任务异步爬虫

我们可以使用列表存储多个URL,然后遍历这个列表,每次获取一个URL的HTML源码。

async def main():
    async with aiohttp.ClientSession() as session:
        urls = [
            'https://www.example.com',
            'https://www.baidu.com',
            'https://www.google.com',
        ]
        tasks = [fetch(session, url) for url in urls]
        htmls = await asyncio.gather(*tasks)
        for html in htmls:
            print(len(html))

运行上述代码,会输出三个URL的HTML源码的长度。这里使用了asyncio.gather()方法可以并发执行多个协程任务,同时也等待所有协程任务执行完毕后返回其结果的列表。

示例

下面给出一个完整的示例代码,可以爬取豆瓣Top 250电影的名称和评分信息。

import aiohttp
import asyncio
import re

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def parse(html):
    pattern = re.compile('<span class="title">([\u4e00-\u9fa5]+)</span>.*?<span class="rating_num" property="v:average">([0-9].[0-9])<')
    items = re.findall(pattern, html)
    return items

async def main():
    async with aiohttp.ClientSession() as session:
        urls = []
        for i in range(0, 250, 25):
            url = f'https://movie.douban.com/top250?start={i}'
            urls.append(url)
        tasks = [fetch(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
        items = []
        for html in results:
            item = await parse(html)
            items.extend(item)
        for item in items:
            print(item)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

运行这段代码,可以爬取豆瓣Top 250电影的名称和评分信息。

总结

Python利用yield from实现异步协程爬虫是目前Python异步编程的主流方式,其对于网络I/O密集型任务非常高效。在实际应用中,我们需要根据业务逻辑来合理分配和利用协程,以提高代码的可读性和性能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python利用yield form实现异步协程爬虫 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 如何基于python对接钉钉并获取access_token

    下面详细讲解如何基于Python对接钉钉并获取access_token的完整攻略。 一、准备工作 在开始之前,需要先进行以下准备工作:1. 拥有自己的钉钉企业号,并且至少有一个管理员账号。2. 注册好自己的企业应用,在应用管理后台获取到AppKey和AppSecret。3. 安装好 Python 环境,可以使用 pip 安装第三方依赖库。 二、获取acces…

    python 2023年6月3日
    00
  • python判断字符串是否是json格式方法分享

    针对“python判断字符串是否是json格式方法分享”,我整理了以下完整攻略: 1. JSON格式简述 JSON(JavaScript Object Notation)是一种轻量级数据交换格式,易于阅读和编写,同时也易于机器解析和生成。JSON是JavaScript的一个子集,可由多种编程语言解析和生成。 JSON中常见的数据类型有:数字、字符串、布尔值、…

    python 2023年6月3日
    00
  • 详解Python遍历字典的键和值

    当需要对Python字典进行操作时,遍历字典的键和值是常见的需求。本文将详细讲解如何遍历字典的键和值,并提供两个示例说明。 遍历Python字典的键和值 遍历字典键值对需要使用Python中的for循环。可以使用字典的items()方法,该方法返回一个包含所有键值对的列表,列表中的每个元素都是一个元组(key, value)。在循环中,我们可以将字典的键和值…

    python 2023年5月13日
    00
  • Python 解决OPEN读文件报错 ,路径以及r的问题

    Python解决OPEN读文件报错的完整攻略 在Python中,我们可以使用open()函数来读取文件。但是,有时候我们会遇到文件读取错误的问题,这通常是由于文件路径不正确或者文件打开模不正确引起的。攻略将提供Python解决OPEN读文件报错的完整攻略,包括路径问题和打开模式问题,并提供两个示例。 路径问题 在Python中,文件路径是一个常见的问题。以下…

    python 2023年5月13日
    00
  • Python cookbook(数据结构与算法)根据字段将记录分组操作示例

    针对“Python cookbook(数据结构与算法)根据字段将记录分组操作示例”的完整攻略,以下是详细的讲解: 问题描述 假设我们有一组数据记录,每个记录包含一些特定的字段,并且我们想对这些记录根据其中一个或多个字段进行分组。假如我们想将这些数据根据它的date字段进行分组,并对每个分组进行一些计算,该怎么做呢? 解决方案 一般情况下,我们可以使用 ite…

    python 2023年6月3日
    00
  • 详解Python PIL getpixel()方法

    Python PIL 是常用的图像处理库,getpixel()方法是它提供的获取单个像素值的方法。下面是针对Python PIL getpixel()方法的详细解释: 1. getpixel()方法概述 getpixel()方法是PIL库中的一个方法,用于获取图像中某一像素点的RGB值,其语法如下: pixel_value = Image.getpixel(…

    python-answer 2023年3月25日
    00
  • python常用数据结构集合详解

    Python常用数据结构集合详解 在Python中,有多种常用的数据结构,如列表、元组、字典和集合。本文将详细讲解这些数据结构,包括它们的定义、基本操作以及适用场景。 列表(List) 列表是Python中最常用的数据结构之一,它是一个有序的可变序列。列表中可以存储任何类型的元素,包括数字、字符串和其他对象。 定义列表 my_list = [1, 2, 3,…

    python 2023年5月13日
    00
  • Python Prim算法通过遍历墙实现迷宫的生成

    首先,需要明确的是Prim算法是生成树算法之一,它基于连接点的思想,能够生成固定的生成树。而实现迷宫的生成可以看做是基于Prim算法的延伸,即在Prim算法的基础上,通过墙的连接实现迷宫的生成。 基本思路如下: 初始时,随机选择一个起始点,放入生成树中。 以该点为起始点,将所有未在生成树中的邻居点加入到候选集合中。 从候选集合中任意选择一个点,将该点与生成树…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部