標籤:visio _id sel 曆史 text frame head img 過程
毫無疑問,誰將捧起世界盃是我們最關心的問題,小編作為一名“資深”球迷自然得發揮下自己的專長,用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‘[email protected]=‘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 continue102 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].text114 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 break128 129 df = pd.DataFrame(data, columns=[‘賽事‘, ‘時間‘, ‘主隊‘, ‘客隊‘, ‘主隊進球‘, ‘客隊進球‘, ‘國家隊名‘])130 131 return df132 133 if __name__ == "__main__":134 135 spider = Spider()136 137 # 第一步:抓2018世界盃球隊的ID。第二部:迴圈抓取每一支隊的比賽資料。138 139 spider.get_all_team_data()
進群:125240963 即可擷取源碼!
世界盃來了!看我大Python分析一波!四強會是哪是個國家!