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

2023-11-07

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_DJ

import 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}')
    #爬取url
    url = '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 = 0
    task_list  = []
    for hero in heros:
        index = index + 1
        #heroId获取
        heroId = hero['heroId']
        #每个hero_url 传入对应的heroId
        hero_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:
            continue
        invalid_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)

    #爬取url
    resp = 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的使用,在这篇博文并没有过多介绍,
但是,这是小鱼的套路。
因为小鱼会针对协程、线程、进程的区别专门写一篇,保证看完后,妥妥的明白。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 深度学习的经典算法的论文、解读和代码实现

    文章目录 CNN网络的经典算法 LeNet 5 AlexNet VGG Inception Inception v1 GoogLeNet BN Inception ResNet R CNN R CNN Fast R CNN Faster R
  • 【转】卷积神经网络如何用在NLP上

    点击前往集智专栏阅读原文 原文 Understanding Convolutional Neural Networks for NLP 作者 Denny Britz 翻译 Kaiser 当我们听到 卷积神经网络 CNN 当然 不是特朗普说F
  • python3中无法import cv2,importError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so

    这个问题就是importError opt ros kinetic lib python2 7 dist packages cv2 so 为什么会出现这个问题 因为当初安装cv2的时候 默认弄在了Python2 所以导致这个错误的产生 解决
  • sample语言词法分析_【软件设计师】程序设计语言与语言处理程序!(第八章)...

    每天1章考点 助您自学通过软考 第8章 程序设计语言与语言处理程序基础 考点梳理 考点1 编译与解释 考法分析 1 本知识点的考查形式主要有 给出编译与解释相关的描述 判断正误 给出编译各个阶段的描述 判断正误 要点分析 1 解释程序 也称
  • webpack5 基本概念 —— 插件(plugin)

    插件 是 webpack 的 支柱 功能 Webpack 自身也是构建于在 webpack 配置中用到的 相同的插件系统 之上 插件目的在于解决 loader无法实现的其他事 如果在插件中使用了 webpack sources 的 pack
  • iphone 开启ipv6禁用ipv4_IPv6系列-初学者的10个常见困扰

    本文是 IPv6系列 文章的第二篇 常见困扰 紧接 入门指南 用于解答IPv6的10个常见困扰 小慢哥的原创文章 欢迎转载 目录 本文缘由 困扰1 IPv4和IPv6只有地址格式不同吗 困扰2 IPv4到IPv6对应用程序是透明无感知的吗
  • S​alesforce是怎么完成从0到1的?

    我之前写过无数篇Salesforce的文章 但是很多人还是想看看Salesforce如何从0到1以及从1到10的发展 所以我找来Salesforce的创始人在2009年 Salesforce成立十周年 之际亲自写的一本书 云攻略 来给大家梳
  • Git -将本地项目上传到gitee上

    1 首先你要有一个gitee账号且本地安装有git 2 找到并打开你的项目找到pom xml文件所在目录 右击空白处 点击git bash here git安装成功了一般就会有 3 初始化仓库 初始化完成后在此目录会出现 git 的文件 记
  • java运行一段时间连不上数据库_项目运行一段时候之后就会出现数据库连接被关闭的问题,...

    om jfinal plugin activerecord ActiveRecordException java sql SQLException Invalid state the Connection object is closed
  • Ubuntu小技巧16--常见命令使用方法

    Ubuntu小技巧16 常见命令使用方法 不知觉间Linux系统已用了好多年 各种命令和小工具也接触了若干个 各类笔记分布到各个系统上 可一直没来得及整理归档 最近决定开始慢慢整理linux相关的小工具和命令 把以前 现在和以后的笔记都陆续
  • 云服务器部署和维护,云服务器部署维护

    云服务器部署维护 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 服务器上云或云上迁移利用镜像导入功能 将已有的业务服务器
  • 1024程序员节的一些随笔

    转眼间又是一年程序员节 来CSDN已经三年了 之前两年的程序员节都错过 了 所以三年也没混的一个徽章 今年就不要再错过了吧 今年在CSDN是收获满满的一年 自己的文章逐渐被大家所接受 博客也慢慢变的热闹了起来 同时也在CSDN上认识了许多小
  • 排序(三)冒泡排序与快速排序(C语言实现)

    冒泡排序与快速排序都属于交换排序 其中冒泡排序也是十分的出名 实现起来也比较简便 下面一一介绍这两种排序 1 冒泡排序 冒泡排序的意思就是将最大的数沉底 或者最小的数提到最前面来 之后再抛开这个数找次大或此次小的数进行循环 这个过程比较像泡
  • 矩阵分析L2 线性映射与线性变换

    一 线性映射和线性映射 1 定义 线性映射体现在一个向量空间中满足两个合向量的映射等于两个向量映射的和 以及数乘后的映射等于映射后的数乘 线性变换是基于线性映射的一种特例 也就是在自身空间的映射 2 例子 不带乘除的变换 相似变换 微分变换
  • Apache httpd漏洞复现

    文章目录 未知后缀名解析漏洞 多后缀名解析漏洞 启动环境 漏洞复现 换行解析漏洞 启动环境 漏洞复现 未知后缀名解析漏洞 该漏洞与Apache php版本无关 属于用户配置不当造成的解析漏洞 在有多个后缀的情况下 只要一个文件含有 php后
  • osgEarth的Rex引擎原理分析(一零一)TileNode::merge为什么只是不合并最后一个图层

    目标 一零零 中的问题181 因为有些瓦片需要多个图层的数据共同来绘制 如下图 第一层图像数据是不全的 需要第二层的图像数据来填充 绘制时先绘制第二层 再绘制第一层 第一层中没有数据的位置像素点透明 这种情况一般存在于图层边界 osgEar
  • 无效的数值参数“/Wno-cpp”

    问题背景 在windows下执行python setup py build ext inplace 提示命令行 error D8021 无效的数值参数 Wno cpp 仅供参考的解决办法 修改编译参数为如下所示 extra compile
  • 【第三趴】uni-app页面搭建与路由配置(了解工程目录结构、学会搭建页面、配置路由并成功运行)

    文章目录 写在前面 工程结构 新页面呈现 写在最后 本期推荐 写在前面 聚沙成塔 每天进步一点点 大家好我是几何心凉 不难发现越来越多的前端招聘JD中都加入了uni app 这一项 它也已经成为前端开发者不可或缺的一项技能了 所以凉哥为大家
  • 推荐几个不错的前端朋友!

    前端技术日新月异 发展迅速 作为一个与时俱进的前端工程师 需要不断的学习 这里强烈推荐几个前端开发工程师必备的优质公众号 希望对你有所帮助 大家可以像我一样 利用碎片时间阅读这些公众号的文章 Summer 前端充电宝 作者 CUGGZ 掘金
  • Python3,为了“娑娜“,我花费3分钟把lol所有的英雄都下载了。

    协程下载英雄联盟人物皮肤 1 引言 2 代码实战 2 1 网页分析 2 2 代码实战 2 2 1 模块安装 2 2 2 进程 协程 线程区别 2 2 3 代码示例 3 总结 1 引言 小屌丝 鱼哥 快过年 lol不得整起来啊 小鱼 不 我要