借助两个鱼友的爬皮肤代码,写出来失败了,大佬帮忙看下
先看我整理的# -*- 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
解码错误
求解 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) 皮肤的网址应该是:http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/【英雄的代号数字】/【英雄的代号数字】-bigskin-【第几个皮肤】.jpg
所以思路很简单,先找到所有的英雄的数字代号和皮肤数就可以直接爬取了。英雄的数字代号在源码或是https://pvp.qq.com/web201605/js/herolist.json等网址中均可得到。至于皮肤个数,由于皮肤数量不多,建议简单粗暴,直接开循环取值。 写出来了,但无法回复 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) 皮肤的网址是 http://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/【英雄数字代号】/【英雄数字代号】-bigskin-【第几个皮肤】.jpg。
所以,思路很简单,找到英雄数字代号和拥有的皮肤数量就可以爬取了。
英雄的数字代号我就不说了,很多的url均可取到,我是在https://pvp.qq.com/web201605/js/herolist.json这个网址取得。
英雄的皮肤数量,直接开个for循环,简单粗暴。
页:
[1]