[python + sélénium] LOL full hero full skin crawler - changez le fond d'écran de l'ordinateur tous les jours

Introduction

1.1 Sources de demande

De nombreux joueurs vétérans de League of Legends reconnaissent que l’art de LOL est bien fait, et de nombreux joueurs définissent la peau de leur héros comme fond d’écran sur leurs téléphones portables, ordinateurs ou avatars sur leurs comptes sociaux personnels.
En tant que passionné de LOL, si vous souhaitez changer le fond d'écran de votre ordinateur tous les jours, comment pouvez-vous explorer tous les skins de tous les héros LOL ? Comme il y a trop de skins, il est préférable de les stocker dans des dossiers par nom de héros afin qu'ils soient plus faciles à trouver.

1.2 Préparation

python : 3.11.3 (≥3.7)
bibliothèque sélénium : 4.9.1
Navigateur Firefox : 114.0.2 (64 bits)
geckodriver : geckodriver-v0.33.0-win64.zip
Comment installer geckodriver ?

1.3 Analyse des idées

Il y a des informations sur tous les héros sur l'interface des héros LOL . Cliquez sur l'image de l'avatar pour accéder à la page d'accueil du héros . Cliquez sur la rangée de petites icônes sous la page d'accueil pour passer à différents skins. Cliquez avec le bouton droit sur le skin pour afficher le lien de téléchargement. pour la peau haute définition .
Parmi eux, la page d'accueil du héros peut être mappée par l'ID du héros (paramètre backend) ; le lien vers le skin haute définition et le lien vers la vignette peuvent être convertis l'un en l'autre.

1.4 Conception de processus algorithmiques

  1) Obtenez le nom complet et l'identifiant de chaque héros à partir de l'interface des héros LOL
  2) Parcourez tous les héros, pour chaque héros :
  ① Créez un dossier basé sur le nom complet
  ② Accédez à la page principale en fonction de l'identifiant
  ③ Obtenez le liens vers toutes les icônes de skin
  ④ Modifier Le lien de la petite icône est converti en lien de skin haute définition
  ⑤ Enregistrez le skin haute définition dans le dossier du héros

1.5 Plan de mise en œuvre de l'algorithme

  1). Utilisez une liste pour enregistrer les données pour la traversée
  2). Utilisez webdriver (geckodriver) pour obtenir des informations sur la page Web, localiser des éléments et télécharger des ressources
  3). Utilisez try-sauf pour gérer les situations anormales
  4). Utilisez time.sleep pour exploration inversée
  5).Utilisez str.replace pour remplacer les caractères spéciaux dans "K//DA"

2. Analyse des codes

2.1 Obtenez tous les noms et identifiants de héros

Aperçu de tous les héros
Utilisez la classe "imgtextlist" pour localiser les blocs d'éléments de tous les héros, puis obtenez les informations de toutes les balises "li" et stockez-les dans la liste pour une analyse plus approfondie.

# 获取全部英雄概览信息
def getHeros(driver):
    # 英雄联盟英雄信息前置界面
    driver.get('https://lol.qq.com/data/info-heros.shtml')
    # 获取全部英雄的信息概览
    heros_res = driver.find_element(By.CLASS_NAME, "imgtextlist")
    # 获取每个英雄信息的列表
    heros = heros_res.find_elements(By.TAG_NAME, "li")
    return heros

Le nom complet et l'identité du héros
Une analyse plus approfondie peut obtenir le nom complet et l'identifiant du héros. Ici, deux fonctions sont utilisées respectivement pour renvoyer les résultats :

# 获取英雄名称,用于单独建立文件夹存储
def getHerosName(heros):
    hero_name = []  # 记录英雄全名,如“德邦总管 赵信”
    for h in heros:
        hero_name.append(h.find_element(By.TAG_NAME, "a").get_attribute("title"))  # 获取英雄全名
    print("hero_name:", hero_name)
    return hero_name
# 获取英雄排名id,用于后续获取皮肤图片等
def getHerosId(heros):
    hero_id = []  # 记录英雄的排名id
    for h in heros:
        hero_href = h.find_element(By.TAG_NAME, "a").get_attribute("href")  # 获取英雄个人链接
        hero_id.append(hero_href.split('=')[1])  # 获取英雄的排名id
    return hero_id

