質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

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

Python 3.x

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

selenium

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

Q&A

1回答

612閲覧

PythonのSeleniumで某モールの関連キーワードを取得するプログラムで質問です!

vbxy95xwy

総合スコア10

スクレイピング

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

Python 3.x

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

selenium

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

0グッド

0クリップ

投稿2020/03/20 07:04

編集2020/03/20 07:05

PythonのSeleniumについての質問です。

下記のような現状なのですが、ロジックの助言をしていただけると幸いです。

○やりたいこと
某ショッピングモールで、特定のキーワードを検索して、それに紐づく関連キーワードを取得するプログラムを作成しようとしています。

手順としては
1、検索ボックスにキーワードを入力して検索
2、検索結果に表示される関連キーワードを配列で取得
3、配列に格納されている関連キーワードごとに手順1〜2を繰り返す

手順2、3でどのようにプログラムを記述すればいいか困っています。
最終的には下記のような配列を作成したいです。
[
'カメラ 安い',
'カメラ 送料無料',
'カメラ カメラ一眼レフ',
続く
]

○困っているところ
・関連キーワードがどこで終了するかわからない。
例えば’カメラ’で検索したときに
関連キーワードには'カメラ 安い'、’カメラ 送料無料’、’カメラ 一眼レフ’などが関連キーワードとして表示されます。
それらを配列に格納して、次は’カメラ 安い’を検索し、表示された関連キーワードを配列に追加する、のように1つのキーワードに対してどんどん深掘りしていくのですが、
終了するタイミング(関連キーワードがもうこれ以上表示されない状態)がキーワードによって異なるのでそれをどのようにプログラムに落とし込めばいいか困っています。

・配列の要素数が最初と異なっていく
最初に取得した関連キーワードからfor文を回しているのですが、新たに関連キーワードを追加すると配列の数が変わってしまい、
エラーが出てしまいます。

ざっくりした質問で申し訳ないのですが、よろしくお願いいたします。
※下記が現状のコードです。

python

1url = '該当モールのURL' 2searchWord = "検索キーワード" 3browser.get(url) 4totalReflectWordList = [] 5 6searchBy("検索ボックスのクラス名", searchWord) 7 8tmpReflectWords = reflectWords 9while (True): 10 try: 11 for reflectWord in reflectWords: 12 print("reflectWord : " + reflectWord) 13 inputClearBy(検索ボックスのクラス名, 40) 14 searchBy(検索ボックスのクラス名, reflectWord) 15 #関連ワードを配列で取得 16 reflectWordElements = browser.find_elements_by_css_selector(関連キーワードを含むdivのクラスセレクタ) 17 reflectWords = getReflectWordList(reflectWordElements) 18 tmpReflectWords.extend(reflectWords) 19 tmpReflectWords = set(tmpReflectWords) 20 for tmpReflectWord in tmpReflectWords: 21 print("tmpReflectWords : " + tmpReflectWord) 22 23 except Exception: 24 break 25 26#関連ワードをトータル配列に追加 27for reflectWord in reflectWords: 28 if (reflectWord not in totalReflectWordList): 29 totalReflectWordList[reflectWord] = None 30 31def inputClearBy(className, num): 32 for i in range(num): 33 searchBoxElement = browser.find_element_by_class_name(className) 34 searchBoxElement.send_keys(Keys.BACK_SPACE) 35 36def searchBy(className, keyword): 37 searchBoxElement = browser.find_element_by_class_name(className) 38 searchBoxElement.send_keys(keyword) 39 searchBoxElement.send_keys(Keys.RETURN) 40 41def click(className): 42 browser.find_element_by_class_name(className).click() 43 44def getReflectWordList(reflectWordElements): 45 reflectWords = [] 46 for reflectWordElement in reflectWordElements: 47 reflectWords.append(reflectWordElement.text) 48 return reflectWords

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

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

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

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

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

Matsui_hero

2020/03/20 11:32

>エラーが出てしまいます。 どんなエラーメッセージですか? 少なくとも、reflectWordsは文字列のはずなので、 totalReflectWordList[reflectWord] = Noneは現状通らないと思うんですが、、、 (totalReflectWordListのtypeがdictなら通ります)
guest

回答1

0

調べる関連ワードの上限数を決めるのはいかがでしょうか

投稿2020/03/20 07:30

dark-eater-kei

総合スコア1248

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問