爬取思路:
1、首先分析是静态数据还是动态数据,HTML源码中找不到英雄页面的信息,所以是静态数据。
2、chrom调试抓包,找到皮肤信息所在的URL ,这里第一个英雄皮肤所在的URL为https://game.gtimg.cn/images/lol/act/img/js/hero/1.js
3、直接通过get请求来获取包含目的信息的json数据
4、从json数据中提取各个皮肤的url以及名称并保存下来。
5、到此为止,单个英雄的皮肤爬取成功。
6、分析发现不同英雄页面的url之间只是最后的编号不同,再次通过抓包来获取各个英雄的编号信息。
7、获取成功后对各个英雄的url进行拼接修改即可得到各个英雄的url。
#skin_url =https://game.gtimg.cn/images/lol/act/img/js/hero/1.js
import requests
import json
import csv
headers = {
"User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
skins_dic = dict()
url = "https://game.gtimg.cn/images/lol/act/img/js/hero/"
def get_skin(url):
res = requests.get(url, headers = headers)
# print(eval(res.text)) #????报错。
#因为json里边有些key值是没有加双引号,直接去掉双引号的话就会报变量为定义的错误
#二者是等价的 json转字典
# data = res.json()
data = json.loads(res.text)
sl = dict()
for sk in data["skins"]:
# 皮肤的key值为:mainImg
# 皮肤名字的Key值为:name
if(sk["mainImg"] != ""):
# print("skin_name:{},url:{}".format(sk["name"],sk["mainImg"]))
sl[sk["name"]] = sk["mainImg"]
skins_dic[data["skins"][0]["name"]] = sl.copy()
sl.clear()
sequence = []
def get_sequence():
url = "https://game.gtimg.cn/images/lol/act/img/js/heroList/hero_list.js"
res = requests.get(url,headers = headers)
res_dic = eval(res.text)
for se in res_dic["hero"]:
sequence.append(se['heroId'])
get_sequence()
#英雄ULR的连接并不是简单的id+编号,而是保存在一个新的接口中,要重新爬取
for i in sequence:
get_skin(url+str(i)+".js")
break
def documentimg(url,name):
res = requests.get(url, headers = headers)
file = open("C:\\Users\\孤桥\\Desktop\\项目\\爬虫皮肤下载\\{}.jpg".format(name),"wb")
file.write(res.content)
file.close()
#构建一个CSV文件,将爬到的皮肤记录一下
file = open("C:\\Users\\孤桥\\Desktop\\项目\\爬虫皮肤下载\\skin.csv","a",newline='')
file_csv = csv.writer(file)
file_csv.writerow(['英雄名称',"英雄皮肤","皮肤图片地址"])
def write_csv(heroname,skinname,url):
file_csv.writerow([heroname,skinname,url])
for i in skins_dic:
for j in skins_dic[i]:
# documentimg(skins_dic[i][j],j)
write_csv(i, j,skins_dic[i][j])
file.close()