はじめに
どうも。スクレイピング歴1日の初心者です。
本日スクレイピングを勉強したので学習内容をQiitaにまとめます。
コメントでの間違いの指摘はできるだけ早く修正したいです。
対象としている方々
pythonの初学者。for分と変数について少しでも理解がある方。
添付動画の流れについていける方。
この記事を書くきっかけ
- qiitaのmarkdownに慣れるため。
- ライティングスキル/表現力諸々の向上。
- 学習内容のアウトプット。
- 同じように学習している方の微力でも助けになる為。
バックナンバー
- 初学者が勉強するSelenium。①
- 初学者が勉強するSelenium。②
- seleniumはCopy_full_xpathで少し楽になる
- 初学者が勉強するBeautiful Soup①
- 初学者が勉強するBeautiful Soup②
- 初学者が勉強するBeautiful Soup②
- Beautiful Soupで画像を取得
- BeautifulSoupでURLを一括取得
- 複数ページにわたる情報の取得。スクレイピング。
- 複数に渡るページでの画像収集スクレイピング
学習教材。
youtubeで「スクレイピング」と検索すると真っ先に出てくると思います。
動画の完成度が高く、私はこのチャンネルでよく学習をしています。
開発環境
- Windows11
- jupyter lab
- selenium version 確認模索中。確認方法確率次第シェアします。
重要な結論
2022年現在、この動画のみで学習を最後まで進める事はできません。エラーで詰まります。
何故?
この動画は2020/12/19投稿されたもので現在は2022/06/28です。2年程経過しているので記法も
動画とは異なっているからです。
今回の目的の一つとして、このエラーの解決をシェアできればと思います。私もこのエラーに面喰い、多少なりとも時間が浪費してしまい、骨が折れました。同じような気持ちの方々の少しでも負担になればと…。
具体的にはどの部分?
学習の③をご覧ください。
学習
それでは動画に沿って学習を進めていきます。
①seleniumとsleepをインストール
!pip install selenium
from selenium import webdriver
from time import sleep
インストール確認が出来たらsleepをテストしてみます。
実行ボタンを押してから、2秒経過して実行されましたでしょうか?
sleep(2)
print("here")
②任意のブラウザを自動で立ち上げる。
目標: ①自動でブラウザを立ち上げる。 ②任意のURLにジャンプする。
順々に追っていきましょう。
準備:webdriverをインストールする。
上記動画で大変丁寧に解説していらっしゃいますのでそちらを参考にしていただければと思います。動画の3:11秒~11:00秒辺りまで。そちらは本記事のメインではないので悪しからずご了承下さい。
- ①自動でブラウザを立ち上げる。
# 自動でhromeが立ち上がります。
browser = webdriver.Chrome("C:/****/****/Desktop/****/****/スクレイピング/chromedriver.exe")
このスクレイピングファイルの中にipynbファイルとchromedriver.exeが格納されております。
- ②任意のURLにジャンプする
引数にお好きなURLを指定してください。今回はgoogleにジャンプします。
#googleにアクセスします。
browser.get("https://www.google.com/?hl=ja")
- ①②セクションのまとめ。
browser = webdriver.Chrome("C:/****/****/Desktop/****/****/スクレイピング/chromedriver.exe") #①
sleep(2)
browser.get("https://www.google.com/?hl=ja") #②
そしてこのように記載する事も可能です。
browser = webdriver.Chrome("C:/****/****/Desktop/****/****/スクレイピング/chromedriver.exe")
url = "https://scraping-for-beginner.herokuapp.com/login_page"
browser.get(url)
こうする事によりURLをいちいち()の中に入れなくて済むので幾ばくか楽ではないでしょうか。
①ブラウザを開いて、②ジャンプする。開発環境によっては間にsleepを入れても良いかも知れません。
ブラウザを閉じるには
browser.quit()
③自動でIDとPASSを指定の場所へ打ち込む。(エラー解決)
- 場所を指定。 どこに、
- 動作を指定。 何をするのか。(キーを打ち込むのか、クリックするのか。)
動画でいうと19分25秒~です。
前セクションまでのおさらい。
browser = webdriver.Chrome("C:/****/****/Desktop/****/****/スクレイピング/chromedriver.exe")
url = "https://scraping-for-beginner.herokuapp.com/login_page"
browser.get(url)
自動でブラウザが開かれたことが確認できましたでしょうか?
それでは順々に進めていきましょう。
- 場所を指定。
私はサイトの住所を指定するというイメージで行っています。
動画の通り、「検証」を利用します。 左クリック⇒検証
この部分も動画で丁寧に解説しているので私が改めて付け加える部分はございません。
20分15秒~ から参照してください。
- 動作を指定。
この部分が動画作成時と現在では記法が異なっております。
動画では下記のような記法でした。23分10秒辺り。
#1 どの場所に 2 どんな操作を行いたいか。
elem_username = browser.find_element_by_id("username") #この場所に
いかがでしょうか?私の場合はこのようなエラーが起こりました。
AttributeError: 'WebDriver' object has no attribute 'find_element_by_id'
エラー内容を鑑みるに、'find_element_by_id'というのが使用できないのかと思われます。
別方法として、こちらで試してみるとうまく行きました。
elem_username = browser.find_element('id',"username")
by_idが引数になっていますね。記法が変更された事が確認できます。
これを踏まえて、まとめのコードを記載致します。
#ブラウザの起動
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() #このような操作を行う。クリック。
更に応用として、send_keyの直前にelem_username.clear()
等を入力すると、
send_keyする前に記入された文字などがクリアーされます。
サイトによってはsend_keyする前に「名前を入力してください」「電話番号」のようにあらかじめ文字が入力されており、それらを消してから入力するパターンもありますよね。このような場合に使えます。
エラーの解決方法
私自身は大した事はしておりませんが、一応エラーの解決経緯を記しておきます。
- エラー発生、⇒ 'WebDriver' object has no attribute 'find_element_by_id'
- このエラー名をコピペしてgoogleに検索を掛ける。
- それらしいサイトを探してみる。直観でそうだと思ったのがこちらとこちら。
- それを調べてみたら1つ目のstackoverflowに同じ内容をがあったので参照して解決。
質問者さんは私と同じ記法をしていました。これで同じエラーが出たんですね。
search_box = driver.find_element_by_name('q')
回答者さんはこうアドバイスなさっておりました。
driver.find_element("name", "q")
なるほど、by以下のby_idが引数になって吸収されたと推測する事が出来ます。
find_element_by_name('q')⇒find_element("name", "q")
それならば、もいけるんじゃないかと。
find_element_by_id('"username")⇒find_element("id", ""username"")
総まとめのコード
!pip install selenium
!pip install BeautifulSoup4
from selenium import webdriver
import time
import pandas as pd
browser = webdriver.Chrome("C:/****/****/Desktop/****/****/スクレイピング/chromedriver.exe")
url = "https://scraping-for-beginner.herokuapp.com/login_page"
browser.get(url)
elem_username = browser.find_element('id',"username")
elem_username.clear()
elem_username.send_keys('imanishi')
elem_pass = browser.find_element('id',"password")
elem_pass.clear()
elem_pass.send_keys('kohei')
elem_click = browser.find_element('id',"login-btn")
elem_click.click()
まとめ
良い動画ですが、流石に2年程経過していたため、これ単体では進める事はできませんでした。
しかし、エラー内容を理解して、仮設立てて解消できたのは良い経験になったきがします。
他にも様々な方のお力を借りましたが…。ITは記法がコロコロ変わるのが厄介ですが、頑張って追いつきましょう。
追伸:色々頑張って調べてまとめたけど動画のコメント欄の方に、修正箇所が分かりやすく記載されておりました。ぜひそちらにも目を通して頂ければ。他の問題も解決されるかもしれません。