王者荣耀爬虫(爬取每个英雄的皮肤图片)


前言

  • 抓取的重点是找到每个英雄对应的id编号




分析




接下来找英雄对应的id编号

代码

import requests
import re
import json
import os
import time

# 获取当前时间戳,用于计算爬虫爬取完毕消耗了多少时间
now = lambda: time.time()

# 请求头
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
    "Cookie": "pgv_pvid=120529985; pgv_pvi=8147644416; RK=iSx1Z7fSHW; ptcz=d094d0d03f513f6762a4c18a13ddae168782ec153f43b16b604723b27069d0a7; luin=o0894028891; lskey=000100008bc32936da345e2a5268733bf022b5be1613bd2600c10ad315c7559ff138e170f30e0dcd6a325a38; tvfe_boss_uuid=8f47030b9d8237f7; o_cookie=894028891; LW_sid=s116T01788a5f6T2U8I0j4F1K8; LW_uid=Z1q620M7a8E5G6b2m8p0R4U280; eas_sid=m1j6R057x88566P2Z8k074T2N7; eas_entry=https%3A%2F%2Fcn.bing.com%2F; pgv_si=s8425377792; PTTuserFirstTime=1607817600000; isHostDate=18609; isOsSysDate=18609; PTTosSysFirstTime=1607817600000; isOsDate=18609; PTTosFirstTime=1607817600000; pgv_info=ssid=s5339727114; ts_refer=cn.bing.com/; ts_uid=120529985; weekloop=0-0-0-51; ieg_ingame_userid=Qh3nEjEJwxHvg8utb4rT2AJKkM0fsWng; pvpqqcomrouteLine=index_herolist_herolist_herodetail_herodetail_herodetail_herodetail; ts_last=pvp.qq.com/web201605/herolist.shtml; PTTDate=1607856398243",
    "referer": "https://pvp.qq.com/"
}

# 解析函数,返回文本或者二进制或者None
def parse_url(url, get_b=False):
    try:
        response = requests.get(url, headers=headers)
        response.encoding = "gbk"
        assert response.status_code == 200
        if get_b == True:
            return response.content
        else:
            return response.text
    except:
        print("status_code != 200(from parse_url)")
        return None

# 处理单个英雄
def parse_hero_detail(id, name):
    # 保存所有皮肤图片的本地路径
    path = f"./英雄皮肤/{name}"
    if not os.path.exists(path):
        os.makedirs(path, exist_ok=True)

    # 因为不确定每个英雄有多少个皮肤,所以假设单个英雄一共请求10张皮肤,这样就不会出现皮肤缺少的情况
    for num in range(1, 11):
        # 单个英雄皮肤图片的url链接
        api_url = f"https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{id}/{id}-bigskin-{num}.jpg"

        # 如果返回None,则说明状态码不是200,即没有这个请求的皮肤
        b_data = parse_url(api_url, get_b=True)

        if b_data == None:
            print(f"{name} 一共有{num - 1}个皮肤")
            print("--------------------------------------------------")
            # 没有新的皮肤了,立即退出循环
            break

        img_path = f"{path}/demo{num}.jpg"
        if not os.path.exists(img_path):
            try:
                download_img(img_path, b_data)
            except:
                return
            print(f"{name} 第{num}张皮肤图片 下载完毕")

# 下载图片
def download_img(path, b_data):
    with open(path, "wb") as f:
        f.write(b_data)


def main():
    # 含有每个英雄对应的id、英雄名称的url
    api_url = "https://game.gtimg.cn/images/yxzj/web201706/js/heroid.js"
    text = parse_url(api_url)

    search_result = re.search('var module_exports = ({.*?})', text, re.S)
    hero_info_str = search_result.group(1)
    hero_info_str = re.sub("'", '"', hero_info_str)
    # 包含 所有英雄以及各自对应的id 的字典
    hero_info_dict = json.loads(hero_info_str)

    for hero in hero_info_dict:
        name, id = hero_info_dict[hero], hero
        print(name, id)
        parse_hero_detail(id, name)


if __name__ == '__main__':
    start = now()                       # 记录起始时间
    main()                              # 主函数
    print(f"耗时: {now() - start}")     # 计算爬虫执行完毕消耗的时间



运行演示

在这里插入图片描述


爬虫运行完毕结果展示(部分)

在这里插入图片描述


补充

  • 艾琳是空的,你们懂的
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容