Loline
受于一言的启发,利用今天一下午的时间利用flask建立了一个轻量级的RESTful API——Loline。其内容大抵是英雄联盟143位英雄的中英文绰号、名字和pick台词。
一开始要收集到所有英雄的全部台词的,发现收集这些东西真的很难。
中文名称及绰号
这个是在鹅厂联盟官网资料库收集的,因为用了不懂的技术,网页源代码里边没有要找的数据,自然也不能用简单的爬虫来做这些事。还是浏览器开发者工具帮了忙:在Elements一栏可以复制想要的数据,然后保存到本地文件,就可以用Beautiful Soup来提取数据了。这里提取到的是中英文名称及中文绰号,然后根据英文名称去下一步爬取英文绰号。
英文绰号
一开始去了拳头的开发网站,发现根本没有提供这种接口。后来发现在GamePedia的英雄详情页有需要的东西,但也仅仅是lol.qq.com的英文版(能用爬虫解决)。写好爬虫脚本,来回更改执行好几次才把英文绰号保存下来。
在GemaPedia-英雄联盟的主页仔细看了一下,也没找到英雄详细信息的入口,得在搜索栏搜索英雄的名字才能找到,例如:Teemo。
Pick台词
然后又是pick台词的收集工作,这是最令人头疼的地方。在百度云搜素引擎上找到了大多数英雄的Word版英雄台词,但因为建立日期比较早,有很多台词已经更改了,再加上处理量比较大、需求量不高,就暂时搁置了那个Word。但总得有点内容吧,就选定了Pick英雄的台词,大都是百度谷歌搜集而来。因为英雄改版重做等原因,有些已经不适用了,然后自己启动游戏训练模式,选好英雄听语音,然后立马关掉……不知道百度、谷歌、开关游戏多少次,才勉强把143位英雄的台词收集完。因为有的英雄台词不太熟悉,可能有的已经过时而没有更改,这就等到发现再说吧。
Api的使用
使用方法是同一言一样 ,你同样可以参照原文作者的方式,但只需要根据下方代码把themes/next/layout/_macro/sidebar.swig
中的id和Hitokoto的小标题改一下即可。
themes/next/layout/_scripts/commons.swig<script type="text/javascript"> $.get('http://149.129.113.178:5000/', function (data) { console.log('----------------------------------------') console.log(data) $('#loline-content').css('display', '').text(data.words); $('#loline-from').css('display', '').text('——' + data.title_zh+' '+data.name_zh); });
|
代码
收集数据的时候也写了不少的代码,但保存下来数据之后其中大多数已经没有用了,所以这里只贴出来了Flask的代码。需要请邮件联系获取 😄
import json import random from util import load_champions from flask import Flask, jsonify, abort, make_response, request
app = Flask(__name__) app.config['JSON_AS_ASCII'] = False champions = load_champions("data/champions.json")
@app.route('/', methods=['GET']) def index(): id_ = random.randint(1, len(champions)) print(id_) champion = list(filter(lambda t: t['id'] == id_, champions)) return jsonify(champion[0])
def after_requests(response): response.headers['Access-Control-Allow-Origin'] = '*' response.headers['Access-Control-Allow-Methods'] = 'GET' response.headers['Access-Control-Allow-Headers'] = 'Content-Type,Authorization' return response
@app.errorhandler(404) def not_found(error): return make_response(jsonify({'error': 'Not Found'}), 404)
if __name__ == '__main__': app.after_request(after_requests) app.run(debug=True)
|