概要
Jリーグの監督一覧のページから監督の名前一覧を取得する方法を説明します。
上記のページでは読みに関してはアルファベットの表記しか載っていませんが、名前の読み方や姓、名も同時に取得したかったので、それらについては後で目視で修正することを前提に、自動で変換します。
その方法についても合わせて説明します。
注意
スクレイピングは法律的な問題に抵触する可能性がある行為ですので、利用については各自の判断/責任でお願いします。(参考:スクレイピングは違法?3つの法律問題と対応策を弁護士が5分で解説)
環境
Google Colaboratory (2020年4月3日)
コード
Pythonのrequests
で取得したソースファイルをBeatifulSoup
で解析して取得します。
インデックスページから各頭文字の監督リストページのURLを一括取得し、各URLのアクセス先から、具体的な名前とアルファベット表記を抽出しています。
!pip install romkan#GoogleColaboratoryで動かすときは必要
from bs4 import BeautifulSoup
import requests
import time
import romkan
# Jリーグページのurl
base_url = "https://data.j-league.or.jp/"
index_page_id = "SFIX06/"
# htmlソースの取得とパース
html_text = requests.get(base_url+index_page_id).text
soup = BeautifulSoup(html_text,"lxml")
# ソースコードを見ながら情報を抽出するコードを考えて書く
# id=player-indexの要素内のthタグ要素をリストで取得する
link_elems = soup.find(id='player-index').find_all('th')
# 名前、アルファベット表記を格納するリストを宣言
directors = []
for link_elem in link_elems:
atag = link_elem.find('a')
if atag != None:
#特定の頭文字で始まる監督一覧ページへのリンク
link = atag.get('href')
html_text2 = requests.get(base_url+link).text
soup2 = BeautifulSoup(html_text2,"lxml")
#id=eventViewのtr要素に選手名が入っている
footballers = soup2.find(id='eventView').find_all('tr')
for footballer in footballers:
atag2 = footballer.find('a')
if atag2 == None: continue
name = atag2.string
#名前を表示している要素の次の兄弟要素がアルファベット表記
alpha = atag2.find_parent().find_next_sibling().string
#リストに追加
directors.append([name,alpha])
#進捗確認のための出力
print(name,alpha)
#サーバに負荷を与えないように1秒待機する
time.sleep(1)
katakana = "・ ーァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴ"
def is_kata(text):
return all([v in katakana for v in text.replace(' ','')])#スペースはあってもよい
directors_yomi = []
for v in directors:
name, alpha = v[0], v[1]
name_f = name.replace('\u3000',' ').replace(' ',' ').replace('・',' ')
if is_kata(name_f):
fullname = name_f
if '\u3000' in name:
first = name.split('\u3000')[0]
last = name.split('\u3000')[1]
#elif ' ' in name
else:
first = ''
last = fullname
else:
fullname = romkan.to_katakana(alpha)
if ' ' in fullname:
first = fullname.split(' ')[0]
last = fullname.split(' ')[1]
fullname = last+' '+ first
else:
first = ''
last = fullname
if is_kata(fullname) == False:
name = "#####"+name
directors_yomi.append([name,alpha,fullname,last,first])
print('\n'.join(['\t'.join(v) for v in directors_yomi]))