首页 编程教程正文

js的简单分析爬取LOL皮肤

piaodoo 编程教程 2020-02-22 22:05:22 901 0 python教程

本文来源吾爱破解论坛

本帖最后由 niebaohua 于 2019-6-16 12:33 编辑



爬这个网站之前没去网上找,自己研究了几个小时,才搞定的。
写完之后,我去网上看看别人的思路,都是一样的思路。。。。
而且还是几年前的帖子。。。
没正式学过浏览器的调试,如有错误,请纠正,万分感谢。
对于这个网站,我们按照平常的爬取方式发现什么也获取不到, 也找不到有用的api
网页使用动态获取的
相关知识:
Step over next function call【单步跳过】 : 会跳到下一个断点


Step into next function call【单步进入】 : 会进入函数内部调试   


Step out of current function 【单步跳出】: 会跳出当前这个断点的函数                  LOL官网英雄列表




打开多个皮肤图片链接:https://ossweb-img.qq.com/images/lol/web201310/skin/big266003.jpg
266003
发现每个图片只有这几个数字是变动的, 其他都是固定的,所以只要找到这些id就行了

在英雄列表审查元素,查看每个英雄的超链接


图片1.png (39.29 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-16 09:43 上传


发现每个英雄 后面也是有一个id的,   
那来调试一下,看看这些英雄列表怎么生成的   先点击Source  

图片2.png (434.51 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-16 09:47 上传

  
   
  打上断点之后   F5刷新页面   

图片3.png (21.26 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-16 09:48 上传


点这里


图片4.png (98.82 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-16 09:49 上传



我们点几次之后发现会到这里,加载这个js我们直接复制链接,用浏览器直接打开,看看内容是什么

图片5.png (127.24 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-16 09:49 上传




我们会发现所有的英雄的资料都在data中,可是这里没有我们要的那几个随机数字的id
这里我们可以取的数据有title或者name作为我们要创建的文件夹还有英雄的id
关闭调试
我们随便点击一个英雄,
进入皮肤界面https://lol.qq.com/data/info-defail.shtml?id=Ahri我们分析网页之后发现,
只有这个id是变的,需要用到刚刚的那个js https://lol.qq.com/biz/hero/champion.js
js里面data中的英雄id 现在我们处于英雄皮肤的界面,进行调试和刚刚一样

图片6.png (292.52 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-16 09:53 上传


550行,582行打上断点,

会首先来到这里,传进去一个英雄的id

图片7.png (76.1 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-16 09:51 上传


这个时候继续上一步的点击会到这里

图片8.png (76.44 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-16 09:51 上传


我们用一个英雄id,拼接这个完整的js,然后用浏览器打开例如: https://lol.qq.com/biz/hero/Ahri.js

图片11.png (76.12 KB, 下载次数: 0)

下载附件  保存到相册

2019-6-16 09:57 上传


这里的skins,就是我们的皮肤列表,id为皮肤的idname为皮肤的名字,default为默认皮肤这样就完成了



爬虫思路:

      先提取champion.js, 获取所有英雄的id和名字,我们通过名字创建文件夹然后通过英雄id拼接js
      提取英雄.jsskins, 获取皮肤的id,和皮肤的name最后下载



[Python] 纯文本查看 复制代码
# -*- encoding: utf-8 -*-
"""
[url=home.php?mod=space&uid=267492]@file[/url]    : 英雄联盟skins.py
[url=home.php?mod=space&uid=238618]@Time[/url]    : 2019/6/12 0012 下午 17:53
[url=home.php?mod=space&uid=686208]@AuThor[/url]  : 年少、

@Software: PyCharm
"""
import requests
import re
import json
import os
import pprint

class LolSkins(object):
    def __init__(self):
        self.js_url = "http://lol.qq.com/biz/hero/%s.js"
        # self.hero_url = "https://lol.qq.com/web201310/js/herovideo.js"
        self.hero_url = "https://lol.qq.com/biz/hero/champion.js"
        self.pic_url = "http://ossweb-img.qq.com/images/lol/web201310/skin/big%s.jpg"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36"
        }
        self.hero_list = []
        self.json_datas = None
        self.path ="./lol"

    def get_hero_data(self):
        response = requests.get(self.hero_url, headers=self.headers).text
        # print(response)
        regex = re.compile(r'\"data\":(.*\W)+')
        datas = re.findall(regex, response)
        a = "{\"data\":" + datas[0][:-1]
        a = json.loads(a)['data']
        self.json_datas = json.loads(str(list(a.values())).replace("'", "\""))
        # pprint.pprint(self.json_datas)


        # for i in range(0,len(datas), 2):
        #     self.hero_list.append("{" + "".join(datas[i:i+2])[:-1] + "}")

    def download(self, id, name, path):
        res = requests.get(self.pic_url% id, headers=self.headers)
        if name == "default":
            name = "默认皮肤%s" % id
        name = name.replace("/", "")
        with open(path + name + ".jpg", 'wb') as f:
            f.write(res.content)
        print(name + "-----------------下载完成")



    def get_heroPic_id(self):
        # self.json_datas = json.loads(("{ \"datas\":" + str(self.hero_list) + "}").replace("'", "").replace("\\", ""))

        # print(len(self.json_datas['datas']))
        self.mkdir()
        for data in self.json_datas:
            url = self.js_url % data['id']
            res = requests.get(url, headers=self.headers).text
            regex = re.compile('"data"(.*\W)+')
            datas = '{"datas"' + re.findall(regex, res)[0][:-1]
            datas = json.loads(datas)
            for pic_data in datas['datas']['skins']:
                self.download(pic_data['id'], pic_data['name'], self.path + "/%s/" % data['name'])

    def mkdir(self):

        if not os.path.exists(self.path):
            os.mkdir(self.path)
        for dir in self.json_datas:
            if not os.path.exists(self.path + "/%s" %dir['name']):
                os.mkdir(self.path + "/%s" % dir['name'])
            else:
                pass




if __name__ == '__main__':
    lol = LolSkins()
    lol.get_hero_data()
    lol.get_heroPic_id()

正则表达式不擅长, 你们可以补充一下,让代码更简单嗨学网第一次发的那么长的帖子
壁纸:链接:https://pan.baidu.com/s/118DUlXpGBdv2TD0dnyqbCw 密码:ocp5
嗨学网

英雄联盟skins.txt

2019-6-16 12:25 上传

点击文件名下载附件

下载积分: 吾爱币 -1 CB

2.77 KB, 下载次数: 15, 下载积分: 吾爱币 -1 CB

这个是代码

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7504.html

搜索