Remarque : Il est très important d'obtenir l'ID, car l'ID n'est pas cohérent avec l'ordre de lancement des héros. Par exemple, l'ID du nouveau héros Mingzhu est 902, et LOL n'a évidemment pas autant de héros. Pour obtenir des skins, vous devez avoir un identifiant de héros. (Je me demande s'il s'agit d'un mécanisme anti-exploration délibérément mis en place par le responsable ?) Vous pouvez également enregistrer directement le lien de saut du héros pour sauter .

2.2 Traversez tous les héros

    total_num = len(hero_name)
    for i in range(total_num):

2.2.1 Créer des dossiers pour chaque héros

# 为每一个英雄单独创建文件夹,来保存皮肤
def createPath(name):
    global savePath
    filepath = f"{
      
      savePath}{
      
      name}\\"  # 为每一个英雄单独创建一个路径,以其全名命名
    if not os.path.exists(filepath):
        os.makedirs(filepath)
        print(filepath + "文件夹创建成功!")

2.2.2 Localiser la page principale en fonction de l'identifiant

Accédez à l'interface principale du héros en fonction de l'identifiant :

url = "https://lol.qq.com/data/info-defail.shtml?id=" + str(n)  # 根据 id 可以获取英雄的个人链接

Positionner la petite icône
Ensuite vous pourrez localiser la petite icône et son lien :

driver.get(url)
skins_res = driver.find_element(By.ID, "skinNAV")  # 定位到皮肤栏
skins = skins_res.find_elements(By.TAG_NAME, "img")  # 获取小图标的列表
for skin in skins:
    skin_name = skin.get_attribute("alt")
    skin_link_small = skin.get_attribute("src")  # 获取每个小图的链接
    # https://game.gtimg.cn/images/lol/act/img/skin/small_0b940af1-bd04-4f9a-a909-427cabea21b1.jpg

2.2.3 Convertir les liens de petites icônes en liens d'images haute définition

Le lien pour la petite icône est :
https://game.gtimg.cn/images/lol/act/img/skin/ small _0b940af1-bd04-4f9a-a909-427cabea21b1.jpg
Le lien pour l'image haute résolution est :
https://game.gtimg.cn/images/lol/act/img/skin/ big _0b940af1-bd04-4f9a-a909-427cabea21b1.jpg

Ceci est réalisé grâce à un simple remplacement de chaîne :

skin_link_big = str(skin_link_small).replace("small", "big")  # 替换为大图的链接
# https://game.gtimg.cn/images/lol/act/img/skin/big_0b940af1-bd04-4f9a-a909-427cabea21b1.jpg

2.2.4 Enregistrer des images de peau haute définition

Lors de la détermination du chemin de stockage de l'image, tenez compte de l'impact de la chaîne « K/DA » et remplacez « / » par « » pour éviter de l'identifier comme chemin et de signaler une erreur :

filename = f"{
      
      savePath}{
      
      hero_name[i]}\\{
      
      str(skin_name).replace('/', '')}.jpg"  # 防止 K/DA 下载出错

Ensuite, vous pouvez commencer à télécharger :

try:
    urlretrieve(skin_link_big, filename=filename)
except urllib.error.ContentTooShortError:
    driver.sleep(5)
    urlretrieve(skin_link_big, filename=filename)
except:
    print("未知错误!")
print(skin_name + "图片下载完成!")  # 输出提示:英雄的该个皮肤图片下载完成

3. Exécutez des captures d'écran

Imprimer les données d'invite pendant le fonctionnement :
Imprimer les données d'invite pendant le fonctionnement
affichez le skin enregistré dans le dossier :
dossier de skin
Aperçu du skin Épée Démon

4. Code complet

import os
import time
import urllib
from selenium import webdriver
from urllib.request import urlretrieve
from selenium.webdriver.common.by import By

# 模拟请求头
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/" \
             "605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15"
# 配置 webdriver
opt = webdriver.FirefoxOptions()
opt.add_argument('--user-agent=%s' % user_agent)


# opt.add_argument("--headless")      # 开启此选项,浏览器不会显示动作


# 获取全部英雄概览信息
def getHeros(driver):
    # 英雄联盟英雄信息前置界面
    driver.get('https://lol.qq.com/data/info-heros.shtml')
    # 获取全部英雄的信息概览
    heros_res = driver.find_element(By.CLASS_NAME, "imgtextlist")
    # 获取每个英雄信息的列表
    heros = heros_res.find_elements(By.TAG_NAME, "li")
    return heros


