H404 发表于 2020-4-15 20:35:17

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

先看我整理的
# -*- 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['cname'] + '\\'
    if not os.path.exists(save_dir):
      os.mkdir(save_dir)

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

    for cnt in range(len(skin_names)):
      save_file_name = save_dir + hero_json['cname'] + '-' +skin_names + '.jpg'
      skin_url = 'https://pvp.qq.com/web201605/herolist.shtml'+str(hero_json['ename'])+ '/' +str(hero_json['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

我的目的是快速爬取王者荣耀所有英雄皮肤,支持持续更新,或者更新后修改网址,大佬可以详细教我么

wuqramy 发表于 2020-4-15 22:14:59

解码错误

H404 发表于 2020-4-17 19:51:40

wuqramy 发表于 2020-4-15 22:14
解码错误

求解

可乐西瓜 发表于 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)

可乐西瓜 发表于 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等网址中均可得到。至于皮肤个数,由于皮肤数量不多,建议简单粗暴,直接开循环取值。

可乐西瓜 发表于 2020-4-26 21:40:16

写出来了,但无法回复

可乐西瓜 发表于 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)

可乐西瓜 发表于 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循环,简单粗暴。
页: [1]
查看完整版本: 借助两个鱼友的爬皮肤代码,写出来失败了,大佬帮忙看下