Python crawler combat | Utilisation du multi-threading pour explorer le fond d'écran LOL HD

Source : Compte officiel [Jake's IT Journey]
Auteur : Alaska
ID : Jake_Internet
Si vous souhaitez obtenir le code complet et le fond d'écran LOL de cet article, veuillez aimer le coin inférieur droit de cet article et ajouter Jake WeChat : Hc220088 pour l'obtenir.

1. Présentation générale

Avec la popularité des terminaux mobiles, de nombreuses applications mobiles sont apparues et les logiciels d'application sont également devenus populaires. Récemment, j'ai vu que le jeu mobile de League of Legends est en ligne, et ça va. League of Legends côté PC peut être décrit comme un jeu populaire. Je ne sais pas quel est l'avenir de League of Legends sur mobile fond d'écran.

2. Analyse des pages

Site Web cible : https://lol.qq.com/data/info-heros.shtml#L'interface

du site Web officiel de Navi est illustrée dans la figure. De toute évidence, une petite image représente un héros. Notre objectif est d'explorer tous les skins de chacun héros Toutes les images sont téléchargées et enregistrées localement.

page secondaire

La page ci-dessus s'appelle la page principale, et la page secondaire est la page correspondant à chaque héros. Prenons l'exemple de la Dame noire. Sa page secondaire est la suivante :

On peut voir qu'il y a beaucoup de petites images, chaque Zhang Xiaotu correspond à un skin, et l'interface de données du skin est visualisée à travers le réseau, comme le montre la figure suivante :

Nous savons que les informations sur le skin sont transmises sous forme de chaîne au format json, il suffit alors de trouver l'id correspondant à chaque héros, et trouvez le fichier json correspondant, extrayez les données requises pour obtenir des fonds d'écran de peau haute définition.

Ensuite l'adresse du fichier du json de la fille noire ici est :

hero_one = 'https://game.gtimg.cn/images/lol/act/img/js/hero/1.js'

Les règles ici sont en fait très simples, l'adresse des données de skin de chaque héros est la suivante :

url = 'https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js'.format(id)

La question est donc quelle est la règle de l'identité ? Ici, l'identifiant du héros doit être affiché sur la page d'accueil, comme indiqué ci-dessous :

Nous pouvons voir deux listes [0,99], [100,156] , c'est-à-dire 156 héros, mais le heroId a été jusqu'à 240. ... On peut voir que c'est Il y a un certain modèle de changement, et il n'est pas ajouté un par un, donc pour explorer toutes les images de skin de héros, vous devez d'abord obtenir tous les heroIds.

3. Saisissez l'idée

Pourquoi utiliser le multithreading ? Expliquez ici. Lorsque nous explorons des données telles que des images et des vidéos, nous devons les enregistrer localement, nous utiliserons donc un grand nombre d'opérations de lecture et d'écriture de fichiers, c'est-à-dire des opérations d'E/S. Imaginez si nous effectuons une requête synchrone opérations ;

Ensuite, la deuxième requête ne sera pas effectuée tant que le fichier n'est pas enregistré localement après la fin de la première requête, ce qui est très inefficace. Si le multi-threading est utilisé pour les opérations asynchrones, l'efficacité sera grandement améliorée.

Par conséquent, il est nécessaire d'utiliser le multi-threading ou le multi-processus, puis de lancer autant de files d'attente de données dans le pool de threads ou le pool de processus pour le traitement ;

En Python, le pool de processus multiprocessing Pool, multiprocessing.dummy est très utile.

  • multiprocessing.dummyModules : dummyles modules sont multithread ;
  • multiprocessingModule : multiprocessingest un multi-processus ;

multiprocessing.dummyLes API des modules et multiprocessingdes modules sont communes et le changement de code est plus flexible ;

Nous récupérons d'abord l'identifiant du héros dans un fichier de test demo.py.J'ai déjà écrit le code ici pour obtenir une liste d'identifiants de héros, qui peuvent être utilisés directement dans le fichier principal ;

demo.py

url = 'https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js'
res = requests.get(url,headers=headers)
res = res.content.decode('utf-8')
res_dict = json.loads(res)
heros = res_dict["hero"] # 156个hero信息
idList = []
for hero in heros:
    hero_id = hero["heroId"]
    idList.append(hero_id)
print(idList)

L'idList est obtenu comme suit :

idlist = [1,2,3,….,875,876,877] # L'identifiant du héros au milieu n'est pas affiché ici

URL construite : page = 'http://www.bizhi88.com/s/470/{}.html'.format(i)

Le i représente ici l'id, et la construction dynamique de l'url est effectuée ;

Ensuite, nous personnalisons deux fonctions, une pour explorer et analyser la page (spider), une pour télécharger des données (download), ouvrir le pool de threads et utiliser une boucle for pour construire une URL qui stocke les données json du skin du héros, et stockez-le dans une liste en tant que file d'attente d'url, utilisez la méthode pool.map() pour exécuter la fonction spider (crawler) ;

def map(self, fn, *iterables, timeout=None, chunksize=1):
    """Returns an iterator equivalent to map(fn, iter)”“”
# 这里我们的使用是:pool.map(spider,page) # spider:爬虫函数;page:url队列

Fonction : extrayez chaque élément de la liste en tant que paramètre de la fonction, créez un processus un par un et placez-le dans le pool de processus ;

Paramètre 1 : la fonction à exécuter ;

Paramètre 2 : itérateur, transmettez les nombres de l'itérateur en tant que paramètres dans la fonction à tour de rôle ;

Analyse des données JSON
insérez la description de l'image ici
Ici, nous allons analyser le fichier json de la fille de la peau sombre pour l'affichage. Le contenu que nous devons obtenir est 1.name, 2.skin_name, 3.mainImg , car nous avons constaté que le heroName est le même, donc nous mettons le nom du héros Comme nom du dossier skin du héros, il est facile à visualiser et à enregistrer;

item = {
    
    }
item['name'] = hero["heroName"]
item['skin_name'] = hero["name"]
if hero["mainImg"] == '':
   continue
item['imgLink'] = hero["mainImg"]

Il y a une remarque :

Certaines balises mainImg sont vides, nous devons donc ignorer, sinon, s'il s'agit d'un lien vide, une erreur sera signalée lors de la demande ;

4. Collecte de données

Importer des bibliothèques tierces associées

import requests # 请求
from multiprocessing.dummy import Pool as ThreadPool # 并发
import time # 效率
import os # 文件操作
import json # 解析

analyse des données de pages

def spider(url):
    res = requests.get(url, headers=headers)
    result = res.content.decode('utf-8')
    res_dict = json.loads(result)

    skins = res_dict["skins"]  # 15个hero信息
    print(len(skins))

    for index,hero in enumerate(skins): # 这里使用到enumerate获取下标,以便文件图片命名;
        item = {
    
    } # 字典对象
        item['name'] = hero["heroName"]
        item['skin_name'] = hero["name"]

        if hero["mainImg"] == '':
            continue
        item['imgLink'] = hero["mainImg"]
        print(item)

        download(index+1,item)

télécharger télécharger l'image

def download(index,contdict):
    name = contdict['name']
    path = "皮肤/" + name
    if not os.path.exists(path):
        os.makedirs(path)
    content = requests.get(contdict['imgLink'], headers=headers).content
    with open('./皮肤/' + name + '/' + contdict['skin_name'] + str(index) + '.jpg', 'wb') as f:
        f.write(content)

Ici, nous utilisons le module OS pour créer un dossier. Comme nous l'avons mentionné précédemment, la valeur du heroName de chaque héros est la même, nous pouvons donc créer un dossier et le nommer, ce qui est pratique pour la préservation de la peau (classification), puis le chemin du fichier image ici. Attention, une barre oblique de moins signalera une erreur.

fonction principale main()

def main(): 
    pool = ThreadPool(6)
    page = []
    for i in range(1,21):
        newpage = 'https://game.gtimg.cn/images/lol/act/img/js/hero/{}.js'.format(i)
        print(newpage)
        page.append(newpage)
    result = pool.map(spider, page)
    pool.close()
    pool.join()
    end = time.time()

illustrer:

  • Dans la fonction principale, nous préférons créer six pools de threads ;

  • Construisez dynamiquement 20 URL via la boucle for, essayons, 20 skins de héros, si vous les analysez tous, vous pouvez parcourir l'idList précédente, puis créer dynamiquement l'URL ;

  • Utilisez la fonction map() pour effectuer des opérations d'analyse et de stockage de données sur l'URL dans le pool de threads ;

  • Lorsque le pool de threads est fermé, le pool de threads n'est pas fermé, mais l'état passe à l'état où les éléments ne peuvent plus être insérés ;

5. Fonctionnement du programme

if __name__ == '__main__':
    main()

Les résultats sont les suivants :

bien sûr, seule une partie des images est interceptée ici, et un total de plus de 200 images ont été explorées, ce qui est généralement acceptable.

6. Résumé

Cette fois, nous avons utilisé le multi-threading pour explorer le fond d'écran haute définition de la peau du héros du site officiel de League of Legends. Parce que l'image implique des opérations IO, nous utilisons la méthode simultanée pour améliorer considérablement l'efficacité d'exécution du programme.

Bien sûr, le crawler n'a fait que le goûter. Cette fois, j'ai exploré les photos de skins de héros 20. Les amis intéressés peuvent explorer tous les skins et n'ont qu'à changer les éléments traversés par la liste d'id précédente.

Si vous souhaitez obtenir le code complet et le fond d'écran LOL de cet article, veuillez aimer le coin inférieur droit de cet article et ajouter Jiege WeChat : Hc220088 pour l'obtenir.


L'original n'est pas facile, le codage n'est pas facile. Si vous pensez que cet article vous est utile, veuillez aimer cet article, laisser un message ou le transférer, car ce sera ma motivation pour produire plus d'articles de haute qualité, merci !

⬇⬇⬇⬇⬇⬇⬇⬇

Je suppose que tu aimes

Origine blog.csdn.net/jake_tian/article/details/120882892
conseillé
Classement