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

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

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

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

selenium

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

Q&A

解決済

1回答

507閲覧

Python/SeleniumによるWEBスクレイピングでキーワードを繰り返し検索してそれぞれのヒット数を取得したい

abcdtaichi

総合スコア18

スクレイピング

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

selenium

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

0グッド

1クリップ

投稿2023/10/26 14:21

前提

現在、以下のWEBスクレイピングの動画を見ていまして、自分でもWEB上の情報をCSVファイルに出力するというのを練習しています。

https://www.youtube.com/watch?v=VRFfAeW30qE&t=3587s

具体的には「Google検索からキーワードを検索し、ヒット数を取得、検索キーワードをクリアして、次のキーワードを検索し、ヒット数を取得、というのを繰り返し、最終的に漫画作品名と検索のヒット数をCSVで出力する」というのを題材としています。

繰り返し処理なので、for文でできると思い、色々試してみたものの、自分でもはっきりと違うとわかるコードしか書けなかったので、こちらで質問させていただきました。
for文に関する初歩的な質問で大変申し訳ないのですが、わかる方がいらっしゃったらご教示いただきたいです。

該当のソースコード

Python

1from selenium import webdriver 2from time import sleep 3from selenium.webdriver.common.by import By 4 5#検索したいキーワード 6keywords = ['ONE PIECE', 'NARUTO', 'ドラゴンボール', 'BLEACH', '銀魂', '呪術廻戦', 'HUNTER×HUNTER'] 7 8#Googleにアクセス 9browser = webdriver.Chrome() 10url = 'https://www.google.com/' 11browser.get(url) 12sleep(3) 13 14## ここから繰り返し ## 15#「検索キーワード」を入力 16elem_keyword = browser.find_element(By.NAME,'q') 17elem_keyword.send_keys(keywords[0]) 18sleep(2) 19 20#検索をクリック 21elem_searchbtn = browser.find_element(By.NAME,'btnK') 22elem_searchbtn.click() 23sleep(1) 24 25#ヒット数を取得 26elem_hit = browser.find_element(By.ID,'result-stats') 27hit = elem_hit.text 28sleep(1) 29 30#検索キーワードをクリア 31browser.find_element(By.NAME,'q').clear() 32sleep(1) 33 34## ここまで繰り返し ## 35 36 37#表を作成 38import pandas as pd 39df = pd.DataFrame() 40df['作品名'] = [keywords[0]] 41df['ヒット数'] = [hit] 42df 43 44#CSVで出力 45df.to_csv('漫画ヒット数調査結果.csv')

発生している問題

「繰り返し」の部分のfor文をどのように書けば良いのかわかっていない状況です。
やりたいことは検索キーワードをまとめて指定した上で、

1.検索キーワードを入力
2.検索をクリック
3.ヒット数を取得
4.キーワードをクリア
5.検索キーワードを入力
6.(以下すべてのキーワードが終わるまで繰り返し)

上記のように繰り返し、漫画のタイトルとそのヒット数を表にして、CSVで出力するというコードを書きたいと考えております。

補足情報(FW/ツールのバージョンなど)

Windows 11 Home
Python 3.12.0
Google Chrome バージョン: 118.0.5993.89(Official Build) (64 ビット)

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

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

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

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

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

guest

回答1

0

ベストアンサー

検索履歴が cookie に記録されるため、検索ワードと前回の検索ワードが関連付けられてしまってヒット数が表示されない場合があります。(手元の環境では3~4回に1回程度) そのため、キーワードごとにブラウザ(Google Chrome)を起動・終了させています。

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 5import pandas as pd 6 7#検索したいキーワード 8keywords = ['ONE PIECE', 'NARUTO', 'ドラゴンボール', 'BLEACH', '銀魂', '呪術廻戦', 'HUNTER×HUNTER'] 9 10#表を作成(予め列名を指定しておく) 11df = pd.DataFrame(columns=['作品名', 'ヒット数']) 12 13#Google search engine 14url = 'https://www.google.com/' 15#検索語入力欄 16search_word = (By.NAME,'q') 17#検索実行ボタン 18search_button = (By.NAME,'btnK') 19#ヒット数 20result_id = (By.ID,'result-stats') 21 22## ここから繰り返し ## 23for key in keywords: 24 #Googleにアクセス 25 browser = webdriver.Chrome() 26 browser.get(url) 27 28 #「検索キーワード」を入力 29 WebDriverWait(browser, 5).until(EC.visibility_of_element_located(search_word)) 30 elem_keyword = browser.find_element(*search_word) 31 elem_keyword.send_keys(key) 32 33 #検索をクリック 34 WebDriverWait(browser, 5).until(EC.visibility_of_element_located(search_button)) 35 elem_searchbtn = browser.find_element(*search_button) 36 elem_searchbtn.click() 37 38 #ヒット数を取得 39 WebDriverWait(browser, 5).until(EC.visibility_of_element_located(result_id)) 40 elem_hit = browser.find_element(*result_id) 41 hit = elem_hit.text 42 43 #作品名とヒット数をデータフレームに追加 44 df.loc[len(df)] = [key, hit] 45 46 # close browser 47 browser.close() 48 49## ここまで繰り返し ## 50 51#CSVで出力 52df.to_csv('漫画ヒット数調査結果.csv')

投稿2023/10/26 16:46

melian

総合スコア20167

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

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

abcdtaichi

2023/10/27 15:22

的確なご回答をいただきましてありがとうございました。 ご共有いただいたコードでもできましたし、検索キーワードをクリアしてキーワードを入力して再検索というカタチでもできました! ご共有いただいたコードの中で、データフレームに追加する方法を知らなかったので、非常に勉強になりました。(また表をあらかじめ作成する点やimportされているものも調べてみたいと思います) この機会に、さらにSeleniumやPandasの勉強をしたいと思います。 今回はご回答いただきましてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.41%

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

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

質問する

関連した質問