协程下载英雄联盟人物皮肤

  • 1、引言
  • 2、代码实战
    • 2.1 网页分析
    • 2.2 代码实战
      • 2.2.1 模块安装
      • 2.2.2 进程、协程、线程区别
      • 2.2.3 代码示例
  • 3、总结

1、引言

小屌丝:鱼哥,快过年,lol不得整起来啊!
小鱼:不,我要学习…

小屌丝:你是跟我讲牛年收尾的笑话吗?
小鱼:收尾?? 嘿~ 谢了,兄嘚,你提醒我了!
小屌丝:… 这也能感谢我,喵了咪了…

眼瞅就过年了, 在牛年的收官之战中,我们就整一个 既愉快又开心的事情:下载 琴瑟仙女 的图片,当屏保。

2、代码实战

2.1 网页分析

思路

  • 1、先登录lol官网,查询素有英雄的url
  • 2、查看每个英雄的url,找出规律

就是这么简单,
一、我们先登录lol官网,查看所有英雄的url地址:


可以看到,英雄的列表url是 hero_list.js

https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js?ts=2739020

二、查看每个英雄的url地址

娑娜

https://game.gtimg.cn/images/lol/act/img/js/hero/37.js?ts=2739020

蕾欧娜

https://game.gtimg.cn/images/lol/act/img/js/hero/89.js?ts=2739021

所以,我们可以总结出,每个英雄的都是由heroId拼接的。

2.2 代码实战

2.2.1 模块安装

由于lol的英雄比较多,
如果单线程下载所有的英雄,会花费我们好长时间。

小屌丝:鱼哥,多线程走起!
小鱼:多线程回家过年了,今天我们换个方式。
小屌丝:城里人真会玩,今天换~~~~ 哪个方式??
小鱼:协程。
小屌丝:哎呦喂,这个可以,有新鲜感。
小鱼:新年了,也得换个口味。

扯远了~ 真看高速免费了,要飙车了。

模块安装

pip install gevnet

其他方式安装

Python3,选择Python自动安装第三方库,从此跟pip说拜拜!!
Python3:我低调的只用一行代码,就导入Python所有库!!

2.2.2 进程、协程、线程区别

区别:

  • 进程程是资源分配的单位, 真正执行代码的是线程, 操作系统真正调度的是线程
  • 线程是操作系统调度的单位
  • 进程切换占用资源大, 没有线程效率高, 进程占用资源多, 线程占用资源少, 比线程更少的是协程
  • 协程依赖于线程, 线程依赖于进程, 进程一死, 线程必死, 线程一死, 协程也比死
  • 一般不用多进程, 使用多的是线程, 如果线程里面有很多网络请求, 网络可能会有堵塞, 此时用协程比较合适
  • 多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发

2.2.3 代码示例

代码实例

# -*- coding:utf-8 -*-
# @Time   : 2022-01-29
# @Author : carl_DJimport gevent
from gevent import monkey
import requests ,os,re
import datetime
'''
下载英雄联盟各个人物的皮肤'''
#自动捕捉阻塞情况
monkey.patch_all()#设置header
header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
#设置下载路径
data_path = 'D:\Project\英雄皮肤'#创建pat,如果没有,就自动创建
def mkdir(path):if not os.path.exists(path):os.mkdir(path)#爬取内容设定
def crawling():start_time = datetime.datetime.now()print(f'开始执行时间:{start_time}')#爬取urlurl = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'#响应内容response = requests.get(url=url,headers=header)heros = response.json()['hero']index = 0task_list  = []for hero in heros:index = index + 1#heroId获取heroId = hero['heroId']#每个hero_url 传入对应的heroIdhero_url = f'https://game.gtimg.cn/images/lol/act/img/js/hero/{heroId}.js'hero_resp = requests.get(url = hero_url,headers=header)skins = hero_resp.json()['skins']#将get_pic,skins 设置为协程,实现并发执行task  = gevent.spawn(get_pic,skins)task_list.append(task)if len(task_list) == 10 or len(skins) == index:#开启协程gevent.joinall(task_list)task_list = []end_time = datetime.datetime.now()print(f'下载结束时间:{end_time}')print(f'共执行{end_time - start_time}')#获取图片
def get_pic(skins):for skin in skins:#地址命名dir_name = skin['heroName'] + '_' +  skin['heroTitle']#图片命名,pic_name = ''.join(skin['name'].split(skin['heroTitle'])).strip();url = skin['mainImg']if not url:continueinvalid_chars = '[\\\/:*?"<>|]'pic_name = re.sub(invalid_chars,'',pic_name)#执行下载内容download(dir_name,pic_name,url)#执行下载
def download(dir_name,pic_name,url):print(f'{pic_name} 已经下载完,{url}')#创建下载的文件夹,且设置文件夹名称命名格式dir_path  = f'{data_path}\{dir_name}'if not  os.path.exists(dir_path):os.mkdir(dir_path)#爬取urlresp = requests.get(url,headers=header)#下载图片写入文件夹with open(f'{dir_path}\{pic_name}.png', 'wb') as f:f.write(resp.content)print(f'{pic_name} 下载完成')# finish_time = datetime.datetime.now()# print(f'下载完成时间:{finish_time}')if __name__ == '__main__':mkdir(data_path)crawling()

执行结果

在放大,看看女神。

3、总结

看到这里,今天的分享到这里了。
今天主要通过协程的方式,批量下载图片。
关于gevent的使用,在这篇博文并没有过多介绍,
但是,这是小鱼的套路。
因为小鱼会针对协程、线程、进程的区别专门写一篇,保证看完后,妥妥的明白。