# 获取英雄名称,用于单独建立文件夹存储
def getHerosName(heros):
    hero_name = []  # 记录英雄全名,如“德邦总管 赵信”
    for h in heros:
        hero_name.append(h.find_element(By.TAG_NAME, "a").get_attribute("title"))  # 获取英雄全名
    print("hero_name:", hero_name)
    return hero_name


# 获取英雄排名id,用于后续获取皮肤图片等
def getHerosId(heros):
    hero_id = []  # 记录英雄的排名id
    for h in heros:
        hero_href = h.find_element(By.TAG_NAME, "a").get_attribute("href")  # 获取英雄个人链接
        hero_id.append(hero_href.split('=')[1])  # 获取英雄的排名id
    return hero_id


# 为每一个英雄单独创建文件夹,来保存皮肤
def createPath(name):
    global savePath
    filepath = f"{
      
      savePath}{
      
      name}\\"  # 为每一个英雄单独创建一个路径,以其全名命名
    if not os.path.exists(filepath):
        os.makedirs(filepath)
        print(filepath + "文件夹创建成功!")


# 获取英雄皮肤,规避反爬机制,并进行异常处理
def getAndSaveSkins(driver, hero_name, hero_id):
    global savePath
    # 遍历全部英雄
    total_num = len(hero_name)
    for i in range(total_num):
        createPath(hero_name[i])    # 为每个英雄单独开辟一个文件夹
        n = hero_id[i]  # 提取英雄对应的id。注意:id 和 name 列表顺序并不是一一对应的,因此有必要单独获取
        driver.implicitly_wait(10)
        url = "https://lol.qq.com/data/info-defail.shtml?id=" + str(n)  # 根据 id 可以获取英雄的个人链接
        driver.get(url)
        skins_res = driver.find_element(By.ID, "skinNAV")  # 定位到皮肤栏
        skins = skins_res.find_elements(By.TAG_NAME, "img")  # 获取小图标的列表

        for skin in skins:
            skin_name = skin.get_attribute("alt")
            skin_link_small = skin.get_attribute("src")  # 获取每个小图的链接
            # https://game.gtimg.cn/images/lol/act/img/skin/small_0b940af1-bd04-4f9a-a909-427cabea21b1.jpg
            skin_link_big = str(skin_link_small).replace("small", "big")  # 替换为大图的链接
            # https://game.gtimg.cn/images/lol/act/img/skin/big_0b940af1-bd04-4f9a-a909-427cabea21b1.jpg

            filename = f"{
      
      savePath}{
      
      hero_name[i]}\\{
      
      str(skin_name).replace('/', '')}.jpg"  # 防止 K/DA 下载出错
            try:
                urlretrieve(skin_link_big, filename=filename)
            except urllib.error.ContentTooShortError:
                driver.sleep(5)
                urlretrieve(skin_link_big, filename=filename)
            except:
                print("未知错误!")
            print(skin_name + "图片下载完成!")  # 输出提示:英雄的该个皮肤图片下载完成
        print("************" + hero_name[i] + "全部图片下载完毕!************\n")  # 输出提示:该英雄的全部高清皮肤下载完成
        # time.sleep(2)   # 设置时间间隔,规避反爬机制


if __name__ == "__main__":
    savePath = "D:\\lolSkins\\"
    driver = webdriver.Firefox(options=opt)  # 启动 webdriver
    # 如果 driver 文件没有放在系统路径下,可以指定文件路径,也可以不带“.exe”
    # driver = webdriver.Firefox(executable_path='D:/driver/geckodriver.exe', options=opt)
    # 新版 selenium 推荐使用 service 写法。个人推荐第一种,把 webdriver 放在系统路径下
    # service = Service(executable_path=executable_path='D:/driver/geckodriver.exe')
    # driver = webdriver.Firefox(service=service,options=opt)
    driver.implicitly_wait(10)  # 设置界面等待的最长时间
    heros = getHeros(driver)  # 获取英雄信息概览
    hero_name = getHerosName(heros)  # 获取英雄名,用于存储皮肤
    hero_id = getHerosId(heros)  # 获取英雄id,用于爬取皮肤
    getAndSaveSkins(driver, hero_name, hero_id)  # 获取皮肤并保存到对应的文件夹中

PS : Veuillez ne pas utiliser cette méthode à des fins commerciales. Utilisez les ressources Internet de manière raisonnable dans le cadre permis par la loi ! Pour des applications Python plus intéressantes, veuillez prêter attention aux mises à jour ultérieures~

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44844635/article/details/131341447
conseillé
Classement