开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 20651|回复: 7
收起左侧

[源码分享] 云顶官方攻略卡组获取类.饭已经备好了自己写界面吧

[复制链接]
结帖率:0% (0/4)
发表于 2020-7-26 21:22:34 | 显示全部楼层 |阅读模式   江西省赣州市
最近在学习python 所以拿云顶官网练练手,还挺复杂的,看了之后肯定对你的爬虫技术有所提升!
有用记得多多点赞喔~

  1. import requests#这个需要自己 pip install requests 安装
  2. import json

  3. class TFT():#云顶攻略类
  4.     def __init__(self):
  5.         self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'}
  6.     def lol_unescape(self,t):  # "去掉转义字符这很蛋疼,研究了很久..如果还碰到其它的转义字符可以加上去
  7.         t = t.replace("'", "\'")
  8.         t = t.replace("</p>", "}")
  9.         t = t.replace("<p>", "")
  10.         t = t.replace("<\/p>", "")
  11.         return t
  12.     def maopao(self,list):  # 冒泡排序
  13.         length = len(list)
  14.         for i in range(length - 1):
  15.             for j in range(length - i - 1):
  16.                 if int(list[j]['sortID']) > int(list[j + 1]['sortID']):
  17.                     list[j], list[j + 1] = list[j + 1], list[j]
  18.         return list
  19.     def get_strategy(self,listID):#提取攻略 返回一个字典
  20.         # 访问攻略详情接口
  21.         res = requests.get("https://lol.qq.com/act/a2016Activity/data/ProdDetail_66_"+listID+".js", headers=self.headers)
  22.         text=take_middle_text(res.text,"var ProdDetail_66_"+listID+"=","}]}};")+"}]}}"
  23.         text =TFT.lol_unescape(self,text)
  24.         #转义成中文
  25.         j=json.loads(text)
  26.         #提取需要的数据
  27.         text=j['msg']['detail']['sProdDetail']
  28.         #这里单引号要替换成双引号,不然json不支持
  29.         text= text.replace("\'", """)
  30.         j=json.loads(text)
  31.         lineup_name=j['lineup_name']#卡组名
  32.         author_name=j['author_name']#作者名
  33.         hero_location=j['hero_location']#英雄站位 字典  'location'=站位坐标  'hero_id'=英雄id 'equipment_id'=装备 列表
  34.         early_heros=j['early_heros']#前期 列表
  35.         metaphase_heros=j['metaphase_heros']#中期 列表
  36.         if 'level_3_heros' in str(j):
  37.             level_3_heros = j['level_3_heros']  # 追3星英雄 列表
  38.         else:
  39.             level_3_heros =""
  40.         if 'hero_replace' in str(j):
  41.             hero_replace=j['hero_replace']#备选英雄 字典  'hero_id':英雄id,'replace_heros':英雄id
  42.         else:
  43.             hero_replace=""#备选英雄 字典  'hero_id':英雄id,'replace_heros':英雄id
  44.         #攻略文档
  45.         early_info=j['early_info']#早期过渡
  46.         d_time = j['d_time']#搜牌节奏
  47.         equipment_info = j['equipment_info']  #装备分析
  48.         location_info = j['location_info']  # 阵容站位
  49.         enemy_info = j['enemy_info']  # 克制分析
  50.         _time = j['_time']  # 更新时间
  51.         strategy = {'lineup_name':lineup_name,
  52.                     'author_name':author_name,
  53.                     'hero_location':hero_location,
  54.                     'early_heros':early_heros,
  55.                     "metaphase_heros":metaphase_heros,
  56.                     'level_3_heros':level_3_heros,
  57.                     'hero_replace':hero_replace,
  58.                     'early_info':early_info,
  59.                     'd_time':d_time,
  60.                     'equipment_info':equipment_info,
  61.                     'location_info':location_info,
  62.                     'enemy_info':enemy_info,
  63.                     "_time":_time}


  64.         return strategy
  65.     def get_lineName(self,setID):#获取卡组标题列表
  66.         res = requests.get("https://lol.qq.com/act/AutoCMS/publish/LOLAct/TFTLineup_set3/TFTLineup_set3_"+setID+".js",headers=self.headers)
  67.         text = take_middle_text(res.text,"(function(factory){if(typeof window.TFTLineup_set3_"+setID+"==='undefined'){window.TFTLineup_set3_"+setID+"=factory();}else{console.error('CMS Error: TFTLineup_set3_"+setID+" already defined.');}})(function(){return ",";});/")
  68.         j = json.loads(text)
  69.         return j['line_name']
  70.     def get_linelist(self):#返回最新卡组列表
  71.         res =requests.get("https://lol.qq.com/act/AutoCMS/publish/LOLAct/TFTlinelist_new_set3/TFTlinelist_new_set3.js", headers=self.headers)
  72.         text=take_middle_text(res.text,"(function(factory){if(typeof window.TFTlinelist_new_set3_List==='undefined'){window.TFTlinelist_new_set3_List=factory();}else{console.error('CMS Error: TFTlinelist_new_set3_List already defined.');}})(function(){return ",";});/")
  73.         j=json.loads(text)
  74.         linelist =[]
  75.         for i in j:
  76.             #创建一个字典
  77.             d=dict.fromkeys(('season', 'edition', 'quality', 'pub_time', "sortID", 'line_id', 'line_name'))
  78.             d['season'] = j[str(i)]["season"]  # 赛季
  79.             d['edition']=j[str(i)]["edition"]#版本号
  80.             d['quality']= j[str(i)]["quality"]  # 评级
  81.             d['pub_time']= j[str(i)]["pub_time"]  # 日期
  82.             d['sortID']= j[str(i)]["sortID"]  # 排序位置
  83.             d['line_id']=j[str(i)]["line_id"]#ID
  84.             d['extend'] = j[str(i)]["extend"]  # 是否上架
  85.             d['line_name']=TFT.get_lineName(self,i)#标题
  86.             if d['sortID'] != '' and d['extend'] =='1':#排除删除的卡组
  87.                 linelist.append(d)  # 存起来
  88.         return TFT.maopao(self,linelist)
  89.     def get_chess(self):#f获取所以棋子的资料,返回一个列表
  90.         res=requests.get("https://game.gtimg.cn/images/lol/act/img/tft/js/chess.js",headers=self.headers)
  91.         j=json.loads(res.text)
  92.         j=j['data']
  93.         chess=[]
  94.         for i in j:
  95.             d=dict.fromkeys(('chessId', 'title', 'name', 'displayName',
  96.                              "raceIds", 'raceIds', 'jobIds', 'price',
  97.                              'skillName', 'skillType', 'skillIntroduce',
  98.                              'skillDetail', 'magic', 'startMagic', 'armor',
  99.                              'spellBlock', 'attackMag', 'attackSpeed', 'attackRange', 'crit',
  100.                              'TFTID', 'recEquip', 'proStatus', 'races', 'jobs', 'attackData', 'lifeData'))
  101.             d['chessId'] = i['chessId']#棋子ID
  102.             d['title'] = i['title']#称呼
  103.             d['name'] = i['name']#头像图片编号
  104.             d['displayName'] = i['displayName']#名字
  105.             d['raceIds'] = i['raceIds']#种族
  106.             d['jobIds'] = i['jobIds']#职业
  107.             d['price'] = i['price']#费用
  108.             d['skillName'] = i['skillName']#技能名称
  109.             d['skillType'] = i['skillType']#技能类型
  110.             d['skillImage'] = i['skillImage']#技能图标
  111.             d['skillIntroduce'] = i['skillIntroduce']#技能简介
  112.             d['skillDetail'] = i['skillDetail']#技能细节
  113.             d['magic'] = i['magic']#法力值
  114.             d['startMagic'] = i['startMagic']#初始法力值
  115.             d['armor'] = i['armor']#护甲
  116.             d['spellBlock'] = i['spellBlock']#魔抗
  117.             d['attackMag'] = i['attackMag']#
  118.             d['attackSpeed'] = i['attackSpeed']#攻击速度
  119.             d['attackRange'] = i['attackRange']#攻击范围
  120.             d['crit'] = i['crit']#暴击
  121.             d['TFTID'] = i['TFTID']
  122.             d['recEquip'] = i['recEquip']#推荐装备
  123.             d['proStatus'] = i['proStatus']#最近状态 无 加强 虚弱
  124.             d['races'] = i['races']#种族
  125.             d['jobs'] = i['jobs']#职业
  126.             d['attackData'] = i['attackData']#攻击力
  127.             d['lifeData'] = i['lifeData']#生命值
  128.             chess.append(d)
  129.         return chess
  130.     def get_equip(self):#获取装资料返回一个列表
  131.         res=requests.get("https://game.gtimg.cn/images/lol/act/img/tft/js/equip.js",headers=self.headers)
  132.         j=json.loads(res.text)
  133.         j=j['data']
  134.         equip=[]
  135.         for i in j:
  136.             d=dict.fromkeys(('equipId','type','name','effect','keywords','formula','imagePath','TFTID','jobId'))
  137.             d['equipId'] = i['equipId']#id
  138.             d['type'] = i['type']#类型,大装备=2 小装备=1
  139.             d['name'] = i['name']#名字
  140.             d['effect'] = i['effect']#作用
  141.             d['keywords'] = i['keywords']#简介
  142.             d['formula'] = i['formula']#合成需要
  143.             d['imagePath'] = i['imagePath']#图标地址
  144.             d['TFTID'] = i['TFTID']
  145.             d['jobId'] = i['jobId']#职业 如果是有转职功能的,就会有职业不为0
  146.             equip.append(d)
  147.         return equip
  148.     def get_job(self):#获取所有的职业 返回一个列表
  149.         res=requests.get('https://game.gtimg.cn/images/lol/act/img/tft/js/job.js',headers=self.headers)
  150.         j=json.loads(res.text)
  151.         j=j['data']
  152.         job=[]
  153.         for i in j:
  154.             d=dict.fromkeys(('jobId','name','introduce','alias','level','TFTID','imagePath'))
  155.             d['jobId'] = i['jobId']#职业id
  156.             d['name'] = i['name']#名称
  157.             d['introduce'] = i['introduce']
  158.             d['alias'] = i['alias']
  159.             d['level'] = i['level']
  160.             d['TFTID'] = i['TFTID']
  161.             d['imagePath'] = i['imagePath']
  162.             job.append(d)
  163.         return job
  164.     def get_race(self):#获取所有的羁绊种族 返回一个列表
  165.         res=requests.get('https://game.gtimg.cn/images/lol/act/img/tft/js/race.js',headers=self.headers)
  166.         j=json.loads(res.text)
  167.         j=j['data']
  168.         race=[]
  169.         for i in j:
  170.             d=dict.fromkeys(('raceId','name','introduce','alias','level','TFTID','imagePath'))
  171.             d['raceId'] = i['raceId']#职业id
  172.             d['name'] = i['name']#名称
  173.             d['introduce'] = i['introduce']
  174.             d['alias'] = i['alias']
  175.             d['level'] = i['level']
  176.             d['TFTID'] = i['TFTID']
  177.             d['imagePath'] = i['imagePath']
  178.             race.append(d)
  179.         return race



  180. def take_middle_text(txt,txt_s,txt_e='',seeks=0,seeke=0):#取中间文本函数
  181.     try:
  182.         if txt_e or seeks or seeke:
  183.             pass
  184.         else:
  185.             raise 1
  186.         s_1 = txt.find(txt_s)
  187.         if s_1 == -1:
  188.             raise 1
  189.         l_1 = len(txt_s)
  190.         if txt_e:
  191.             s_2 = txt.find(txt_e,s_1)
  192.             if s_1 == -1 or s_2 == -1:
  193.                 return False
  194.             return txt[s_1+l_1:s_2]
  195.         if seeks:
  196.             return txt[s_1-seeks:s_1]
  197.         if seeke:
  198.             return txt[s_1+l_1:s_1+l_1+seeke]
  199.     except:
  200.         return '传参错误或未找到传参文本'
  201. def main():
  202.     tft = TFT()
  203.     #可以使用print(列表名)打印数据
  204.     chess = tft.get_chess()#获取所有的棋子数据 返回一个列表
  205.     equip = tft.get_equip()#获取所有的装备数据 返回一个列表
  206.     job = tft.get_job()#获取所有的职业数据 返回一个列表
  207.     race = tft.get_race()#获取所有的羁绊数据 返回一个列表
  208.     list = tft.get_linelist()
  209.     #演示推荐列表
  210.     for i in list:
  211.         #一个一个获取攻略数据
  212.         # 具体的调用字典的哪个key.请自己看函数里面的备注说明.要显示出来就需要自己写一个界面了.饭已做好,要自己拿筷子吃了 举一反三
  213.         strategy=tft.get_strategy(i['line_id'])
  214.         #这里演示的一些数据 还有N多数据,反正都已经获取到了
  215.         print(i['line_name'],strategy['author_name'],strategy['hero_location'])

  216. if __name__=="__main__":
  217.     main()
复制代码


TFT.zip (3.56 KB, 下载次数: 14)
结帖率:100% (25/25)

签到天数: 6 天

发表于 2020-8-2 20:07:43 | 显示全部楼层   湖北省孝感市
看看大佬是怎么做的
回复 支持 反对

使用道具 举报

结帖率:77% (34/44)

签到天数: 5 天

发表于 2020-7-31 12:08:22 | 显示全部楼层   陕西省宝鸡市
66666666666666瞅瞅再说
回复 支持 反对

使用道具 举报

签到天数: 13 天

发表于 2020-7-27 14:50:16 | 显示全部楼层   浙江省台州市
先谢楼主分享
回复 支持 反对

使用道具 举报

发表于 2020-7-27 14:46:49 | 显示全部楼层   吉林省四平市

回复 支持 反对

使用道具 举报

结帖率:50% (2/4)
发表于 2020-7-27 12:39:23 | 显示全部楼层   广西壮族自治区梧州市
可以可以支持一下
回复 支持 反对

使用道具 举报

结帖率:94% (15/16)

签到天数: 21 天

发表于 2020-7-26 22:28:58 | 显示全部楼层   广东省湛江市

学习一下,参考参考
回复 支持 反对

使用道具 举报

头像被屏蔽
结帖率:0% (0/1)
发表于 2020-7-26 21:40:27 | 显示全部楼层   江苏省宿迁市
学习一下,参考参考
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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