Utilisez Python pour explorer les images de skin Glory (la question la plus élémentaire sur les reptiles, tutoriel sur le robot d'exploration Python, code super détaillé + complet)

avant-propos

Aujourd'hui, nous utilisons le langage python pour réaliser les photos de skin de tous les héros de la gloire, les télécharger et les sauvegarder localement, et le code complet se trouve à la fin de l'article.

1. Analyse de la pensée

analyse de site Web

On peut voir de nombreux héros sur le site officiel, chaque héros correspond à une page web, et la différence entre les URL de chaque page web est le numéro (vous pouvez aller voir), et la photo de skin que nous voulons grimper est à l'intérieur. À ce moment-là, j'ai deviné s'il y avait des règles à suivre dans la construction des URL des sites Web de héros. Après analyse, il s'est avéré qu'il n'y avait aucune règle à suivre, nous n'avions donc pas d'autre choix que d'explorer chaque site Web de héros à partir du site officiel. site Web, puis demandez-en chacun (une petite partie ne peut pas être explorée, on estime qu'elle est chargée de manière asynchrone), et l'image de la peau est obtenue.
insérer la description de l'image ici
insérer la description de l'image ici
Lorsque nous demandons le site Web Hero, les données explorées sont différentes des données de la page Web.
insérer la description de l'image ici
insérer la description de l'image ici
J'ai donc essayé de capturer le paquet et trouvé l'adresse de l'image de peau. Après analyse, j'ai trouvé que 518 (chaque page de héros a un numéro spécifique) représente un logo spécifique, 1 représente la première image de peau, 2 représente la première image de peau. , et 3 représente la première image de peau, et ainsi de suite (d'autres sont comme ça). insérer la description de l'image ici
Ensuite, il nous suffit de construire l'adresse de l'image de peau et d'envoyer une demande pour obtenir l'image, mais le problème revient, comment connaître le numéro de peaux ? ? Les skins des héros sont parfois plus et parfois moins, et ils ne sont pas uniformes. En effet, on peut constater que le nom du skin correspond à l'image du skin dans l'ordre, comme par exemple nom du héros 1 : photo 1 nom du héros 2 : photo 2 nom du héros 3 : image 3, et ainsi de suite, afin que nous puissions connaître le nombre d'images grâce au nom du héros et obtenir le nom correspondant pour chaque image, faisant d'une pierre deux coups. Parlons de l'idée du code
insérer la description de l'image ici

idée de code

Parcourez l'URL correspondant à chaque héros sur le site officiel, puis demandez une par une pour obtenir le nombre de photos de skin (vous ne savez pas combien d'adresses de photos de skin construire si vous ne connaissez pas le nombre de photos de skin) , après avoir créé l'adresse de l'image de peau, accédez une par une à la demande d'adresse de peau, obtenez l'image de peau et enregistrez l'image une par une. C'est tout pour le moment.

2. Configuration de l'environnement

# python+3.8.8
# requests  2.25.1
# parsel   1.6.0

# 安装
# pip install requests==2.25.1
# pip install parsel==1.6.0

# 如果觉得安装太慢,可以用镜像源
# pip install -i https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ requests==2.25.1
# pip install -i https://mirrors.tuna.tsinghua.edu.cn/help/pypi/ parsel==1.6.0

3. Code complet

import requests
import parsel
import os  # 内置库不需要安装
import re  # 内置库不需要安装
import logging  # 内置库不需要安装


