欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

爬虫基础(案例:爬取英雄联盟全皮肤)

程序员文章站 2022-06-05 18:53:49
...

爬取思路:
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()