哪里有足球比赛数据(使用Python抓取欧洲足球联赛数据)
更新时间:2022-09-02 13:44:32背景
Web Scraping
在大数据时代,一切都要用数据来说话,大数据处理的过程一般需要经过以下的几个步骤
- 数据的采集和获取
- 数据的清洗,抽取,变形和装载
- 数据的分析,探索和预测
- 数据的展现
其中首先要做的就是获取数据,并提炼出有效地数据,为下一步的分析做好准备。
数据的来源多种多样,以为我本身是足球爱好者,而世界杯就要来了,所以我就想提取欧洲联赛的数据来做一个分析。许多的网站都提供了详细的足球数据,例如:
- 网易 goal.sports.163/
- 腾讯体育 soccerdata.sports.qq/
- 虎扑体育 soccer.hupu/
- football-data.uk/
这些网站都提供了详细的足球数据,然而为了进一步的分析,我们希望数据以格式化的形式存储,那么如何把这些网站提供的网页数据转换成格式化的数据呢?这就要用到Web scraping的技术了。简单地说,Web Scraping就是从网站抽取信息, 通常利用程序来模拟人浏览网页的过程,发送http请求,从http响应中获得结果。
Web Scraping 注意事项
在抓取数据之前,要注意以下几点:
- 阅读网站有关数据的条款和约束条件,搞清楚数据的拥有权和使用限制
- 友好而礼貌,使用计算机发送请求的速度飞人类阅读可比,不要发送非常密集的大量请求以免造成服务器压力过大
- 因为网站经常会调整网页的结构,所以你之前写的Scraping代码,并不总是能够工作,可能需要经常调整
- 因为从网站抓取的数据可能存在不一致的情况,所以很有可能需要手工调整
Python Web Scraping 相关的库
Python提供了很便利的Web Scraping基础,有很多支持的库。这里列出一小部分
- BeautifulSoup crummy/software/BeautifulSoup/
- Scrapy scrapy/
- webscraping code.google/p/webscraping/
- pyquery pypi.python/pypi/pyquery
当然也不一定要用Python或者不一定要自己写代码,推荐关注import.io
Web Scraping 代码
下面,我们就一步步地用Python,从腾讯体育来抓取欧洲联赛13/14赛季的数据。
首先要安装Beautifulsoup
pip install beautifulsoup4
我们先从球员的数据开始抓取。
球员数据的Web请求是
soccerdata.sports.qq/playerSearch.aspx?lega=eplpn=2 ,返回的内容如下图所示:
该web服务有两个参数,lega表示是哪一个联赛,pn表示的是分页的页数。
首先我们先做一些初始化的准备工作
from urllib2 import urlopen import urlparse import bs4 BASE_URL = "soccerdata.sports.qq" PLAYER_LIST_QUERY = "/playerSearch.aspx?lega=%spn=%d" league = page_number_limit = 100 player_fields =
urlopen,urlparse,bs4是我们将要使用的Python库。
BASE_URL,PLAYER_LIST_QUERY,league,page_number_limit和player_fields是我们会用到的一些常量。
下面是抓取球员数据的具体代码:
def get_players(baseurl): html = urlopen(baseurl).read() soup = bs4.BeautifulSoup(html, "lxml") players = .name != 'th'] result = for player in players: record = link = '' query = for item in playerntents: if type(item) is bs4.element.Tag: if not item.string and item.img: record.append(item.img) else : record.append(item.string and item.string.strip() or 'na') try: o = urlparse.urlparse(item.a).query if len(link) == 0: link = o query = dict() for k,v in urlparse.parse_qs(o).items()]) except: pass if len(record) != 10: for i in range(0, 10 - len(record)): record.append('na') record.append(unicode(link,'utf-8')) record.append(unicode(query,'utf-8')) record.append(unicode(query,'utf-8')) record.append(unicode(query,'utf-8')) result.append(record) return result result = for url in : result = result get_players(url)
我们来看看抓取球员数据的详细过程:
首先我们定义了一个get_players方法,该方法会返回某一请求页面上所有球员的数据。为了得到所有的数据,我们通过一个for循环,因为要循环各个联赛,每个联赛又有多个分页,一般情况下是需要一个双重循环的:
for i in league: for j in range(0, 100): url = BASE_URL PLAYER_LIST_QUERY % (l,n) ## send request to url and do scraping
Python的list comprehension可以很方便的通过构造一个列表的方式来减少循环的层次。
另外Python还有一个很方便的语法来合并连个列表: list = list1 list2
好我们再看看如何使用BeautifulSoup来抓取网页中我们需要的内容。
首先调用urlopen读取对应url的内容,通常是一个html,用该html构造一个beautifulsoup对象。
beautifulsoup对象支持很多查找功能,也支持类似css的selector。通常如果有一个DOM对象是xx class='cc',我们使用以下方式来查找:
obj = soup.find("xx","cc")
另外一种常见的方式就是通过CSS的selector方式,在上述代码中,我们选择class=searchResult元素里面,所有的tr元素,过滤掉th也就是表头元素。
for dd in soup.select('.searchResult tr') if ddntents.name != 'th'
对于每一行记录tr,生成一条球员记录,并存放在一个列表中。所以我们就循环tr的内容trntents,获得对应的field内容。
对于每一个tr的content,我们先检查其类型是不是一个Tag,对于Tag类型有几种情况,一种是包含img的情况,我们需要取出球员的头像图片的网址。
另一种是包含了一个链接,指向其他数据内容
所以在代码中要分别处理这些不同的情况。
对于一个Tag对象,Tag.x可以获得他的子对象,Tag可以获得Tag的attribute的值。
所以用item.img可以获得item的子元素img的src属性。
对已包含链接的情况,我们通过urlparse来获取查询url中的参数。这里我们利用了dict comprehension的把查询参数放入一个dict中,然后添加到列表中。
dict() for k,v in urlparse.parse_qs(o).items()])
对于其它情况,我们使用Python 的and or表达式以确保当Tag的内容为空时,我们写入‘na’,该表达式类似C/C 或Java中的三元操作符 X ? A : B
然后有一段代码判断当前记录的长度是否大于10,不大于10则用空值填充,目的是避免一些不一致的地方。
if len(record) != 10: for i in range(0, 10 - len(record)): record.append('na')
最后,我们把query中的一些相关的参数如球员的id,球队的id,所在的联赛代码等加入到列表。
record.append(unicode(link,'utf-8')) record.append(unicode(query,'utf-8')) record.append(unicode(query,'utf-8')) record.append(unicode(query,'utf-8'))
最后我们把本页面所有球员的列表放入一个列表返回。
好了,现在我们拥有了一个包含所有球员的信息的列表,我们需要把它存下来,以进一步的处理,分析。通常,csv格式是一个常见的选择。
import csv def write_csv(filename, content, header = None): file = open(filename, "wb") file.write('\xEF\xBB\xBF') writer = csv.writer(file, delimiter=',') if header: writer.writerow(header) for row in content: encoderow = writer.writerow(encoderow) write_csv('players.csv',result,player_fields)
这里需要注意的就是关于encode的问题。因为我们使用的时utf-8的编码方式,在csv的文件头,需要写入\xEF\xBB\xBF,详见这篇文章
好了现在大功告成,抓取的csv如下图:
因为之前我们还抓取了球员本赛季的比赛详情,所以我们可以进一步的抓取所有球员每一场比赛的记录
抓取的代码如下
def get_player_match(url): html = urlopen(url).read() soup = bs4.BeautifulSoup(html, "lxml") matches = .name != 'th'] records = for item in : ## filter out the personal part record = for match in : if match.string: record.append(match.string) else: for d in : query = dict() for k,v in urlparse.parse_qs(d).items()]) record.append('teamid' in query and query or query) record.append(d.string and d.string or 'na') records.append(record) return records ##remove the first record as the header def get_players_match(playerlist, baseurl = BASE_URL '/player.aspx?'): result = for item in playerlist: url = baseurl item print url result = result get_player_match(url) return result match_fields = write_csv('m.csv',get_players_match(result),match_fields)
抓取的过程和之前类似。
下一步做什么
现在我们拥有了详细的欧洲联赛的数据,那么下一步要怎么做呢,我推荐大家把数据导入BI工具来做进一步的分析。有两个比较好的选择:
- Tableau Public
Tableau在数据可视化领域可谓无出其右,Tableau Public完全免费,用数据可视化来驱动数据的探索和分析,拥有非常好的用户体验
- Splunk
Splunk提供一个大数据的平台,主要面向机器数据。支持每天免费导入500M的数据,如果是个人学习,应该足够了。
当然你也可以用Excel。 另外大家如果有什么好的免费的数据分析的平台,欢迎交流。
相关推荐
-
电竞宣萱(“吃鸡”呆萌和书生组合果然是无敌,真的是钢枪组合,所向无敌)
查看详情
-
有名的足球队员号码(足球球衣号码代表人物,个个都是超级巨星,谁最强?)
查看详情
-
实况足球曼联时刻测评(实况足球:曼联传奇——吉格斯测评)
查看详情
-
迭戈-科斯塔将在今夏离开马竞(官方:马竞宣布与迭戈-科斯塔解约)
查看详情
-
2o18足球世界杯实况(《实况足球》——一首写给世界杯的情书(1998))
查看详情
-
世界杯预选赛直播男篮中国对巴(世界杯又来了!国足今晚首战马尔代夫)
查看详情
-
皮克就是罚款大户(皮克狂炸了赛场公开出言讽刺西甲主席 大嘴或被追加停赛)
查看详情
-
lol官网(10年前的LOL官网:只有40名英雄,那时候盖伦都还没上线)
查看详情
- 最新资讯
-
- 2022-11-18 有名的足球队员号码(足球球衣号码代表人物,个个都是超级巨星,谁最强?)
- 2022-11-15 2o18足球世界杯实况(《实况足球》——一首写给世界杯的情书(1998))
- 2022-11-15 世界杯预选赛直播男篮中国对巴(世界杯又来了!国足今晚首战马尔代夫)
- 2022-11-15 武汉0比1沧州(前线丨十人作战,绝不放弃,武汉队0:2憾负沧州雄狮)
- 2022-11-15 英格兰比利时2020(意大利VS英格兰:终极之战!这一冠双方都盼了53年)
- 2022-11-15 欧冠历届冠军一览图2021(「欧冠冠军」盘点2010-2022欧冠冠军 谁最强)
- 2022-11-15 中国网球(中国网球政策重大变革,你振奋吗?)
- 2022-11-15 2018世界杯西班牙红黄牌(世界杯红黄牌历史,齐达内,球王都是吃牌能手,巴西右闸黄牌最多)
- 2022-11-15 雷霆队队史最佳阵容组合(雷霆队历史十大球星,队史第一人是城市骄傲)
- 2022-11-15 中国vs日本篮球直播免费观看(央视直播!中国男篮VS日本队,胡金秋不在,能否冲击冠军?)
- 推荐攻略
-
-
乌克兰总统身亡(乌总统泽连斯基解除乌总检察长及国家安全局局长职务)
-
足球比赛每个半场多少分钟(足球比赛每半场几分钟)
-
2021中超今天哪里转播(今晚!中超2场对决,CCTV5 直播申花PK武汉,腾讯体育亚泰vs天津)
-
2022梅西坠机身亡事件结果(足坛变天!巴萨无缘榜首的2年:梅西告别,老马去世,2-8惨案)
-
2021全运会篮球直播赛程辽宁(4月22日央视直播:CBA总决赛;赵心童vs马奎尔,塞尔比vs颜丙涛)
-
中国最强导弹(世界洲际导弹前10排名,中国东风导弹领先美国,第一名堪称导弹王)
-
2021篮球比赛在哪里看(CCTV5直播NBA 辽篮争夺CBA总决赛冠军点 颜丙涛出战斯诺克世锦赛)
-
东航结果不敢公布了(民航局再次回应东航MU5735事故调查!查明原因有多难,多久公布?)
-