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が終了しましたが、
とても面白い技術を習得することができました。
本当に基礎的ではありますが、すぐに応用できる技術をおしえてもらえました。
次回も楽しみです!
今西先生、本日も有難うございました!!
コメント