关于Python命令行的NBA文字直播小工具

Python09

关于Python命令行的NBA文字直播小工具,第1张

找了一圈NBA文字直播网站,发现手机版直播吧有现成的接口,直接返回json格式数据。那就是它了,听我慢慢道来。

首先在电脑浏览器打开手机版直播吧,我用的是chrome浏览器,在Network中可以看到,它不停地用GET方式请求http://bifen4m.qiumibao.com/json/list.htm,这个地址会返回当前正在进行的所有类型比赛的基本情况,根据其中的type字段过滤掉非NBA比赛就OK了。其中最重要的是ID字段,之后的所有操作都需要用到。返回的数据如下所示:

{

"code": "2760624",

"second": "10",

"list": [

{

"id": "96233",

"sdate": "2017-04-20",

"time": "10:30",

"url": "/zhibo/nba/2017/042096233.htm",

"type": "basketball",

"start": "2017-04-20 10:30",

"home_team": "勇士",

"visit_team": "开拓者",

"home_score": "106",

"visit_score": "81",

"period_cn": "第4节\n01:30",

"from": "dc.live",

"code": "373",

"update": "13:13:37",

"big_score_1": "",

"big_score_2": ""

},

... # 省略了其它比赛的信息

]}12345678910111213141516171819202122232425

获得所有正在进行的比赛ID后,点击某一场比赛,进入文字直播页面。首先请求http://dingshi4pc.qiumibao.com/livetext/data/cache/max_sid/XXXX/0.htm页面,其中XXXX是上一步获取的id,它会返回一个数字,即max_sid。然后判断该max_sid是否大于上次获取的该值,如果大于,表示有新的直播文字,否则表示没有。

如果max_sid大于上一次的值,通过请求http://bifen4pc2.qiumibao.com/json/XXXX/YYYY.htm(其中XXXX是今天的日期,格式为2017-04-20,YYYY是第一步中获取的id),返回这场比赛的基本情况,比如比分,是第几节等,如下所示:

{"id": "96233","home_team": "勇士","visit_team": "开拓者","home_score": "110","visit_score": "81","period_cn": "第4节结束",...}123456789

最后,就可以获取直播的文字了。请求http://dingshi4pc.qiumibao.com/livetext/data/cache/livetext/XXXX/0/lit_page_2/YYYY.htm(其中XXXX是比赛id,YYYY是max_sid),它会返回最新的直播文字,其中包括一条或多条直播文字,如下所示:

