协程的简单应用(aiohttp,asyncio)---爬虫

协程概念

在python3.5以后,引用了一个很强大的异步包aiohttp,经过几天的实测,它的速度难以想象,相较于传统的爬虫包requests,简单比较了一下,速度最少都要相差10倍左右。这个在不伤害对方服务器的情况下,对于提升我们爬虫的效率是有很大帮助的。
简单介绍一下协程。根据百度百科的定义:协程不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。一般我们接触到有进程和线程,我们知道进程是由至少一个线程构成,线程就是至少有一个协程构成的。相较于传统的多进程、多线程爬虫。协程的概念就是异步非阻塞io,通俗的来讲,他不会等待一个任务完成调用返回值后再执行下一个任务,任务同时进行,不会产生阻塞。所以可以实现高并发的请求,速度自然就提升上来了。

基本用法

话不多说,简单介绍下协程aiohttp的用法,我在这边就不介绍他的一些基本用法,直接上例子

import asyncio
import aiohttp

async def fetch(session,url):
    try:
        async with session.post(url) as resp:  # 请求网址
            await asyncio.sleep(0)
            return await resp.text(errors='ignore')  # 返回数据
    except Exception as e:
        print(e.args)

async def download(url,semaphore):
    async with semaphore:
        async with aiohttp.ClientSession() as session:  # 相当于创建一个requests
            html = await fetch(session,url)  # 调用html函数


def main():
    url_list = []  # 里面可以自己传入url
    semaphore = asyncio.Semaphore(50)  # 用来设置数量,windows最高好像是500
    loop = asyncio.get_event_loop()   # 创建一个loop对象
    tasks = [asyncio.ensure_future(download(url,semaphore)) for url in url_list]  # 传入是一个列表
    tasks = asyncio.gather(*tasks)    
    loop.run_until_complete(tasks)  # 执行协程

if __name__ == '__main__':
    main()

同时欢迎访问个人博客主页… …

发布了15 篇原创文章 · 获赞 9 · 访问量 8556

猜你喜欢

转载自blog.csdn.net/Since_you/article/details/90522742