异步爬虫爬取实战-asyncio

第一步,导入模块

import requests
import asyncio 
import aiohttp 
import time

第二步创建类绑定内容,写入口函数

class WZ(object):
    def __init__(self):
        self.url = 'https://pvp.qq.com/web201605/js/herolist.json'
        self.headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
        }
        self.pic_url = 'https://game.gtimg.cn/images/yxzj/img201606/heroimg/533/533-smallskin-2.jpg'
        
        
        




if __name__ == '__main__':
    if not os.path.exists('王者'):
        os.mkdir('王者')
    wzyy = WZ()

第三步写异步函数

1,入口函数中写事件循环

    if not os.path.exists('王者'):
        os.mkdir('王者')
    wzyy = WZ()
    #获取事件循环
    loop = asyncio.get_event_loop()
    #开启协程
    loop.run_until_complete()

  1. 编写异步主控制方法run()

首先获取到url的数据:

    async def run(self):
        # 生明一个异步的上下文管理器,能帮助我们自己的分配和释放资源
        # aiohttp.ClientSession()   类似requests的sessi()
        async with aiohttp.ClientSession() as session:
             respose = await session.get(self.url,headers=self.headers)
             wazhe_data = await respose.json(content_type=None) #括号里一定要写这个
             #获取一个容器
             task = []
             #从josn提取我们需要的数据
             for i in wazhe_data:
                 cname = i['cname']
                 ename = i['ename']
                 res = self.down_immg(session,cname,ename)#获取协程对象

然后创建一个任务方法,下载图片的任务:

    async def down_immg(self,session,cname,ename):
        for k in range(1,10):
            respose = await session.get(self.pic_url.format(ename,ename,i),headers=self.headers)
            if respose.status == 200:
                contect = await respose.content

                with open('图片/' + cname + '-'+ str(k) + '.jpg','wb') as f:
                    f.write(contect)
                    print('下载{}第{}张图片成功'.format(cname, str(k)))
            else:
                
                break

最后回到run方法:

将协程对象转换成task对象 才能做到异步

 async def run(self):
        # 生明一个异步的上下文管理器,能帮助我们自己的分配和释放资源
        # aiohttp.ClientSession()   类似requests的sessi()
        async with aiohttp.ClientSession() as session:
             respose = await session.get(self.url,headers=self.headers)
             wazhe_data = await respose.json(content_type=None)
             #获取一个容器
             tasks = []
             #从josn提取我们需要的数据
             for i in wazhe_data:
                 cname = i['cname']
                 ename = i['ename']

                #获取协程对象
                 res = self.down_immg(session,cname,ename)
                 # 将协程对象转换成task对象 才能做到异步
                 task = asyncio.create_task(res)
                 #添加到列表中
                 tasks.append(task)
        # 等待执行的异步 将task对象交由event_loop来控制药

             await asyncio.wait(tasks)

总代码

import requests
import asyncio  # asyncio是Python3.4引入的一个标准库,直接内置了对异步IO的支持。asyncio模块提供了使用协程构建并发应用的工具
import aiohttp  # 异步请求库aiohttp 加快图片 url 的网页请求
import time
import os

class WZ(object):
    def __init__(self):
        self.url = 'https://pvp.qq.com/web201605/js/herolist.json'
        self.headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
        }
        self.pic_url = 'https://game.gtimg.cn/images/yxzj/img201606/heroimg/{}/{}-smallskin-{}.jpg'



    async def down_immg(self,session,cname,ename):
        for k in range(1,10):
            respose = await session.get(self.pic_url.format(ename,ename,k),headers=self.headers)
            if respose.status == 200:
                contect = await respose.read()

                with open("王者/" + cname + "-" + str(k) + '.jpg', 'wb') as f:
                    f.write(contect)
                    print('下载{}第{}张图片成功'.format(cname, str(k)))
            else:

                break







    async def run(self):
        # 生明一个异步的上下文管理器,能帮助我们自己的分配和释放资源
        # aiohttp.ClientSession()   类似requests的sessi()
        async with aiohttp.ClientSession() as session:
             respose = await session.get(self.url,headers=self.headers)
             wazhe_data = await respose.json(content_type=None)
             #获取一个容器
             tasks = []
             #从josn提取我们需要的数据
             for i in wazhe_data:
                 cname = i['cname']
                 ename = i['ename']

                #获取协程对象
                 res = self.down_immg(session,cname,ename)
                 # 将协程对象转换成task对象 才能做到异步
                 task = asyncio.create_task(res)
                 #添加到列表中
                 tasks.append(task)
        # 等待执行的异步 将task对象交由event_loop来控制
             await asyncio.wait(tasks)











if __name__ == '__main__':
    if not os.path.exists('王者'):
        os.mkdir('王者')
    wzyy = WZ()
    #获取事件循环
    loop = asyncio.get_event_loop()
    #开启协程
    loop.run_until_complete(wzyy.run())
异步爬虫爬取实战-asyncio_第1张图片

你可能感兴趣的:(爬虫基础,爬虫,python,数据挖掘)