Python 無料で独習 Webスクレイピング入門 vol 02

Python
この記事は約6分で読めます。

Webページ内のテキストデータを自動で抽出(Selenium)

この講義は前回の
Python 無料で独習 Webスクレイピング入門 vol 01
をベースにというかその続きみたいなないようです。
ログインした後のページから情報を抽出します。

find_element_byを使い情報を取得

まずは講師名である今西航平さんを取得します。
chromeの画面で右クリック。
検証から検証ツールを起動。
矢印をクリックして調べたい場所をクリック。
すると
<td  id='name'>今西 航平</td>
を見つけることができたので

elem = browser.find_element_by_id('name')
elem.text
'今西 航平'
name = elem.text
type(name)
str

とするとelemというインスタンスを作成できます。
さらに.textとすると文字データを出力することができます。

同様に他の項目も取得します。

elem_company = browser.find_element_by_id('company')
company = elem_company.text

elem_cbirthday = browser.find_element_by_id('birthday')
cbirthday = elem_cbirthday.text

elem_come_from = browser.find_element_by_id('come_from')
come_from = elem_come_from.text

elem_hobby = browser.find_element_by_id('hobby')
hobby = elem_hobby.text

hobbyの項目だけ改行を意味する\nが入っているので
replaceメソッドで\nを,に変換します。

hobby = hobby.replace('\n',',')
hobby
'バスケットボール,読書,ガジェット集め'

for 文を使い一括で情報を取得

次は講師名などの項目名を取得していきます。
テーブルで作成れているものはフォーマットでできているので
for 文でとってくることができるそうです。
実際のhtmlを見てみると<th>のタグの中にあります。
なのでfind_element_by_tag_nameでタグから情報をとります。

elem_th = browser.find_element_by_tag_name('th')
elem_th.text
'講師名'

ところが今回の講師名以外に、所属企業、生年月日、出身なども
<th>の中にあります。
今回のメソッドはfind_elementと単数で取得しているので
最初の<th>のデータのみを取得しました。
これをfind_elementsとすると全ての<th>のデータを取得できます。

elems_th = browser.find_elements_by_tag_name('th')
elems_th
[<selenium.webdriver.remote.webelement.WebElement (session="2adf40985e5c82fb003a504a760912d5", element="66456e67-5dc1-49b3-b343-363395b205cd")>,
 <selenium.webdriver.remote.webelement.WebElement (session="2adf40985e5c82fb003a504a760912d5", element="5411190c-aadf-49ea-9464-ea957e966147")>,
 <selenium.webdriver.remote.webelement.WebElement (session="2adf40985e5c82fb003a504a760912d5", element="f457de9a-96a9-455e-8ea9-430d9d6e78bd")>,
 <selenium.webdriver.remote.webelement.WebElement (session="2adf40985e5c82fb003a504a760912d5", element="9ab35ab0-acfb-4df6-ba2e-6e80bef9f18b")>,
 <selenium.webdriver.remote.webelement.WebElement (session="2adf40985e5c82fb003a504a760912d5", element="9bfbec4b-0209-4433-a988-013321beedd3")>]

しっかりとリスト形式でデータを取得することができました。
リストなので[0]だと一番目、[1]だと二番目のデータをとれます。
そのデータに.textとすると項目名を取得できます。

elems_th[0].text
'講師名'

elems_th[1].text
'所属企業'

これをfor 文でまわしてみます。

for elem_th in elems_th:
    print(elem_th.text)

講師名
所属企業
生年月日
出身
趣味

すべての項目がちゃんととれました。

これをkeys = [] という空のリストを用意して
そこにappendで追加していきます。

keys = []
for elem_th in elems_th:
    key = elem_th.text
    keys.append(key)

keys
['講師名', '所属企業', '生年月日', '出身', '趣味']

先ほど一個づつ取得していた'株式会社キカガク'などの値は
<td>の中にあります。なので先ほどのfor文を使うことができます。

elems_td = browser.find_elements_by_tag_name('td')
values = []
for elem_td in elems_td:
    value = elem_td.text
    values.append(value)
values
values
['今西 航平', '株式会社キカガク', '1994年7月15日', '千葉県', 'バスケットボール\n読書\nガジェット集め']

csvに出力

#pandasをインポート
import pandas as pd

#空のデータフレーム作成
df = pd.DataFrame()

#カラム名を定義してそれそれに取得したリストを入れる
df['項目'] = keys
df['値'] = values

df

#indexを無くした形でcsv出力
df.to_csv('講師情報.csv', index=False)

以上でwebスクレイビング入門 vol.02が終了しましたが、
とても面白い技術を習得することができました。
本当に基礎的ではありますが、すぐに応用できる技術をおしえてもらえました。
次回も楽しみです!
今西先生、本日も有難うございました!!

コメント

タイトルとURLをコピーしました