毫无疑问,谁将捧起世界杯是我们最关心的问题,小编作为一名“资深”球迷自然得发挥下自己的专长,用python模拟2018世界杯,先给大家解解渴。
前言
世界杯即将开打,一切都是未知数,不过整个赛程已定,我们可以完全按照赛程模拟全部64场比赛比分10000次,得出A~H组各自的出线形势、每支队伍进四强的概率、以及最终的夺冠概率。
数据采集
寻找有利资源和所要采集的网站,准备开始数据采集。这次采集以球探网为例:
首先找到32个国家各自的网站链接;然后分别进入32个链接,采集各自的比赛记录数据;
解析网站,构造大体思路,创建网络爬虫实施采集。由于该网站是静态网站,所以就很容易的对网站的采集,在采集的过程中,我们首先找到,每个国家球队的链接,建立国家球队链接和国家球队名,然后进行采集给定国家队页面的所有历史比赛的数据。
在寻找国家链接的时候请注意链接的准确性,球探网每一个球队都有一个独立的链接,比如巴西的id是778,链接地址就为:http://zq.win007.com/cn/team/CTeamSche/778.html,如果对链接的不放心,可以先将链接复制到浏览器中,看是否能够找到网页。
以下为数据采集详细代码:
1 from __future__ importprint_function, division
2
3 from selenium import webdriver
4
5 import pandas as pd
6
7 class Spider(object):
8
9 def __init__(self):
10
11 self.driver = webdriver.Chrome()
12
13 self.driver.implicitly_wait(30)
14
15 self.verificationErrors = []
16
17 self.accept_next_alert = True
18
19 def get_all_team_data(self):
20
21 # 先通过世界杯主页获取所有32只队的ID(构成球队URL)Python学习交流群:125240963,群内每天分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎各位小伙伴入群学习交流
22
23 self.get_team_ids()
24
25 # 循环采集每一支队的比赛数据
26
27 data = []
28
29 for i, [team_id, team_name] inenumerate(self.team_list):
30
31 print(i, team_id, team_name)
32
33 df =self.get_team_data(team_id, team_name)
34
35 data.append(df)
36
37 output = pd.concat(data)
38
39 output.reset_index(drop=True,inplace=True)
40
41 output.to_csv(‘data_2018WorldCup.csv‘,index=False, encoding=‘utf-8‘)
42
43 self.driver.close()
44
45 def get_team_ids(self):
46
47 main_url =‘http://zq.win007.com/cn/CupMatch/75.html‘
48
49 self.driver.get(main_url)
50
51 teams=self.driver.find_elements_by_xpath("//td[@style=‘ padding: 0px; border: 0px; font-style: italic; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; word-break: break-word; color: rgb(64, 128, 128);">#fff;text-align:left;‘]")
52
53 data = []
54
55 for team in teams:
56
57 team_id=
58
59 int(team.find_element_by_xpath(".//a").get_attribute(‘href‘).split(‘/‘)[-1].split(‘.‘)[0])
60
61 team_name =team.find_element_by_xpath(".//a").text
62
63 print(team_id, team_name)
64
65 data.append([team_id,team_name])
66
67 self.team_list = data
68
69 #self.team_list =pd.DataFrame(data, columns=[‘team_name‘, ‘team_id‘])
70
71 #self.team_list.to_excel(‘国家队ID.xlsx‘, index=False)
72
73 def get_team_data(self, team_id,team_name):
74
75 """获取一个国家队的比赛数据。TODO:没有实现翻页Python学习交流群:125240963,群内每天分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎各位小伙伴入群学习交流"""
76
77 url =‘http://zq.win007.com/cn/team/CTeamSche/%d.html‘%team_id
78
79 self.driver.get(url)
80
81 table=self.driver.find_element_by_xpath("//div[@id=‘Tech_schedule‘and@class=‘data‘]")
82
83 matches =table.find_elements_by_xpath(".//tr")
84
85 print(len(matches))
86
87 # 抓取比赛数据,并保存成DataFrame
88
89 data = []
90
91 for i, match inenumerate(matches):
92
93 if i == 0:
94
95 headers =match.find_elements_by_xpath(".//th")
96
97 h1, h2, h3, h4, h5 =headers[0].text, headers[1].text, headers[2].text, headers[3].text,headers[4].text
98
99 print(h1, h2, h3, h4, h5)
100
101 continue
102
103 try:
104
105 info =match.find_elements_by_xpath(".//td")
106
107 cup =str(info[0].text.encode(‘utf-8‘))
108
109 match_time =str(info[1].text.encode(‘utf-8‘))
110
111 home_team =str(info[2].text.encode(‘utf-8‘))
112
113 fts = info[3].text
114
115 #print(‘-‘, cup, ‘-‘)
116
117 fs_A,fs_B=int(fts.split(‘-‘)[0]),int(fts.split(‘-‘)[1])
118
119 away_team = str(info[4].text.encode(‘utf-8‘))
120
121 print(cup, match_time,home_team, away_team, fs_A, fs_B)
122
123 data.append([cup,match_time, home_team, away_team, fs_A, fs_B, team_name])
124
125 except:
126
127 break
128
129 df = pd.DataFrame(data, columns=[‘赛事‘, ‘时间‘, ‘主队‘, ‘客队‘, ‘主队进球‘, ‘客队进球‘, ‘国家队名‘])
130
131 return df
132
133 if __name__ == "__main__":
134
135 spider = Spider()
136
137 # 第一步:抓2018世界杯球队的ID。第二部:循环抓取每一支队的比赛数据。
138
139 spider.get_all_team_data()
进群:125240963 即可获取源码!