Webスクレイピングってどんなもの?
KFugaku
Webチームメンバー
高校時代のプログラミングの思い出
こんにちは! IS1年のKFugakuです!春からTNDのWebチームに参加して、ReactなどのWeb開発の知識を学んでいるところです。
これからたくさんのことを学ぶにあたり、高校時代にプログラミングを始めた自分が当時どんなものを作っていたのかを振り返ってみることにしました。
今回はその中でもWebスクレイピングについて初心者の方向けにザックリとどんなものなのか紹介していきます!
Webスクレイピングって何??
皆さんはブラウザでの操作を自動化してみたいと感じたことはありませんか?
そのWebにおける自動化の技術こそがWebスクレイピングです。
自分が自動化に興味を持ったのは、新型コロナウイルスが流行した時でした。当時学校から毎朝健康チェックのフォームを送信するよう義務付けられてしまい、自分はそれを忘れてしまうことが多かったためいっそのこと自動化してしまおうと考えたのが始まりでした。
本記事では当時私が使用していたPythonライブラリのSeleniumでのスクレイピングについてザックリと紹介します!
※サイトによってはスクレイピングが禁止されているものもあるので注意してください!
具体的にどんなことができるの?
ここからは具体的な使用方法について解説していきます。ここに詳細な実装方法を記述しようと思ったのですが、私がスクレイピングを勉強し始めた当時とは違って現在はSeleniumの公式ドキュメントがとても充実してました(しかも日本語!)。よってここではどんなことができるのかの紹介にとどめます。詳しく知りたい方は公式ドキュメントをご覧ください。
基本事項
インストール方法
Pythonでpipを利用してインストールできます。
pip install selenium
ドライバーの読み込み
ブラウザごとにドライバーは異なるので、使用しているブラウザに合わせたものを読み込みます。ここではChromeの例を紹介します。 この部分でブラウザのバージョンを検出して適切なドライバーを自動で探し出してくれます。
driver = webdriver.Chrome()
URLからWebページに移動
ここまでのコードだけでURLを自動で開くことができます。
driver.get("開きたいURLをここに挿入")
終了処理
このコードを書かなくても実行することはできますが最後にエラーが発生してしまうのでコードの末尾に必ず書きましょう。
driver.quit()
自動で操作するためのコード
要素を見つける
自動化において最も重要なこと、それはページがきちんと読み込まれていることです。例えばボタンをクリックしたいのに通信環境の問題などでページが読み込まれない場合エラーが発生してしまいます。
はじめ、私はこれを解決しようと time.sleep() を用いて10秒間処理を止めるなどしていましたがこの方法はどんな時にも10秒間処理が止まってしまう他、10秒かけてもページが読み込まれなかった場合はエラーが発生するため根本的な解決になりません。この問題を解決したのが下に記したコードです。
このコードは、要素が見つかればその要素をelementに格納して次に進んでくれます。10と書かれているのは最大10秒は探し続けてくれるという意味で、ここは自由に変えて大丈夫です(今考えたらもっと大きな数字の方が動作が安定する気がする)。
当時の私は完全にコピペで使っていました。
処理を行いたいオブジェクト(例えばボタンなど)を指定する方法はさまざまあります。HTMLの経験のある方ならIDやNAMEなど様々知っていると思います。
処理を行いたいページで右クリックして検証や調査と書かれたものを選択することでオブジェクトのIDやNAMEを調べましょう。当時の自分はXPATHを使っていました。
以下はXPATHで指定する例ですが、IDの場合はBy.IDといった形で、**“探したい要素”**にはそのIDが入ります。
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,"探したい要素")))
自動で操作する
要素が見つかれば後は簡単で、その要素のものをクリックする場合は element.click() でクリックできます。入力欄に入力する場合は element.send_keys(“入力内容”) という風に入力できます。
まとめると…
基本的には上記の要素を見つけるコードと操作するコードの繰り返しとなります。
自分はこの二つのコードを一つの関数にまとめていたのでよかったら参考にしてください。
typeという引数で処理内容を指定して、XPATHには操作したい要素のXPATH、keysは入力内容を入れます(ない場合は”none”にしてました)。
当時の自分はフォームの送信という単純な操作だったためtypeは1の何かを送るときのものしかありませんがもっと複雑な操作の場合はここの条件分岐を増やしてください!
def operate(type,XPATH,keys):#XPATHの読み込みと動作の実行
#全てのコンテンツが読み込まれるまで待機
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,XPATH)))
if type == 1: #何か送るとき
element.send_keys(keys)
else: #クリックのみ
element.click()
エラーが発生したときは…
僕の経験則でよくありがちなエラーを3つ紹介します!
-
ドライバーとブラウザのバージョンが一致していない
自動で探して読み込んでくれるはずですが、自分の時はエラーが起きてしまったこともありました。
このエラーはエラー文を読んでもわかりにくいことが多いので、よくわからないエラー文の時は疑ってみてください。
もちろんドライバーは公開されているので手動でもダウンロードできます! -
要素の指定ができていない
webサイトのHTMLを見てみると似たような要素が多いなって感じますよね。
どこのタグがどの部分を記述しているかをよく確かめてみてください! -
要素を指定する前に操作を行ってしまっている
先ほど説明した、ページが読み込まれる前に自動操作のコードが作用してしまう問題もこれに当たります。
他にも、要素を探す前に element.click() などと記述してしまうともちろんこのエラーになってしまいます。 そんなミスしね~よって思うかもしれませんが、いろいろな自動操作を記述しているうちにどの部分がどこのボタンのクリックなのかわからなくなります。
コメントを追加するなどしてわかりやすくしておきましょう!
最後に
いかがでしたでしょうか?スクレイピングは簡単に実装できて初心者でもプログラミングの楽しさを実感できる良い題材だと思います!
ここまで読んでくださりありがとうございました!