1
0

More than 1 year has passed since last update.

初学者が勉強するSelenium。youtube動画に則り。エラー解決も。②

Last updated at Posted at 2022-06-30

はじめに

どうも。スクレイピング歴2日の初心者です。
本日もスクレイピングを勉強したので学習内容をQiitaにまとめます。
この続き 学習教材や開発環境は前頁と被るので省略致します。

本記事の趣旨

今回も動画通りに行っても2022年度のseleniumの記法変化によりエラーが発生する箇所を中心として進めていきます。その部分以外はさらっと。動画の方を確認して頂いて。

バックナンバー

学習

前回の復習
.tsx
#ブラウザの起動
browser = webdriver.Chrome("C:/****/****/Desktop/****/****/スクレイピング/chromedriver.exe")
#お好きなURLを指定してアクセス
url = "https://scraping-for-beginner.herokuapp.com/login_page"
browser.get(url)
sleep(4)         #ここでスリープ位入れときますか


#1 どの場所に  2 どんな操作を行いたいか
elem_username = browser.find_element('id',"username")      #この場所に
elem_username.send_keys('imanishi')                        #このようなキーを送る

elem_pass = browser.find_element('id',"password")          #この場所に
elem_pass.send_keys('kohei')                               #このようなキーを送る

elem_click = browser.find_element('id',"login-btn")        #この場所に
elem_click.click()                                         #このような操作を行うクリック

閉じるときはこう。

.tsx
browser.quit()

今回の内容

  • テキスト情報を取得する。
  • テキスト情報を効率よく取得する。
  • それらをCSVにて出力する。
テキスト情報を取得する。
前回の復習 でのコードを実行できる環境を作ってください。 それを前提に進めます。
.tsx
elem_name = browser.find_element('id',"name")               #この場所に
elem_name.text 

elem_company = browser.find_element('id',"company")          #この場所に
elem_company.text 

elem_birthday = browser.find_element('id',"birthday")        #この場所に
elem_birthday.text 

elem_hobby = browser.find_element('id',"hobby")              #この場所に

動画とは記法が異なりますが、前qiita記事にて扱った訂正箇所を応用してこのように情報を取得する事ができます。 動画の41分50秒辺り。

.tsx
print(elem_name.text ,elem_company.text ,elem_birthday.text ,elem_hobby.text)

#結果
#今西 航平 株式会社キカガク 1994年7月15日 バスケットボール
#読書
#ガジェット集め

この調子で手作業でコード入力すると、テキスト情報を取得することができますが、もう少し効率の良いやり方はないのでしょうか?

テキスト情報を効率よく取得する。

因みに複数形にすると一気に情報を取得する事が出来ます。
検証を用いて観察すると、「th」というTagに欲しい情報がありそう。
2022-06-29_22h29_33.png

.tsx
elem_keys = browser.find_elements(by="tag name", value="th")
elem_keys
#結果
[<selenium.webdriver.remote.webelement.WebElement (session="cfc3f9b32dc24af2a07271c3fe294899", element="3f9d5d34-6a6e-4683-9fe4-b38393c19fdb")>,
 <selenium.webdriver.remote.webelement.WebElement (session="cfc3f9b32dc24af2a07271c3fe294899", element="6177635c-b770-41cc-9ab9-2a1a336b8ec1")>,
 <selenium.webdriver.remote.webelement.WebElement (session="cfc3f9b32dc24af2a07271c3fe294899", element="04f2b519-ec5e-424c-8a13-28eb9fb7f8b2")>,
 <selenium.webdriver.remote.webelement.WebElement (session="cfc3f9b32dc24af2a07271c3fe294899", element="e79cf174-6f91-408e-a07c-04f3820ac85c")>,
 <selenium.webdriver.remote.webelement.WebElement (session="cfc3f9b32dc24af2a07271c3fe294899", element="0cf82e55-1021-42bf-836e-59093f2dcfcc")>]

こうすると取得する事が出来る。⇒動画の48分辺り。

これは2022年度で記法が変更したやり方。動画の通りに行うとエラーになります。

これで各々取得した情報を確認する事が出来ます。.find_elements。複数系ですからね。

取得した情報を確認するには.textでテキスト化する必要があります。

