質問: webdriver.Chrome() drv.get("開きたいスプレッドシートのURL") drv.save_screenshot("画面キャプチャ.png") ``` キャプチャした画面は以下です。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/f03f915916d06d42ec531d55b2b83fff.png) ### 試したこと ヘッドレスでない状態で起動したときの xpath や css_slector を使用して find_element_by_xpath や find_element_by_css_selector を使用して各要素を叩いてみましたが、以下エラーがでました。(ヘッドレスではない場合は普通に通る) ``` selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"#identifierId"} (Session info: headless chrome=83.0.4103.116) ``` また、find_element_by_xpath で要素を叩く前にtime.sleepなども入れてみましたが、結果は同じでした。 ### 補足情報(FW/ツールのバージョンなど) 開発環境は以下です。 ・OS: Windows10 ・言語: Python 3.6 ・IDE: PyCharm COMMUNITY 2020.1.2 ・ブラウザ: Google Chrome 83.0.4103.116 ・ブラウザ操作:selenium 3.141.0 ・chromedriver-binary:83.0.4103.39.0
回答: まず大前提 ===== Googleはスクレイピングを禁止しています。 天下のGoogleがどのような技術を盛り込んでいるのかは皆目検討もつかないですが、 > > 1.ヘッドレスだと異なる画面が出てくる理由 > > > これを追求すること自体が(詳しく法律知らないですが)違法行為に当たる可能性があります。 もちろんこのままスクレイピングを続けることもです。 その上で ==== ``` print(drv.page_source) ``` とすると現在SeleniumからDOMがどう見えているかが表示されます。 開発者ツールが使えなくても十分に情報を得られるはずです。 起こっている事象から、headlessとそうでない時でDOMが異なるのは間違いありません。 それを利用して場合分けをしてやるといいでしょう。 ``` if len(drv.find_elements_by_hogehoge('fugafuga')) > 0: # とある要素がある時の処理 else: # とあるがない時の処理 ``` あるいは ``` from selenium.common.exceptions import NoSuchElementException # 中略 try: drv.find_element_by_fugafuga('hogehoge').send_keys('hogefuga') # とある要素がある時の続きの処理 except NoSuchElementException: # とある要素がない時の処理 ``` などとしてやって、場合分けをし、両対応のプログラムを書けばいいでしょう。