Colab: 自動抓取網路上的資料(by Beautiful Soup4)

Table of Contents

Table of Contents

當你需要在成千上萬的網站中搜集的資訊時,你會怎麼做呢?
一般常見的作法是手動地在網頁中複製想要內容,一但量大的時候,這種重複性工作很消耗人的意志。如果可以用電腦來完成是不是很棒呢?

實際上,除了網路搜索引擎之外,有許多的服務都利用電腦來在浩瀚的網路世界中無時無刻地搜集或是查找資料。
類似這樣在網路中搜集資料的應用就是俗稱的「網路爬蟲」。

本文將介紹一種在colab上製作簡單的網頁資料搜集的應用。把單純的搜尋+內容複製儲存的工作透過Python程式碼讓電腦幫我們來執行。

Youtube

實作案例:美國職棒隊伍的戰績資料

透過Python來自動完成保存美國職棒隊伍的戰績資料。
戰績資料可以在這個網站中取得。
注意:該資料網站的內容當然有可能會被變更,請視情況做修改。

為了完成這項任務,這次使用以下的程式庫:

  • Requests: 訪問網站
  • Beautiful Soup: 操作HTML文件
  • Pandas: 資料整理,輸出csv文件

Requests

是一個可以傳送HTTP/1.1的Python程式庫。
相當地簡單且實用,所以本次實作用它來訪問網站。

Beautiful Soup

Beautiful Soup是一個可以從HTML或XML文件中提取資料的Python程式庫。
藉由這個程式庫,在網頁中找尋特定文字或是區塊變得十分簡單。

Pandas

資料處理的Python程式庫。
資料處理不可或缺的好用工具,本實作用它來產生csv檔案。

介紹完了使用的程式庫後,馬上來說明實作的部分。

實作

流程上來說,可以分成以下的步驟。

  1. 發送HTTP請求,取得網頁的內容
  2. 分析網頁,取得特定的情報
  3. 處理以及整理情報
  4. 將整理好的資料保存起來。(這次是將資料存成csv檔案。)

發送HTTP請求,取得網頁的內容

sportUrl = "https://s5.sir.sportradar.com/taiwansportslottery/zht/3/season/79507"
sportResponse = requests.get(sportUrl)
sportSoup = BeautifulSoup(sportResponse.text, 'html.parser')

利用requests發送get請求來取得網頁的內容後,用BeautifulSoup來處理所取得的網頁內容。

分析網頁,取得特定的情報

table = sportSoup.select_one('.panel-body .visible-md-up .table')

可以透過瀏覽器去定位出想要的資料。通常用html tag, css class 的組合可以大致定位出來。
戰績的資料是html中的一個table,其位置為.panel-body .visible-md-up .table。 這個位置一但確定後,可以繼續對其內部的資料做處理。

比方說,下面的程式碼可以把所有欄位名稱都顯示出來。

headThs = table.select('thead tr th')
heads = [th.text for th in headThs]
heads

# output:
# ['位置#',
#  '球隊隊伍',
#  '勝',
#  '負',
#  '勝率',
#  '勝差',
#  '淘汰數字',
#  '外卡勝差',
#  '近10場戰績',
#  '近期連勝敗',
#  '淨勝球(分)',
#  '主',
#  '客']

或者,像下面這樣也可以把表中的總行數計算出來。

bodyTr = table.select('tbody tr')
len(bodyTr)

# output:
# 30

處理以及整理情報

接下來進入主題,把每一行的所有情報都整理成dict的列表。
使用迴圈的方式去處理每一行的情報。

tBodyData = []
for tr in bodyTr:
  # [td.text for td in tr.select('td')]
  trData = {}
  for index, td in enumerate(tr.select('td')):
    if index == 1:
      # name
      text = td.text
      # print(heads[index])
      trData[heads[index]] = text[: len(text)//2]
    else:
      # others
      trData[heads[index]] = td.text
  tBodyData.append(trData)
tBodyData

# output:
# [{'主': '51-26',
#   '位置#': '1',
#   '勝': '104',
#   '勝差': '-',
#   '勝率': '0.658',
#   '外卡勝差': '0.00',
#   '客': '53-28',
#   '淘汰數字': '-',
#   '淨勝球(分)': '0',
#   '球隊隊伍': '舊金山巨人',
#   '負': '54',
#   '近10場戰績': '8-2',
#   '近期連勝敗': '連勝 5'},
#  {'主': '54-23',
#   '位置#': '2',
#   '勝': '102',
#   '勝差': '2.0',
#   '勝率': '0.646',
#   '外卡勝差': '0.00',
#   '客': '48-33',
#   '淘汰數字': '3',
#   '淨勝球(分)': '0',
#   '球隊隊伍': '洛杉磯道奇',
#   '負': '56',
#   '近10場戰績': '8-2',
#   '近期連勝敗': '連勝 3'},
#   ...(省略)
# ]

處理完後,可以透過Pandas來查看內容。

df = pd.DataFrame.from_dict(tBodyData)
df

# output:
#    位置# 球隊隊伍    勝   負  勝率   勝差 淘汰數字  外卡勝差  近10場戰績  近期連勝敗  淨勝球(分)  主     客
# 0   1   舊金山巨人  104  54  0.658  -     -      0.00      8-2        連勝5      0     51-26  53-28
# 1   2   洛杉磯道奇  102  56  0.646  2.0   3      0.00      8-2        連勝3      0     54-23  48-33
# ...

將整理好的資料保存起來

確認無誤後,就可以把處理完成的資料存成csv格式的檔案,這樣要用excel或是google spreadsheet來作業的話會非常方便。

df.to_csv('./table.csv', index=False)

成功後,可以更新查看一下運行Google Colab環境的資料夾,裡面會出現table.csv檔案。

參考資料

好,以上完成了這次實作的案例。
雖然Beautiful Soup的部分只有使用到一小部分,但已經能夠應付許多情形。
這次很簡單只有一個網頁,如果有10, 50, 或是上百的網頁時,透過程式自動幫忙執行時,我想會更能體會出自動化的魅力。