鱼C论坛

 找回密码
 立即注册
查看: 777|回复: 7

借助两个鱼友的爬皮肤代码,写出来失败了,大佬帮忙看下

[复制链接]
发表于 2020-4-15 20:35:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
先看我整理的
# -*- coding: utf-8 -*-

import urllib.request
import json
import os

response = urllib.request.urlopen("https://pvp.qq.com/web201605/herolist.shtml")

hero_json = json.loads(response.read())
hero_num = len(hero_json)

for i in range(hero_num):

    # 文件夹不存在则创建
    if not os.path.exists('C:\\Users\\Administrator\\Desktop\\heroskin\\'):
        os.mkdir('C:\\Users\\Administrator\\Desktop\\heroskin\\')
    save_dir = 'C:\\Users\\Administrator\\Desktop\\heroskin\\' + hero_json[i]['cname'] + '\\'
    if not os.path.exists(save_dir):
        os.mkdir(save_dir)

    # 获取英雄皮肤列表
    skin_names = hero_json[i]['skin_name'].split('|')

    for cnt in range(len(skin_names)):
        save_file_name = save_dir + hero_json[i]['cname'] + '-' +skin_names[cnt] + '.jpg'
        skin_url = 'https://pvp.qq.com/web201605/herolist.shtml'+str(hero_json[i]['ename'])+ '/' +str(hero_json[i]['ename'])+'-bigskin-' + str(cnt+1) +'.jpg'

        if not os.path.exists(save_file_name):
            urllib.request.urlretrieve(skin_url, save_file_name)
这是报错的
Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\新皮肤.py", line 13, in <module>
    hero_json = json.loads(response.read())
  File "D:\Python38\lib\json\__init__.py", line 343, in loads
    s = s.decode(detect_encoding(s), 'surrogatepass')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcd in position 278: invalid continuation byte

我的目的是快速爬取王者荣耀所有英雄皮肤,支持持续更新,或者更新后修改网址,大佬可以详细教我么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-4-15 22:14:59 | 显示全部楼层
解码错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-17 19:51:40 | 显示全部楼层

求解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-26 21:32:32 | 显示全部楼层
import requests
import json

herolist = requests.get('https://pvp.qq.com/web201605/js/herolist.json').content.decode()
herolist = json.loads(herolist)
for hero in herolist:
    hero_number = hero["ename"]#英雄代号数字
    hero_name = hero["title"]#英雄名称
    skin_star_url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{}/{}-bigskin-{}.jpg'
    for i in range(5):#i为默认皮肤最大数量
        skin_url = skin_star_url.format(hero_number,hero_number,i)
        if requests.get(skin_url).status_code == 200:#考虑到由于部分英雄皮肤数量可能没有“i”这么多,会出现访问网址错误,所以我们只取能正常访问的网址
            skin_imge =requests.get(url = skin_url)
            with open(r'C:\Users\Administrator\Desktop\皮肤文件\%s%d.jpg'% (hero_name, i), 'ab') as f:#注意在桌面创建“皮肤文件”的文件夹
                f.write(skin_imge.content)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-26 21:37:39 | 显示全部楼层
皮肤的网址应该是:http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/【英雄的代号数字】/【英雄的代号数字】-bigskin-【第几个皮肤】.jpg
所以思路很简单,先找到所有的英雄的数字代号和皮肤数就可以直接爬取了。英雄的数字代号在源码或是https://pvp.qq.com/web201605/js/herolist.json等网址中均可得到。至于皮肤个数,由于皮肤数量不多,建议简单粗暴,直接开循环取值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-26 21:40:16 | 显示全部楼层
写出来了,但无法回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-26 21:41:18 | 显示全部楼层
import requests
import json

herolist = requests.get('https://pvp.qq.com/web201605/js/herolist.json').content.decode()
herolist = json.loads(herolist)
for hero in herolist:
    hero_number = hero["ename"]#英雄代号数字
    hero_name = hero["title"]#英雄名称
    skin_star_url = 'http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{}/{}-bigskin-{}.jpg'
    for i in range(5):#i为默认皮肤最大数量
        skin_url = skin_star_url.format(hero_number,hero_number,i)
        if requests.get(skin_url).status_code == 200:#考虑到由于部分英雄皮肤数量可能没有“i”这么多,会出现访问网址错误,所以我们只取能正常访问的网址
            skin_imge =requests.get(url = skin_url)
            with open(r'C:\Users\Administrator\Desktop\皮肤文件\%s%d.jpg'% (hero_name, i), 'ab') as f:#注意在桌面创建“皮肤文件”的文件夹
                f.write(skin_imge.content)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-26 21:44:47 | 显示全部楼层
皮肤的网址是 http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/【英雄数字代号】/【英雄数字代号】-bigskin-【第几个皮肤】.jpg。
所以,思路很简单,找到英雄数字代号和拥有的皮肤数量就可以爬取了。
英雄的数字代号我就不说了,很多的url均可取到,我是在https://pvp.qq.com/web201605/js/herolist.json这个网址取得。
英雄的皮肤数量,直接开个for循环,简单粗暴。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 23:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表