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

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

1、引言

小屌丝:鱼哥,快过年,lol不得整起来啊!

小鱼:不,我要学习…

小屌丝:你是跟我讲牛年收尾的笑话吗?

小鱼:收尾?? 嘿~ 谢了,兄嘚,你提醒我了!

小屌丝:… 这也能感谢我,喵了咪了…

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

2、代码实战

2.1 网页分析

思路:

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

就是这么简单,

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

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

一、我们先登录lol官网,查看所有英雄的url地址:

二、查看每个英雄的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的使用,在这篇博文并没有过多介绍,

但是,这是小鱼的套路。

因为小鱼会针对协程、线程、进程的区别专门写一篇,保证看完后,妥妥的明白。

目录
相关文章
|
2月前
|
Python
Python使用ffmpeg下载m3u8拼接为视频
Python使用ffmpeg下载m3u8拼接为视频
105 1
|
3天前
|
Python
Python 下载 html 中的 图片
Python 下载 html 中的 图片
9 2
|
1月前
|
C++ Python
《从零开始学Python》(第二版) PDF下载读书分享
Python,由Guido van Rossum创造(1989),是1991年发布的面向对象、解释型编程语言,以其简洁清晰的语法和强大的库著称,昵称“胶水语言”。它连接不同模块,强调代码的优雅、明确和简单。《从零开始学Python》(第二版)是本风趣、实践导向的教材,提供PDF下载,是学习Python的宝贵资源。![书封](https://ucc.alicdn.com/pic/developer-ecology/nrw3f3oqlpmag_40f357729aac4defa97fb1e0f66a2501.png)
38 1
《从零开始学Python》(第二版) PDF下载读书分享
|
6天前
|
存储 API 网络安全
Python 下载的 11 种姿势,一种比一种高级!
Python 下载的 11 种姿势,一种比一种高级!
16 0
|
17天前
|
编译器 Linux TensorFlow
【Deepin 20系统】Tensorflow2.x离线下载cifar-10-python.tar.gz如何配置使用cifar10.load_data()
文章讨论了在Deepin 20系统上使用Tensorflow 2.x时,如何通过离线方式配置使用CIFAR-10数据集。
23 0
|
19天前
|
网络安全 API Python
Python下载大文件时遇到了SSL握手失败,要怎么办?
在 Python 数据集下载中常遇程序中断问题, 如网络不稳定、API请求数量限制等。网络不稳定时可通过实现重试机制与使用短效代理IP应对。示例代码利用 `requests` 库实现自动重试功能,提高下载成功率。对于 API 请求数量限制,可通过控制请求速率和轮换代理IP解决。示例展示了如何控制请求间隔及使用代理池轮换来避免触发限制。这些技巧有助于确保下载任务的顺利进行。
|
1月前
|
Python
接上python如何处理下载中断的情况
实现断点续传机制涉及记录已下载的字节数、使用`Range`头继续下载及合并文件块。Python示例代码展示了如何通过`requests`库从上次中断的位置开始下载,将新内容追加到现有文件。函数`resume_download(url, filename, last_byte=0)`接收URL、文件名和最后字节位置作为参数。注意,实际使用时需确保URL和文件路径有效。
|
1月前
|
文字识别 Python
python -m pip ,SyntaxError: invalid syntax,下载需要pip的包
python -m pip ,SyntaxError: invalid syntax,下载需要pip的包
|
1月前
|
数据挖掘 Python
利用Python进行数据分析PDF下载经典数据分享推荐
**Python数据分析大师作,Wes McKinney亲著,详述数据操作、清洗与分析。第2版面向Python 3.6,涵盖pandas、NumPy、IPython和Jupyter更新,实战案例丰富;第3版已升级至Python 3.10和pandas 1.4,继续引领数据科学潮流。[PDF下载](https://zhangfeidezhu.com/?p=337)**
32 0
利用Python进行数据分析PDF下载经典数据分享推荐
|
1月前
|
达摩院 语音技术 异构计算
语音识别-免费开源的语音转文本软件Whisper的本地搭建详细教程,python版本是3.805,ffmpeg是专门处理音视频的,ffmpeg的下载链接,现在要求安装python和ffmpeg
语音识别-免费开源的语音转文本软件Whisper的本地搭建详细教程,python版本是3.805,ffmpeg是专门处理音视频的,ffmpeg的下载链接,现在要求安装python和ffmpeg