开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 20684|回复: 5
收起左侧

[源码分享] Python爬某游戏人物皮肤

[复制链接]
结帖率:100% (2/2)
发表于 2022-7-1 08:51:00 | 显示全部楼层 |阅读模式   辽宁省沈阳市
本帖最后由 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
3.png
2.png

点评

感谢@914212053,易语言版本可以来这里:https://bbs.125.la/forum.php?mod=viewthread&tid=14736354&page=1&extra=#pid23776116   上海市上海市  发表于 2022-7-1 19:33
咋还有中文类命名   广东省东莞市  发表于 2022-7-1 11:04

评分

参与人数 2好评 +2 精币 +3 收起 理由
外星人群控 + 1 + 3 感谢,我等会给翻译成易语言
reveriexue + 1 支持开源~!感谢分享

查看全部评分

发表于 2022-7-1 13:47:03 | 显示全部楼层   山西省太原市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)
 楼主| 发表于 2022-7-1 13:36:20 | 显示全部楼层   辽宁省沈阳市
不是中文类名,是定义个变量 被论坛给处理了,
回复 支持 反对

使用道具 举报

发表于 2022-7-1 10:51:50 | 显示全部楼层   江苏省盐城市
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表