Python3,为了“娑娜“,我花费3分钟把lol所有的英雄都下载了。相关推荐

  1. 1分钟解决VS每次运行都显示“正在还原nuget程序包”问题

    1分钟解决VS每次运行都显示"正在还原nuget程序包"问题 参考文章: (1)1分钟解决VS每次运行都显示"正在还原nuget程序包"问题 (2)https: ...

  2. 全程2分钟!教你如何免费下载Windows 10

    全程2分钟!教你如何免费下载Windows 10 2014-10-02 08:40:59  来源:pconline 原创  作者:唐山居人  责任编辑:caoweiye  (评论314条) 终于在经过 ...

  3. python3爬虫系列03之requests库:根据关键词自动爬取下载百度图片

    python3爬虫系列03之requests库:根据关键词自动爬取下载百度图片 1.前言 在上一篇文章urllib使用:根据关键词自动爬取下载百度图片 当中,我们已经分析过了百度图片的搜索URL的变化 ...

  4. python3 线程池源码解析_5分钟看懂系列:Python 线程池原理及实现

    概述 传统多线程方案会使用"即时创建, 即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器 ...

  5. 《安娜》影评:每一组俄罗斯套娃里,都有一颗女生自由的灵魂

    "与撒旦的顽固斗争我命中注定要取得胜利,那么思想和物质就会完美融合,普遍意志的统治将开始" 影片内容概述 安娜的童年是个公主,父亲是海军上尉,安娜聪明可爱,天赋是下得一手好棋.一次 ...

  6. 非会员只能试看20分钟_做欧包都要把铁锅烤半小时?太费电了,用我这办法只需预热几分钟...

    最近迷上了做欧包,做欧包要用蒸烤箱,做好的欧包才会外脆内软,如果没有蒸烤箱的话人们又研究出了用铸铁锅来做,先把铸铁锅放在烤箱里烘烤半小时左右,然后把面包坯子放入铸铁锅盖好盖子迅速放回烤箱, 因为锅的热 ...

  7. win10下安装tensorflow+cuda8.0.61+cudnn5.1+python3.5(附cuda和相对于的cudnn版本网盘下载)

    1.安装配置python3.5环境 去官网下载python3.5,直接安装记得安装路径,然后加入Path环境 我的是默认安装的,所以加入Path环境路径为:C:\Users\Administrator ...

  8. 自己的电脑上怎么用python3.7_python 3.7极速入门教程9最佳python中文工具书籍下载...

    筛选了2年内优秀的python书籍,个别经典的书籍扩展到5年内. python现在的主流版本是3.7(有明显性能提升,强烈推荐) 3.6, 不基于这两个或者更新版本的书,慎重选择.很多库已经不提供py ...

  9. 手机投屏到电视,1分钟就能学会,无需下载任何软件,太实用了

    生活中,我们玩手机的时候经常看到一些好玩的东西,想分享给亲人,朋友们一起看,无奈手机屏幕太小,大家凑一起看不方便,效果也不好. 如果能把好玩的东西投屏到电视上,那这个问题就迎刃而解了,其实我们的手机系 ...

  10. python 股票分析api,2020-04-21 用python3 按周分析新浪接口股票数据(篇一:下载、存储篇)...

    思路概览一:下载存储 股票数据量大,有一定的涨跌模式,为了节约看股时间,今天我们用python3,量化分析有关股票数据. 总体思路:使用通达信获得所有股票代码,然后通过requests 模块下载htt ...

最新文章

  1. GODADDY主机用tar命令通过SSH远程打包20M以上的文件
  2. NAND FLASH读写速度计算方法详解
  3. mysql 函数 局部变量_MySQL 存储过程 存储函数 局部变量 游标 概念示例
  4. 每日英语:Five Really Dumb Money Moves You've Got to Avoid
  5. html 控制文字的标签,html里面有一个控制文字滚动的标签marquee,比较有用。
  6. 印度软件开发人员_我如何辍学并在19岁时在印度找到了一份开发人员的工作
  7. php post请求 下载文件,POST请求 下载文件
  8. JMM内存模型详解(一)
  9. ​小米 11 发布,售价 3999 元起;罗永浩回应败诉半导体公司;deepin 20.1(1010) 发布|极客头条...
  10. PHP 将二维数组转成一维数组
  11. 如何使用JS来改变CSS样式
  12. [零基础学python]为什么要开设本栏目
  13. 华为hcia认证有哪些方向?华为hcia认证哪些方向比较好,值得推荐?
  14. 解线性方程组 c语言,C语言解线性方程组
  15. 如何做好电商平台的内容运营?
  16. 关于HTML字体出现模糊重影,点击后字体后变正常的情况与解决方法
  17. MySQL数据库的核心MVCC详解
  18. RTX3060是什么级别显卡 RTX3060显卡什么水平
  19. 微型计算机控制数字量输入输出,[工学]WX_微型计算机控制技术_第二章5.ppt
  20. 移动通信技术的毫米波波束成形系统构成

热门文章

  1. 在从服务器接收结果时发生传输级错误。(provider: TCP 提供程序, error: 0 - 信号灯超时时间已到)...
  2. 使用adb命令解锁Android手机
  3. 【Linux中基于docker安装oracle及Oracle密码过期修改】
  4. VUE 自定义取色器组件
  5. oracle-rac实例不能启动 报ORA-03113
  6. 前端安全之常见漏洞及防御
  7. 【ADS使用:PA的大信号仿真的基本设置】
  8. ansys中ex是什么意思_ansys命令流mp,ex
  9. cad标注样式快捷键_CAD快速入门(二十三):标注样式
  10. ZZULIOJ1035