.tsx
elem_keys[2].text

#'生年月日'

thでkeyが取れたので今度はtdで同じことを行いましょう。
2022-06-29_17h11_03.png

.tsx
elem_values = browser.find_elements(by="tag name", value="td")
#結果

.tsx
elem_values[2].text
#'1994年7月15日'

なるほど、このようにして値を確認するのですね。ちまちま。
…察しがいい方なら気づくと思いますが、サイトが同じような構造なら、for分で取ってくることもできるはずです。実装を試みましょう。

.tsx
for e in elements:
    print(e.text)
    
for v in elem_values:
    print(v.text)

.tsx
#結果
講師名
所属企業
生年月日
出身
趣味
今西 航平
株式会社キカガク
1994年7月15日
千葉県
バスケットボール
読書
ガジェット集め

リスト型にして情報を一括テキスト化しました。

しかしこれでは少し見にくい。なので辞書型にして確認してみましょう。

.tsx
#別パターン
keys =[]
for e in elements:
    key = e.text
    keys.append(key)
print(keys)


values = []
for elem_td in elem_values:
    value = elem_td.text
    values.append(value)
print(values)  
.tsx
['講師名', '所属企業', '生年月日', '出身', '趣味']
['今西 航平', '株式会社キカガク', '1994年7月15日', '千葉県', 'バスケットボール\n読書\nガジェット集め']

それでは一括取得した情報をcsvに出力してみましょう。

それらをCSVにて出力する。
このような手順に沿って行います。 - 空のdfを作成する。 - その中に取得した情報を格納する。 - csvに出力する。

空のdfを作成。

.tsx
import pandas as pd
df = pd.DataFrame()#この空のデータに入れてあげる

情報の格納。
dfに["項目"]というカラムを作成し、その中に要素を格納する。
valuesも同様。

.tsx
df["項目"] =keys
df[""] =values
df

2022-06-29_23h07_44.png

最後にcsv出力

.tsx
df.to_csv("C:/Users/****/Downloads/imanyu.csv",index=False)

csvに出力。
場所に指定⇒C:/Users/****/Downloads
名前の指定⇒imanyu.csv
index=False⇒ 手前のindexを削除。 詳しくは動画の59分に。

総まとめ

.tsx
#モジュールのインポート
!pip install selenium
from selenium import webdriver
from time import sleep
import pandas as pd

#ブラウザの起動成功
browser = webdriver.Chrome("C:/****/****/Desktop/****/****/スクレイピング/chromedriver.exe")
#お好きなURLを指定してアクセス
url = "https://scraping-for-beginner.herokuapp.com/login_page"
browser.get(url)
sleep(2)         #ここでスリープ位入れときますか


#1 どの場所に  2 どんな操作を行いたいか               #このパートは動画とは記法が異なるので注意して
elem_username = browser.find_element('id',"username")      #この場所に
elem_username.send_keys('imanishi')                        #このようなキーを送る

elem_pass = browser.find_element('id',"password")          #この場所に
elem_pass.send_keys('kohei')                               #このようなキーを送る

elem_click = browser.find_element('id',"login-btn")        #この場所に
elem_click.click()                                         #このような操作を行うクリック

sleep(2)  
    
#この場所の情報を取得する                   #このパートは動画とは記法が異なるので注意して    
elem_keys  = browser.find_elements(by="tag name", value="th")
elem_values = browser.find_elements(by="tag name", value="td")


#取得した情報を可視化つまり各々に.textを付与する。 for分を用いて一括処理を行うと効率的
keys =[]
for e in elem_keys:
    key = e.text
    keys.append(key)
print(keys)


values = []
for elem_td in elem_values:
    value = elem_td.text
    values.append(value)
print(values)  


#csvへの出力パート

df = pd.DataFrame()

df["項目"] =keys
df[""] =values
print(df)

#csv出力ここは動画とは記法が異なる私が普段使用している記法
df.to_csv("C:/****/****/Downloads/imanyu.csv",index=False)

感想。

少しついてこれなかった部分も時間をおいて復習したら少し理解に近づいたと思う。
記法の変更点を修正するのは大変だが、少しでも他の型にお役に立てれば。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0