徒然白書

学んだこととか、聞いたこととか

【備忘】PythonでSeleniumを動かしていると起こりやすいエラーの原因と解決策

入社してこの方、全く開発をしていない僕も一応はITエンジニアを名乗るだけの人権を手に入れるべく、ここ三ヶ月ほどPythonの勉強をしている。

 

Pythonにおけるクローリング*1スクレイピング*2のライブラリ*3Seleniumというものがあり、これが使えるとかなり色々なことができて楽しい。

 

参考書として『退屈なことはPythonにやらせようーノンプログラマーにもできる自動化処理プログラミング』(オライリー・ジャパン)を使用していて、これがまたわかりやすい。

ノンプログラマー向けを謳っているだけあって、クラスだのなんだのの説明は省いて、ひとまず最低限の知識でできる自動化処理を広く解説してくれている。

 

大体7割ほど読み進めたところだが、以下のようなことはできるようになった。

  • 指定したWebサイトへの自動ログイン
  • 特定の時間にネットワーク速度を測定してエクセルへ記録
  • 米ドルー日本円の為替状況を自動収集   等々

 

一方で、クローリングやスクレイピングはなかなか一筋縄ではいかないことも多い。

SeleniumはWebサイト*4を読み込んで、その要素を取り出しているわけだが、Webサイトも千差万別、エラー原因もそれこそ山のようにある。

 

せっかくなので、僕がSeleniumで足止めを喰らったエラーと原因、その解決策を備忘がてら書いていく。

解決策は基本的に諸先輩がたのをお借りするとともに、掲載先のリンクを貼っておくので、興味がある方や詳しく知りたい方はそちらも参照されると良い。

 

【エラー】そもそも欲しい情報(要素)が取得できない

 Seleniumでは、まず欲しい情報(要素)をfind_element()またはfind_elements()で指定して取得するのだが、大体ここでつまづくことが9割。

 取得できない原因は大きく分けて、二つある。

  1. 要素の指定方法が間違っている
  2. Webサイト(ソースコード)に何か原因がある

7割くらいは前者(つまりは僕の凡ミス)なのだが、後者っぽいと思った場合に、Webサイト上のどこに原因があるのかを探っていくことになる。

 

【解決策1】親タグから順に取得してみる。

取得したい要素のタグ*5(要素)に向かって、最も上位のタグ(htmlタグ)から順々に要素の取得(htmlタグ→bodyタグ→...といった感じ)を試してみると、どこかでエラーを吐くので、そのタグに何か原因がないか確認してみる。

誰に聞いたわけでもないが、色々と試行錯誤していく中で割と効果的だなと感じた方法。

 

ここからは個々の原因とその解決策について

【原因】画面の読み込みが完了していない。

Webサイトによっては画面の読み込みに時間がかかる場合がある。

こうなると、Seleniumが要素を探そうにも、対象がないわけなので、エラーとなる。

【解決策】待機処理を入れる。

解決策は簡単、待ってあげよう。

qiita.com

 

【原因】別のWebサイトが埋め込まれている。(iframe)

 Webサイト上にYouTubeの動画が埋め込まれているのを見かけるかと思うが、あれはiframeという機能を使って別のWebサイトを埋め込んでいる(らしい)。

Seleniumで指定した動作対象(Webサイト)にはiframeで埋め込んだ別のWebサイトは含まれない。

YouTubeのように露骨に埋め込みだとわかる場合は良いのだが、私が見たWebサイトは一部のデータ項目だけiframeで埋め込まれていて、一見すると通常のWebサイトにしか見えなかった。

【解決策】動作対象をiframe内に移してから要素を取得する。

 対象を一度iframe内に移してから要素を取得することで可能になることがある。

 

dse-souken.com

 

【エラー】ボタンがクリックできない。

Seleniumはclick()で取得した要素(ボタン)をクリックすることができるのだが、これも結構な確率で動作しないことがある。押して。

 

【原因】ボタンが画面外にある。

click()は画面外にあるボタンは押せない仕様。

【解決策】画面をスライドし、ボタンを画面内に入れる。

ボタンが画面内にくるように、ボタンもしくはその周囲の要素を対象に画面をスライドさせてあげる。

qiita.com

 

【原因】ボタンが不活性(disable)

たとえば、ログイン画面でIDとパスワードが入力されるまでボタンがクリックできないWebサイトがあるかと思うが、あれはボタンが不活性(disable)状態にある。

IDとパスワードをSeleniumで自動入力し、click()でボタンを押そうとした時に、入力後にボタンが活性化される速度よりもSeleniumの動作が早いとclick()できなくてエラーに。

 

【解決策】待機処理を入れて活性化されるのを待つ。

待機処理を入れてボタンが活性化されるのを待つ。

qiita.com

 

【エラー】テキストが取得できない(空白が返ってくる)

 取得した要素から、Webサイト上に表示されているテキストを取得しようとしたところ、なぜか空白文字列が取得されてしまった。

 

【原因】CSSプロパティが非表示(:none, ::hidden)になっている

 CSSプロパティがdisplay:noneやvisibility:: hiddenに設定されている要素は非表示扱いになり、テキストが取得できないとのこと。なんじゃそりゃ。

【解決策】get_attribute()を使用

 要するに、表示されているテキストではなく、要素の属性(attribute)として設定されている値を取得すれば、表示・非表示とは関係なく値が取得可能といった感じ。

qiita.com

 

他にも色々あった気はするが、ひとまずはこれくらい。