# 发送请求
def get_url(url):
    headers = {
    
    
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
        'accept-language': 'zh-CN,zh;q=0.9',
        'pragma': 'no-cache',
        'referer': 'https://pvp.qq.com/',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36'}

    response = requests.get(url=url, headers=headers)
    # 获取网页编码,避免乱码
    response.encoding = response.apparent_encoding
    return response


# 解析数据
def parser_data(html_data, css_rule, css_1, css_2):
    # 传入html数据
    html = parsel.Selector(html_data)

    # 二次提取
    li = html.css(css_rule)

    data_list = []
    for i in li:
        # 获取英雄名(皮肤名)
        name = i.css(css_1).get()
        # 获取网页地址(图片地址)
        url_data = i.css(css_2).get()
        data_list.append([name, url_data])
    # [[],[],[]......]
    return data_list


def first_data(url):
    html_1 = get_url(url).text
    data_list = parser_data(html_1, '.herolist li', 'a::text', 'a::attr(href)')
    u = []
    for k in data_list:
        # 提取网址中的数字,后面构造图片地址用
        num = re.findall(r'\d+', k[1])[0]
        # 构造每一个英雄的网页地址
        url_ju = 'https://pvp.qq.com/web201605/' + k[1]
        # 替换原先的地址
        k[1] = url_ju
        k.append(num)
        u.append(k)
        print(k)
    # 返回形式[[],[],[],[].....]
    return u


def second_data(url_list):
    total = []

    for g in url_list:
        html_2 = get_url(g[1]).text
        # 皮肤名字爬取不到了,返回为None
        data = parser_data(html_2, '.pic-pf-list ', 'li p::text', '::attr(data-imgname)')
        # 将None值删除
        for y in data:
            y.remove(None)
        # 将英雄名和数字插入
        data[0].insert(0, g[0])
        data[0].insert(1, g[2])
        total.append(data)
        print(data)
    # [[],[],[],[]......]
    return total


def save_file(data, dir_name, file_name):
    '''

    :param data: 图片数据
    :param dir_name: 英雄的目录名
    :param file_name: 保存图片的文件名
    :return:
    '''
    if not os.path.exists('荣耀图片'):
        os.mkdir('荣耀图片')

    if not os.path.exists('王者图片\\' + dir_name):
        os.mkdir('荣耀图片\\' + dir_name)

    with open('荣耀图片\\' + dir_name + '\\' + file_name + '.jpg', mode='wb') as f:
        f.write(data)


# 去除特殊字符,返回集合
def del_str(data_str):
    name_list = []
    jpg_name = data_str.split('|')
    for h in jpg_name:
        t = h.replace('&', '')
        for number in range(10):
            t = t.replace(str(number), '')
        name_list.append(t)
    return name_list, len(name_list)


if __name__ == '__main__':
    # 设置输出的格式
    LOG_FORMAT = "时间:%(asctime)s - 日志等级:%(levelname)s - 日志信息:%(message)s"
    # 对logger进行配置——日志等级&输出格式
    logging.basicConfig(level=logging.INFO, format=LOG_FORMAT)
	
	# 官网地址!!!
    url = ''
    d = first_data(url)

    total_list = second_data(d)
    logging.info('总共' + str(len(total_list)) + '个英雄')
    logging.info('开始爬取图片')
    a = 1
    # 遍历每一条数据
    for n in total_list:
        # 计数 英雄数
        dir_name = str(a) + '.' + n[0][0]
        logging.info('正在爬取' + dir_name + '皮肤')
        # 特定的英雄id
        num_id = n[0][1]
        # 传入皮肤名 返回一个集合 ([皮肤名],皮肤数)
        name_num = del_str(n[0][-1])
        a += 1
        # 构建图片地址,并爬取,皮肤地址是从1开始
        for j in range(1, name_num[1] + 1):
            logging.info('正在爬取' + name_num[0][j - 1])
            jpg_url = f'https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{
      
      num_id}/{
      
      num_id}-bigskin-{
      
      j}.jpg'
            # 爬取皮肤图片
            jpg_content = get_url(jpg_url).content
            # 保存图片
            save_file(jpg_content, dir_name, name_num[0][j - 1])
            logging.info('已保存' + name_num[0][j - 1])
    logging.info(str(len(total_list)) + '个英雄' + '爬取完毕!')



Quatre. Résumé

Les images de peau rampante sont relativement basiques et conviennent aux débutants pour pratiquer l'exploration. Si vous escaladez trop d'images de peau, vous serez inversé et certaines d'entre elles ne pourront pas être explorées. Je me souviens que vous pouvez les escalader au début, mais vous ne pourrez plus les escalader après avoir rampé plusieurs fois. Vous pouvez essayez de changer l'adresse IP et de définir le délai. Ou utilisez du sélénium pour explorer.
S’il y a une erreur dans l’article, merci de me corriger, et enfin merci ! ! !

Je suppose que tu aimes

Origine blog.csdn.net/qq_65898266/article/details/124870582
conseillé
Classement