pythonでWebスクレイピング ~click()が出来ないときの対処~
pythonのseleniumで、webページ上のボタンをクリックさせるような操作はよくすると思います。
以前別記事で、要素のclick処理が実行できないときの対処を紹介しましたが、今回はそれでも改善しなかったときの対応方法を紹介します。
Contents
発生事象
amazonの注文履歴をスクレイピングさせようとした際、次へボタンのclick()処理が動作しておりませんでした。
エラーは発生していないため、画面遷移できていないのに画面遷移しているものと認識して無限ループに入っていました。
amazon注文履歴URL
該当箇所
該当コード
next_link = driver.find_element_by_partial_link_text("次へ")
next_link.click()
time.sleep(1)
対策
画面スクロール実施(効果なし)
スクレイピングを実施している画面上に、クリック対象の要素が存在しないことが原因でクリックが出来ないことがあります。
別記事でも紹介し、過去のスクレイピングで何度か使用している対処が以下になります。
# ページ内を下までスクロール
def scroll():
while 1:
html01=driver.page_source
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
html02=driver.page_source
if html01!=html02:
html01=html02
else:
break
しかし、今回の事象では上記コードを追加してもうまく動作しませんでした。
そもそも該当の事象の時には要素の取得に失敗してエラーを出力するはずですが、そうはなりません。
URLを取得し、URLからアクセス(効果あり)
クリックが出来ないのなら使わなければいいという元も子もない対処です。
初めのクリック処理を以下のように置き換えます。
element = driver.find_element_by_partial_link_text("次へ")
driver.get(element.get_attribute("href"))
time.sleep(1)
上手くいきました…
手動でクリック(効果あり)
最後は邪道ですが、実装をあきらめて手動でクリックしてしまう方法です。
該当箇所にsleep時間を10~20秒多めに設けたうえで、直接seleniumで起動したブラウザ上の該当箇所をマウスでクリックしちゃいます。
print文で「click XXX now」とでも表示しとくとよいでしょう。
この手法意外と有用で、なにかとめんどくさくなっているログイン処理なんかにも応用できます。
最後に
根本的原因の究明には至らず、結局click処理をあきらめるという結論に落ち着きました。
何かわかれば別途お知らせしたいと思います。