それにしても、しっかり解決策を出されていて本当に素晴らしい。

 

*1:Webサイト上のテキストや値を収集すること

*2:クローリングで収集した情報から自分の欲しい情報を抽出すること

*3:どこかの天才が作ってくれた便利機能

*4:もとい、HTMLやCSSjavascriptなどのソースコード

*5:WebサイトはHTMLというプログラミング言語で書かれており、HTMLはタグと呼ばれる記法を軸に書かれている

世界史をどのように学ぶか

人は自分が経験していないことを理解しがたい。

世界史はヨーロッパやアメリカなどの「西洋史」を中心に描かれることが多く、故に日本人には分かりづらいのではと思う。

こと僕に関しては、高校時代に学年最下位を取った程度には世界史が苦手だった。

 

詳説世界史研究』を読み始めて3か月、昔ほど世界史に苦手意識は無くなってきたので、なんとなく思うことを書いてみる。

(まだ西洋史、しかも世界大戦前までしか読んでいないが。)

 

◾️なぜ世界史がわかりづらいのか

①範囲が広い

当たり前だが「世界の歴史」なのでありとあらゆる国が出てくる。

先史*1を除いても軽く3000年はある。長い。

また、『詳説世界史研究』をはじめとして、参考書の多くは歴史を古い順に書き進めている。

情報量の多い世界史で時代順に学習を進めていくと、序盤の内容はもう大体覚えていない。

そして、結果的には縦(一地域の歴史)も横(一時代の各地域の出来事)も中途半端になってしまう。

 

②必要な知識が多い

世界史に限らず、歴史一般をしっかりと理解しようとすると、政治・経済の知識をはじめとして、宗教や学問、芸術など広範な知識が必要になる。

そのため、結果として”ただ暗記する”だけで終わってしまい、記憶に定着しづらくなる。

 

③宗教観

世界の歴史は往々にして宗教の歴史でもある。(は、言い過ぎかもしれないが。)

そして、信仰心が当時の人々の意思決定にも強く反映されている。

日本人は他国に比べて宗教観の薄い国民性であるから、世界史における行動原理をそのまま受け入れるのが難しいのではと思う。

 

④日本の歴史的・地理的独自性

世界史を学んでいると、日本という国はかなり特殊な歴史を辿っており、それは日本の地理的特徴によるものであると感じた。

 第一に、島国であること。

 第二に、東に太平洋、西に中国と朝鮮を擁すること。

 第三に、西欧諸国から近すぎず、遠すぎずの距離にいること。

これらの地理的特徴によって、日本はどの時代においても、諸外国の侵攻を受けない比較的安泰な国家形成を育みつつ、外からの最新鋭かつ豊富な文明・文化を享受することができた。

そのため、日本の独特な歴史背景をベースに世界史を学ぶと、乖離が起きるのではと思う。

 

◾️世界史をどのように学ぶか

①マクロから学ぶ

学校で日本史を習った人であれば、なんとなくでもざっくりとした日本史の流れ(旧石器→縄文→弥生→・・・→明治→大正→昭和)はわかると思う。

世界史も同様に、まずは全体の大きな流れを理解してみることで、よりミクロな視点に移っても、今、自分がどの時期にいるのかを把握しやすいのではないか。

(とはいえ、一時代・一地域のミクロの歴史を学ぶのは、それはそれで楽しい。個人的にはジュリアス・シーザーユリウス・カエサル)の生涯がおすすめ。)

 

②好きな分野から入ってみる

何事にも歴史というものはある。

実は、僕が『詳説世界史研究』を読み始めたのも、西洋美術史(特にルネサンス期)への造詣を深めるためである。

例えば、コーヒー好きな人はコーヒーの歴史*2を学ぶことで、植民地時代の勢力図や三角貿易などを自然と学ぶことができる。

他分野でも下地としての知識があるだけで、歴史は理解しやすくなる。

 

③宗教について知る

これは世界史を学ぶという本筋からは若干逸れるが、三大宗教(キリスト教イスラム教・仏教)については知識を持っていて損をすることはない。

まずはYouTubeの『10分でわかる○○』*3*4みたいな動画でざっくり理解するだけでも十分である。

日本人が考える以上に、宗教が歴史に与えた影響は計り知れない。

 

 

まあ、なんであれ、世界の歴史を知るって楽しい。

歴史を知ると、地理がわかるし、旅行に行きたくなる。

歴史がわかると、海外ドラマもより楽しめたりする。

 

 

最後に、おすすめ。

詳説世界史研究

ヒストリエ*5

ジュリアス・シーザー*6

RRR』(2022)*7

ローマの休日』(1953)*8

 

 

*1:文献に残る以前の時代

*2:YouTubeリンク『10分でみる コーヒーの歴史 エチオピアからスタバまで』

*3:YouTubeリンク『宗教の歴史を10分で簡単にわかりやすく解説!【ユダヤ教、キリスト教、イスラム教】』

*4:YouTubeリンク『キリスト教 カトリックとプロテスタントの違いを超わかりやすく解説』

*5:アレキサンダー大王に仕えた書記官・エウメネスの生涯を描いた漫画。

*6:シェイクスピアの戯曲に基づく映画。古代ローマの天才的指導者シーザー(カエサル)の暗殺とその後を描く。

*7:イギリス植民地時代のインドを舞台とした2022年のインド映画。序盤ちょっとだけグロいので注意。

*8:名作ラブロマンス映画。ローマってマジで遺跡まみれなんだってビビる。