見出し画像

スクレイピングで全プロ野球選手の画像データを取得する

1.使用言語・ライブラリ・環境

言語:Python3.9.10
標準ライブラリ:time
外部ライブラリ:BeautifulSoup4.10.0・requests2.27.1・selenium4.1.0
端末:mac book air (macOS Monterey 12.3)
エディタ:Visual Studio Code

2.抽出方法を考える

(1) NPB(日本野球機構)の選手一覧から画像を取得する

選手名をファイル名にして、画像データを自分のPCの所定フォルダに格納していきます。なお、NPBのホームページ上にも記載がありますが、掲載情報や画像の無断転載は禁止ですのでご留意ください。

(2) 選手一覧 > 球団 > 各選手情報 > 画像データ

球団・選手メニューの選手一覧ページを起点に、各球団ページ > 球団ごとの選手ページという順番に辿っていく感じです。

なお、各選手の詳細ページのURLが全部把握できれば、一つ一つBeautifulSoupを使って画像データのURLを取得することも可能です。
ですが、今回はseleniumを使って、リンクを辿っていく処理をchromedirverにやってもらうようにします。

seleniumは現在バージョン4ですが、僕は3の書き方しか知らず自分の勉強のためにあえてseleniumで書きました。

3.基本的なseleniumの使い方

ドキュメントや他の方の解説を見れば、詳細は分かりますので細かくは書きませんがざっくりいうと、以下が必要です。

(1)ChromeDriverをインストールする

自分のChromeのバージョンを確認の上、このサイトからインストールして好きなフォルダに格納します。

後で、seleniumを使う際に、ChromeDriverのファイルパスが必要になるので把握しておいてください。

自分のOSに合わせて選んでください

(2)seleniumをインストールする

pip install seleniumですが、僕はM1 macでminiforgeを利用しているのでconda install seleniumでインストールしました。

(3)seleniumをインポート、chromedriverをセット

何はともあれ書き出しは以下のようにします。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service as ChromeService

service = ChromeService(executable_path="/Users/nonstopiida/Documents/chromedriver/chromedriver")
driver = webdriver.Chrome(service=service)
driver.implicitly_wait(5)

・webdriverのインポート
seleniumライブラリからwebdriverをインポートします。

・Byのインポート
2行目でByをインストールしているのは、後々Webサイトの欲しい部分を削り取るためのものです。
seleniumのバージョン3でできていた、find_element_by_id("id属性")のような書き方はバージョン4だとエラーとなりますので、Byをインポートして利用する必要があります。

・Serviceのインポート
この書き方をしなくても処理はできるのですが、selenium3のノリで書くとexecutable_pathにPATHを渡してね?というWarningが出ます。

executable_pathは先ほどchromedriverを置いたフォルダパス+chromedriverの文字列を指定すればOKです。

・implicitly_wait
最後のimplicitly_waitについて少し触れると、seleniumではWebブラウザーごとのドライバー(今回はchromeドライバーを利用します)を使って、人がブラウザを操作するかのごとく処理を指示することができます。

RPAを利用したことがある方は少しイメージがつくかもしれません。

例えばボタンを押下した際に、すぐに次の処理を走らせてしまうとまだ画面が読み込み中で、次の処理がエラーとなってしまう可能性があります。
なので、一定間隔を空けることで順番に処理が実行できるように調整するためのものです。

(4) NPBのサイトの選手一覧ページから球団名を取得して出力する

例として、全球団名と各球団ページのURLを出力してみましょう。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service as ChromeService

service = ChromeService(executable_path="/Users/nonstopiida/Documents/chromedriver/chromedriver")
driver = webdriver.Chrome(service=service)
driver.implicitly_wait(5)

#ここから追記
driver.get("https://npb.jp/bis/teams/")

leagues = driver.find_elements(By.ID, 'team_list')

for league in leagues:
    teams = league.find_elements(By.TAG_NAME, 'a')
    for team in teams:
        print(team.text)
        print(team.get_attribute("href"))

以下のように出力されると思います。

(forscraping) nonstopiida@nonstopiidanoMacBook-Air Documents % python test.py
東京ヤクルトスワローズ
https://npb.jp/bis/teams/rst_s.html
阪神タイガース
https://npb.jp/bis/teams/rst_t.html
読売ジャイアンツ
https://npb.jp/bis/teams/rst_g.html
広島東洋カープ
https://npb.jp/bis/teams/rst_c.html
中日ドラゴンズ
https://npb.jp/bis/teams/rst_d.html
横浜DeNAベイスターズ
https://npb.jp/bis/teams/rst_db.html
オリックス・バファローズ
https://npb.jp/bis/teams/rst_b.html
千葉ロッテマリーンズ
https://npb.jp/bis/teams/rst_m.html
東北楽天ゴールデンイーグルス
https://npb.jp/bis/teams/rst_e.html
福岡ソフトバンクホークス
https://npb.jp/bis/teams/rst_h.html
北海道日本ハムファイターズ
https://npb.jp/bis/teams/rst_f.html
埼玉西武ライオンズ
https://npb.jp/bis/teams/rst_l.html

ポイント

・driver.get(url)で該当のページに遷移
・dirver.find_element(By.ID, 'id属性名')で任意のIDに該当する要素を一つ抽出
・driver.find_element(By.TAG_NAME, 'タグ名称')で任意のタグ要素を一つ抽出
・抽出したelement.textでテキスト要素を取得
・抽出したelement.get_attribute("属性名")で属性値を取得

ここまでで大体基本はOKです。
他にも知りたい方は、ぜひ公式のドキュメントを読んでみてください。(日本語もあるので読みやすいかと)

4.seleniumで選手名と画像を取得する

先ほどの各球団ごとのURLを使って、球団別の選手一覧から選手名・URLを取得します。

ここから先は

4,339字 / 2画像

¥ 500

この記事が気に入ったらサポートをしてみませんか?