FIFA20のプレイヤーデータをWEBスクレイピング

# はじめに

今回はWEBスクレイピングをBeautifulSoup4を用いて行う。

何かと日々の業務の中で、WEBから情報を取ってくることは多く、またその情報をマニュアルに取得することは困難なことが多い。
また、機械学習のデータセットとして画像データなんかを用いる場合、スクレイピングを用いないとかなり厳しい気持ちになる。

そこで、サクッと欲しいデータを集めるために、WEBスクレイピングのHowToを学び、ここに備忘録としてまとめる。

# 環境

- MacOS
- Python3系
- BeautifulSoup4

# BeautifulSoup4のインストール

BeautifulSoup4はHTMLおよびXMLドキュメントを解析するためのPythonパッケージである。
HTMLタグなどを指定することで、その要素を取得してくれる。

インストールはpipにて行う。

```
bash$ pip3 install bs4
```

# スクレイピング

今回は世界で大人気のサッカーゲーム「FIFA２０」の全選手のデータをスクレイピングする。
取得先は[こちら](https://www.fifplay.com/fifa-20/players/?page=1)。

スクレイピングの際に用いるタグを特定するため、このページでHTMLの記述を確認する。

![スクリーンショット 2019-09-16 19.05.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253596/33e721fe-f3dd-be22-da15-cacfa37d2a94.png)

あーなんかこの辺なんだろうと思いながら、theadとtbodyを取ってくれば良さそうだなとあたりをつける。
そんでもって、ソースコードはこんな感じ。

```python:scraping.py

import requests
from bs4 import BeautifulSoup
import csv

# Getting header
def columns2csv(url, csv_write):
    res = requests.get(url)
    res.encoding = res.apparent_encoding

    soup = BeautifulSoup(res.text, "html.parser")
    
    # Getting tag
    theads = soup.find_all("thead")

    # Writing
    for thead in theads:
        head_data = []
        for head in thead.find_all("td"):
            head_data.append(head.get_text())
        csv_write.writerow(head_data)

# Getting body
def table2csv(url, csv_write):
    res = requests.get(url)
    res.encoding = res.apparent_encoding

    soup = BeautifulSoup(res.text, "html.parser")

    # Getting tag
    tbodys = soup.find_all("tr", class_="clickable")

    # Writing
    for tbody in tbodys:
        body_data = []
        for body in tbody.find_all("td"):
            body_data.append(body.get_text())
        csv_write.writerow(body_data)


# url, file_path
default_url = "https://www.fifplay.com/fifa-20/players/?page="
file_path = "tbl_fifa20.csv"

csv_file = open(file_path, 'wt', newline='', encoding='UTF-8')
csv_write = csv.writer(csv_file)

column_url = default_url+str(1)
columns2csv(column_url, csv_write)

# 414pages
for i in range(414):
    url = default_url + str(i+1)

    table2csv(url, csv_write)

csv_file.close()

```

簡単に説明すると、

- requestsモジュールで対象urlにGETを飛ばす。
- headerを取得する関数であるcolumns2csvでは、theadを指定する。
- bodyを取得する関数であるtable2csvでは、tbodyを指定する。
- bodyに関しては、全ページ（414ページ）分取得するために、forループ回してurlのページネーション記述部分を変更する。

という感じ。
このままではデータがちょっと汚いので、よしなにフォーマッティングする。

```python:data_format.py

import codecs

pos_list = ["GK", "CB", "RB", "LB", "RWB", "LWB", "CM", "CAM", "CDM", "RM", "LM", "ST", "CF", "RF", "LF", "RW", "LW"]


with codecs.open("tbl_fifa20.csv", "r", "UTF-8", "ignore") as f:
    s = f.read()

s = s.replace("\n","")
s = s.replace("Player,PAC", "Player,POS,PAC")

for pos in pos_list:
    s = s.replace(pos, "\",\""+pos)

with codecs.open("tbl_fifa20.csv", "w", "UTF-8", "ignore") as f:
    f.write(s)

```

最後に、出来上がったテーブルをpandasで読み込んで表示すると、

![スクリーンショット 2019-09-16 19.29.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253596/95d161d0-54f1-bc00-3ed9-6b0a61e279bc.png)

20663rows x 9columns

こんな感じでレジェンド選手を含めた、FIFA２０の全選手のデータテーブルが出来上がっていることがわかる。

# 終わりに

今回はスクレイピングのHowToをまとめることが目的であったため、記事としてはここで終わりである。
このように、WEBスクレイピングは、WEBにあるデータを高速かつもれなく取得する際に非常に有用である。

スクレイピングで得られたデータどう料理するか、ここから先が非常に重要で、サイエンスが必要である。

以上、スクレイピングのHowToでした。
みんなもスクレイピングで日々の業務の効率化だったり、機械学習のデータセット作成などエンジョイしてみよう！