协程概念
在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()
同时欢迎访问个人博客主页… …