精易论坛

标题: Python爬某游戏人物皮肤 [打印本页]

作者: 814212053    时间: 2022-7-1 08:51
标题: Python爬某游戏人物皮肤
本帖最后由 814212053 于 2022-7-1 23:10 编辑

独学而无友,则孤陋而寡闻
互相学习才是进步的阶梯!

爬虫 之噜阿噜皮肤图片抓取


 ## 文中部分关键字被替换了,请参照下图修改!
## 文中部分关键字被替换了,请参照下图修改!

## 原创作品,转载请注明出处,欢迎各路朋友前来交流!
## 本脚本只用作学习交流,请勿给对方站点造成流量压力!

1.用到的模块


1.requests #网络请求模块
2.re #正则模块
3.json

2.难点说明


1.皮肤图片不是直接显示在页面中,通过js获取然后渲染出来的。
2.分析js代码,找到关键url

3.完整代码


import requests
import re
import json

class 噜阿噜HeroSkin:

    def __init__(self):
        # 通过抓包和js分析,得到下边两个url
        # 第一个是所有英雄的json列表
        # 第二个是分析js得出的皮肤文件url
        self.hero_index_url = 'https://game.gtimg.cn/images/噜阿噜/act/img/js/heroList/hero_list.js'
        self.skinBaseUrl = 'https://ossweb-img.qq.com/images/噜阿噜/web201310/skin/big'

    @staticmethod
    def get_hero_data_url(e_name, c_name):
        """
        根据英雄昵称,获取指定js
        """
        return f'https://噜阿噜.qq.com/biz/hero/{e_name}.js', c_name

    def get_hero_list(self):
        """
        获取所有英雄的json内容
        """
        res = requests.get(url=self.hero_index_url)
        res.encoding = 'gb2312'
        hero_list = res.json().get('hero')
        print('共', len(hero_list), '个英雄!')
        for name in hero_list:
            yield name.get('alias'), name.get('name')

    def get_hero_skin_id(self, e_name, c_name):
        """
        获取皮肤对应的id,通过正则匹配出来
        """
        url, c_name = self.get_hero_data_url(e_name, c_name)
        res = requests.get(url=url)
        if res.status_code == 200:
            try:
                hero = json.loads(re.search('(.*?=){2}({.*})', res.text).group(2))
                return hero.get('data').get('skins')
            except Exception as e:
                print(e)
                print(res.text)
        else:
            print('404--')
            return None

    def get_hero_skin_urls(self):
        num = 0
        for e_name, c_name in self.get_hero_list():
            num += 1

            skin_list = r.get_hero_skin_id(e_name, c_name)
            if skin_list:
                print('正在抓取第', num, f'位英雄【{c_name}】的皮肤 ,', '共:', len(skin_list), '个!')
                for i in skin_list:
                    yield self.skinBaseUrl + i.get('id') + '.jpg', c_name + i.get('id')
            else:
                print('404异常!!')

    @staticmethod
    def save_img(url, name):
        res = requests.get(url=url)
        # 这里如果是特殊皮肤,页面上是加载不出来的,返回404,不是脚本的原因,是他的网页本来就不能查看!
        if res.status_code == 200:
            with open('噜阿噜_img/' + name + '.jpg', 'wb') as f:
                f.write(res.content)
        else:
            pass

    def run(self):
        for url, name in r.get_hero_skin_urls():
            self.save_img(url, name)

if __name__ == '__main__':
    r = 噜阿噜HeroSkin()
    r.run()


VX截图_20220701134125.png (140.5 KB, 下载次数: 1)

VX截图_20220701134125.png

3.png (66.38 KB, 下载次数: 0)

3.png

2.png (111.33 KB, 下载次数: 0)

2.png

作者: reveriexue    时间: 2022-7-1 10:51

作者: 814212053    时间: 2022-7-1 13:36
不是中文类名,是定义个变量 被论坛给处理了,
作者: 王摇摆    时间: 2022-7-1 13:47
感谢分享




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4