[

{"live_id": "8769977","live_text": "@仙女最库阿-:库里正负值最高32我去!!!!","home_score": "110","visit_score": "81","pid_text": "比赛结束",...

},... # 可能有多条直播文字]1234567891011

可以看到,该请求返回的信息中没有比赛剩余时间、主队和客队等信息,所以每次获取直播文字之前,需要多一次请求,获得比赛的基本信息。

基本流程就是这样,非常简单,一共就四个GET请求,返回四串json,用requests库请求,然后解析搞定。

先定义一个Match类,表示当前正在进行的每一场比赛。

# match.pyclass Match:

def __init__(self, **kwargs):

self.id = kwargs['id']

self.home_team = kwargs['home_team']

self.visit_team = kwargs['visit_team']

self.home_score = kwargs['home_score']

self.visit_score = kwargs['visit_score']

self.period_cn = kwargs['period_cn'].replace('\n', ' ')def __repr__(self):

return '{self.id} {self.home_team} {self.home_score} - {self.visit_score} {self.visit_team} {self.period_cn}'.format(self=self)12345678910111213

再定义一个TextLiving类,表示获取的每一条文字直播。

# text_living.pyclass TextLiving:

def __init__(self, match_info, **kwargs):

self.home_team = match_info['home_team']

self.visit_team = match_info['visit_team']

self.period_cn = match_info['period_cn']

self.live_text = kwargs['live_text']

self.home_score = kwargs['home_score']

self.visit_score = kwargs['visit_score']def __repr__(self):

return '{self.home_team} {self.home_score} - {self.visit_score} {self.visit_team} {self.period_cn}\n{self.live_text}\n{sep}'.format(self=self, sep='*'*60)12345678910111213

接着创建zhibo8_api.py模块,用于获取相关数据。

# 当前正在进行的比赛Living_Matches_Url = 'http://bifen4m.qiumibao.com/json/list.htm'# 某一场比赛当前的max_sidMatch_Max_Sid_Url = 'http://dingshi4pc.qiumibao.com/livetext/data/cache/max_sid/%s/0.htm'# 某一场比赛最新文字直播Match_Living_Text_Url = 'http://dingshi4pc.qiumibao.com/livetext/data/cache/livetext/%s/0/lit_page_2/%d.htm'# 某一场比赛当前的基本情况Match_Info_Url = 'http://bifen4pc2.qiumibao.com/json/%s/%s.htm'def get_living_matches():

response = requests.get(Living_Matches_Url)

result = json.loads(response.text)

matches = [Match(**match) for match in result['list'] if match['type'] == 'basketball' and match['period_cn'] != '完赛']return matchesdef get_match_max_sid(match_id):

response = requests.get(Match_Max_Sid_Url % match_id)if response.status_code == requests.codes.ok:return int(response.text)def get_match_living(match_id, max_sid):

# 先获取比赛的当前情况,再获取最新文字直播

match_info = get_match_info(match_id)

response = requests.get(Match_Living_Text_Url % (match_id, max_sid))

texts = []if response.status_code == requests.codes.ok:

result = json.loads(response.text)

texts = [TextLiving(match_info, **living) for living in result]return textsdef get_match_info(match_id):

today = datetime.now().strftime('%Y-%m-%d')

response = requests.get(Match_Info_Url % (today, match_id))

match_info = json.loads(response.text)return match_info123456789101112131415161718192021222324252627282930313233343536373839404142

最后,在main.py模块中启动程序,开始直播!

def get_living_matches():

matches = zhibo8_api.get_living_matches()for match in matches:

print(match)return matchesdef get_watch_match(matches):

match_id = input('请输入比赛ID:')for match in matches:if match.id == match_id:return matchelse:

print('输入的ID不正确')return Nonedef main_loop():

matches = get_living_matches()if len(matches) == 0:

print('当前没有比赛!!!')return

match = get_watch_match(matches)if not match:

print('没去找到该比赛')return

current_match_max_sid = -1

while True:

match_max_sid = zhibo8_api.get_match_max_sid(match.id)if not match_max_sid:

print('没有直播数据')return

if current_match_max_sid == match_max_sid:continue

current_match_max_sid = match_max_sid

text_livings = zhibo8_api.get_match_living(match.id, current_match_max_sid)for text in text_livings:

print(text)if __name__ == '__main__':

main_loop()

其实python非常适合初学者入门。相比较其他不少主流编程语言,有更好的可读性,因此上手相对容易。自带的各种模块加上丰富的第三方模块,免去了很多“重复造轮子”的工作,可以更快地写出东西。

我是真正零基础开始学Python的,从一开始的一窍不通,到3个月后成功搭建了一个动态网站(没有用任何框架)。相比于计算机大牛,我更加知道一个小白将会遇到什么坑,遇到哪些难点。我把我的学习过程写在下面,并附上在每个阶段的学习资料,希望对零基础的Python学习

想学习编程但不知如何开始的朋友。回答这类问题的人往往只是列出书单资源然后给出一个大致的方向。有些朋友一开始就扎入了理论学习的汪洋大海,从苦读类似《算法导论》开始,能够坚持读下来的寥寥无几,学习的积极性也被不断的挫败感消磨的所剩无几。可以加Python技术直播裙【三零四零五零七九九】 群里大佬生动的讲解可以让你思路更清晰,互动直播,遇到问题里面有大佬解答指导!

一直以来,编程对我而言是一种「黑魔法」般的存在。今年阿里月饼门,当很多人都参与到是非之争的时候,我更加着迷于程序员区区几行代码的脚本所展现出的威力,对于外行而言,这是超乎他们想象之外的某种能力——为什么我守在电脑面前盯着秒针然后拼命点击鼠标都不一定能抢到的礼物,程序员只需要提前花5分钟写3行代码就轻松搞定?

所以,我的心底深处一直都想变成这样的一位魔法师。今年的8月,刚好工作上想要开发一个基于微信的英语学习网站,借此机会,我决定好好学习一下编程。在此之前,我所有关于程序的知识仅仅来源于两部分,一是本科时期的C语言必修课,现在已经忘的一干二净,不过好歹我从中明白编程是怎么回事;第二部分是大概两年前由于工作关系学的一些Python,不过只是皮毛,现在忘的七七八八。

简单说,我的目标是建立一个网站,不过这个网站是动态的,也就是说它能识别谁登陆,然后对不同的人显示不同的内容。而当时的现实是,我完全不明白网页是如何显示出来的?譬如每个人登陆知乎的时候看到的是定制化的页面,后台是如何基于每个ID来组织出不同的页面的?所有我们看到的问题,回答,参与的评论在背后的服务器上是以一种什么样的形式存在的?又比如为什么有些页面只能在微信端打开,在电脑上就会出错?(不知道你有没有发现这一点)

当时我的心中充满了无数个类似的问号?当然如果你也是小白,一定有着同样的疑问。

好处是一开始就明确了学习的目的:Web建站。所以我的学习方案基本就是通过做项目学习,哪里不懂就解决哪里,边做边学习,不断推进。另外,由于知道很多成功的网站在用Python做服务器开发,比如知乎,所以我就自然选择了Python。

于是我就开始了我充满着挫败感和成就感的编程之路……

从8月到12月的四个月里,除去本来的工作,为了学习质量,我会保证平均每天4个小时的学习时间,周末也不例外。另外,所有的文档,问答都尽量看英文的,这可以帮你剩下大量的时间。12月13日,我做的网站上线了,3天时间大概有5000人访问了这个网站,我有时在后台看着日志,不免有些心潮喷涌,我想把自己的经验写下来,希望对于那些有心学习编程但无从下手的朋友提供一些帮助和鼓励。

现在回头看,我认为这一段时间的造轮子是提升编程能力最快的时候。比如为了写ORM,就必须去花很多时间学习SQL,去了解Python里面的metaclass,而如果用一个现成的框架,我很有可能偷懒不去关注某些细节。而不出问题还好,一旦出问题,我就只能跪。另外,造轮子迫使我在开始的时候就构思整个框架,因为我必须尽可能的考虑到所有的情况,于是就会不断的强迫自己完善知识体系,和别人的代码作对比从而改进自己的,这个过程充满了无尽的挫败感,但是得来的成就和快乐也是无可比拟的。

关于自学python

个人最大3点经验

1. 找一本浅显易懂,例程比较好的教程,从头到尾看下去。

不要看很多本,专注于一本。把里面的例程都手打一遍,搞懂为什么。我当时看的是《简明python教程》,不过这本书不是非常适合零基础初学者。

2. 去找一个实际项目练手。

我当时是因为要做一个网站,不得已要学python。这种条件下的效果比你平时学一门新语言要好很多。所以最好是要有真实的项目做。可以找几个同学一起做个网站之类。注意,真实项目不一定非要是商业项目,你写一个只是自己会用的博客网站也是真实项目,关键是要核心功能完整。

3.最好能找到一个已经会python的人。问他一点学习规划的建议(上知乎也是个途径),然后在遇到卡壳的地方找他指点。

这样会事半功倍。但是,要学会搜索,学会如何更好地提问。没人愿意帮你写作业或是回答“一搜便知”的问题。

然而,别人的经验未必能完全复制。比如我没有说的是,在自学python之前,我已在学校系统学习过其他的编程语言。

对于完全没有编程经验的初学者,在学习python的时候,面对的不仅仅是python这门语言,还需要面临“编程”的一些普遍问题,比如:

· 从零开始,不知道从何入手,找了本编程教材发现第二章开始就看不懂了

· 缺少计算机基础知识,被一些教程略过的“常识性”问题卡住

· 遇到问题不知道怎么寻找解决方案

· 看懂语法之后不知道拿来做什么,学完一阵子就又忘了

· 缺少数据结构、设计模式等编程基础知识,只能写出小的程序片段

所以除了前面说的3点经验,

给编程初学者的额外建议

1、首先要有信心。虽然可能你看了几个小时也没在屏幕上打出一个三角形,或者压根儿就没能把程序运行起来。但相信我,几乎所有程序员一开始都是这么折腾过来的。

2、选择合适的教程。有些书很经典,但未必适合你,可能你写了上万行代码之后再看它会比较好。

3、写代码,然后写更多的代码。光看教程,编不出程序。从书上的例程开始写,再写小程序片段,然后写完整的项目。

4、除了学习编程语言,也兼顾补一点计算机基础,和英语。

5、不但要学写代码,还要学会看代码,更要会调试代码。读懂你自己程序的报错信息。再去找些github上的程序,读懂别人的代码。

6、学会查官方文档,用好搜索引擎和开发者社区。

VIPCODE更划算。VIPCODE是北京未科教育科技有限公司旗下在线少儿编程教育品牌,专注于6-18岁青少年儿童编程教育,采用在线1对1、在线小班直播互动教学授课模式。python直播课北京VIPCODE更划算。Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。