質問するログイン新規登録
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

1回答

852閲覧

seleniumで表示される画像の順序が入れ替わる

lysia

総合スコア0

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2023/06/25 13:04

編集2023/06/27 14:03

0

0

前提、実現したいこと

スクレイピングの初心者です。
Pythonとselenium(chromedriver)でWEBサイトのスクレイピングを試しているのですが、
ブラウザで表示した場合と、seleniumを使って表示した場合で、表示される画像の順序が入れ替わってしまうためこれを解決したいです。
chromeバージョン: 114.0.5735.134
chromedriverバージョン: 114.0.5735.90
seleniumバージョン: 3.141.0

発生している問題・エラーメッセージ

1.ブラウザを自分で立ち上げてurlを打ち込みページを表示した
2.driver = webdriver.Chrome driver.get(url) で表示した
1と2で表示される画像の順序が変わってしまいます。
ctrl+U でソースをそれぞれ確認すると、
data-src = "a.webp" alt="page1"
data-src = "b.webp" alt="page2"
data-src = "c.webp" alt="page3"

data-src = "a.webp" alt="page1"
data-src = "c.webp" alt="page2"
data-src = "b.webp" alt="page3"
のように入れ替わっていました。

・スクロールで順に画像が表示されるページになっており、最初から表示されているものは入れ替わっておらず、それ以降の画像が入れ替わっているようです。
・直接url先に飛ばずにchromedriverでgoogleトップページに飛んで、そこから該当urlを手で打ち込んでも同様でした。(driverで立ち上げているchromeに問題がある?)
・ソースの最後の</script><a href="#page" class="scrollup" id="btn-scrollup" style="display: inline;"><i class="fa fa-angle-up"></i></a>とあり、pageタグにアクセスしているが関係ある?
・ソースの最後で読み込んでいる.jsファイルは関係ある?(以下に記載)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2023/06/25 14:44

Pythonのコードはどうなっていますか?webdriverのオプション設定はどうなっていますか?
meg_

2023/06/25 14:45

> ・ソースの最後で読み込んでいる.jsファイルは関係ある?(以下に記載) 勝手に?公開してしまって大丈夫ですか?
otn

2023/06/25 15:55

違う環境でHTMLが異なるのはよくあることです。 Selenium経由の場合の順番に合わせてコードを書けば良いだけでは?
tmp

2023/06/26 03:12

自分で書いたコードですか? 引用の範囲かどうか私はわかりませんが、少なくとも引用なら質問文と引用文がわかるようして、引用元もわかるようにしないと。
lysia

2023/06/26 15:56

jsファイルはweb上で公開されているものです。 >>違う環境で この場合環境が違うとはどういう意味でしょうか?chromeをchromedriverで立ち上げてもchromeアプリケーションから立ち上げても同じものが立ち上がっているため環境は同じだと思っているのですが。 selenium経由の場合の表示結果が毎回同じというわけでもないためそれに合わせることもできずに困っています。(本来は通し番号順に並んでいるものが、順序がばらばらになる)
otn

2023/06/26 16:47 編集

Selenium等でコントロールされているChromeかどうかはサーバー側で検知できるので、意図はわかりませんが、動作を変更することは可能です。 > elenium経由の場合の表示結果が毎回同じというわけでもないためそれに合わせることもできずに困っています。 表示が順不同であることを前提にプログラムを書けば良いだけでは?
meg_

2023/06/27 11:42

> jsファイルはweb上で公開されているものです。 web上で閲覧可能であることは著作権を放棄したことを意味するのでしょうか?ライセンスに従う必要があるかと思います。
lysia

2023/06/27 14:15

順不同のものを元の正しい順でよみこみたいですが、その「正しい順序」がseleniumで閲覧する限りわからないのが現状なので、それを前提に読みこむができずにいます。 前述のように正しい順序ー>順不同の入れ替わりも不規則なのでそれを前提としたというのが、思いつかないですが、良いアイデアはあるのでしょうか? seleniumでコントロールされていることの検知はもう少し調べてみます。ユーザーエージェントの設定なんかはやっていましたがそれ以外にも設定すべきことがありそうですかね。
otn

2023/06/27 16:21

正しい順序かどうかを人間が判断できる場合⇒その判断ロジックをプログラムで実現する 正しい順序かどうかを人間が判断できない場合⇒どうしようもないというか、その場合はどの順序でも良いのでは?
lysia

2023/06/27 17:18

繰り返しになりますが、selenium上ではすでに不規則に順序が変わった結果しか得られないため、繰り返し正しく動作させるには「入れ替わりのロジック」を理解しないとプログラミングできません。画像を見れば「人間の判断ロジック」で順序がわかりますが、それは画像解析の機械学習をするレベルの話になりますが、それはseleniumを利用する利点から逸脱するため、その解決策では意味がないと思います。 seleniumと通常閲覧の違いが入れ替わりのロジックに対応するため、それに関して質問をしています。 もしseleniumの仕様に精通しており具体的なアイデアがあるなら、アドバイスしていただけると助かります。
guest

回答1

0

この回答はGPT-4による自動生成回答です

ブラウザで表示される画像の順序がseleniumで表示される順序と異なる問題についてですが、以下のような原因が考えられます。

  1. JavaScriptによる動的なコンテンツの変更
  2. ページの読み込み速度による違い
  3. セッションやCookieの違い

対処方法としては、以下のような方法が考えられます。

  1. JavaScriptが完全に読み込まれるまで待機する
  2. スクロールを行い、すべての画像が表示されるまで待機する
  3. セッションやCookieを同期させる

以下に、JavaScriptが完全に読み込まれるまで待機するコード例を示します。

python

1from selenium import webdriver 2from selenium.webdriver.common.by import By 3from selenium.webdriver.support.ui import WebDriverWait 4from selenium.webdriver.support import expected_conditions as EC 5 6url = "https://example.com" 7driver = webdriver.Chrome() 8driver.get(url) 9 10# JavaScriptが完全に読み込まれるまで待機 11WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "img[data-src]"))) 12 13# 画像の順序を確認 14images = driver.find_elements_by_css_selector("img[data-src]") 15for img in images: 16 print(img.get_attribute("data-src"), img.get_attribute("alt")) 17 18driver.quit()

このコードでは、WebDriverWaitを使用して、指定したCSSセレクタが存在するまで最大10秒間待機します。これにより、JavaScriptによる画像の順序変更が完了するまで待機できます。

ただし、この方法ではページの読み込み速度やセッション・Cookieの違いによる問題は解決できません。それらの問題に対処するには、適切な方法を検討してください。

投稿2023/06/25 13:05

teratail-ai

Powered by GPT-4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lysia

2023/06/26 13:07

WebDriverWaitでは解決しませんでした。googleトップに飛んでurlを打ち込んでもダメなため、wait関係ではない気がしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問