资讯专栏INFORMATION COLUMN

Python实战---王者荣耀皮肤爬虫

zorro / 2444人阅读

摘要:文章目录方法方法作为王者荣耀的老玩家,今天教大家如何用爬虫获取王者荣耀皮肤本文将介绍两种王者荣耀皮肤的爬取方法,一种比较简单的,一种复杂的方法供大家学习。

文章目录


作为王者荣耀的老玩家,今天教大家如何用python爬虫获取王者荣耀皮肤

本文将介绍两种王者荣耀皮肤的爬取方法,一种比较简单的,一种复杂的方法供大家学习。
首先先进去王者荣耀官方网站:王者荣耀
进入开发者工具找到英雄皮肤所在位置,图中herolist.json就是我们需要找的英雄列表,包括英雄编号、英雄名称、影响类型、皮肤等信息,复制url:http://pvp.qq.com/web201605/js/herolist.json路径

方法1

见注释

# 导入所需要的模块import urllib.requestimport jsonimport os# 获取响应头文件  response = urllib.request.urlopen("http://pvp.qq.com/web201605/js/herolist.json")# 读取英雄列表,并存入hero_json中hero_json = json.loads(response.read())hero_num = len(hero_json)# 保存路径save_dir = "Dheroskin//"# 检查路劲是否存在,不存在则创建路径if not os.path.exists(save_dir): os.mkdir(save_dir)  for i in range(hero_num):  # 获取英雄皮肤列表  skin_names = hero_json[i]["skin_name"].split("|")  for cnt in range(len(skin_names)):   save_file_name = save_dir + str(hero_json[i]["ename"]) + "-" +hero_json[i]["cname"]+ "-" +skin_names[cnt] + ".jpg"   skin_url = "http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/"+str(hero_json[i]["ename"])+ "/" +str(hero_json[i]["ename"])+"-bigskin-" + str(cnt+1) +".jpg"   print(skin_url)# 检查图片文件是否存在,如果存在则跳过下载   if not os.path.exists(save_file_name):    urllib.request.urlretrieve(skin_url, save_file_name)

效果展示如下

方法2

见注释

import requestsimport reimport jsonimport osimport 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/"}# 解析函数,返回文本或者二进制或者Nonedef 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}")     # 计算爬虫执行完毕消耗的时间

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122430.html

相关文章

  • Python爬取"王者农药"英雄皮肤

    摘要:本篇就来教大家如何使用来爬取这些精美的英雄皮肤。有了英雄编号的对应关系,再找寻下英雄皮肤的链接规律。将图片保存下来,并以英雄名称皮肤序号方式命名效果展示最终的爬取效果如下图所示。 showImg(https://segmentfault.com/img/remote/1460000018627654); 0.引言 作为一款现象级游戏,王者荣耀,想必大家都玩过或听过,游戏里中各式各样的英...

    马龙驹 评论0 收藏0
  • 如何实现一个基本的微信文章分类器

    摘要:本文源地址,转发请注明该地址或地址,谢谢微信公众号发布的文章和一般门户网站的新闻文本类型有所不同,通常不能用现有的文本分类器直接对这些文章进行分类,不过文本分类的原理是相通的,本文以微信公众号文章为对象,介绍朴素贝叶斯分类器的实现过程。 本文源地址:http://www.fullstackyang.com/...,转发请注明该地址或segmentfault地址,谢谢! 微信公众号发布的...

    dackel 评论0 收藏0
  • 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0

发表评论

0条评论

zorro

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<