🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
スクレイピング

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

Python

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

Q&A

1回答

1791閲覧

pythonを使用したMEO順位獲得でのエラー(list index out of range)

kentalk

総合スコア11

スクレイピング

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

Python

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

0グッド

0クリップ

投稿2021/03/28 15:15

編集2021/03/29 04:58

python初心者です。
pythonを使用したMEOのスクレイピング(googlemapの検索順位)を作成しているのですが、
1回動かすとうまくいくのですが、2回動かすと2回目に下記のようなエラーが出てしまいます。
どのように書き換えたら解決できるでしょうか?
環境はjupyterを使用しています。

↓以下エラー文


IndexError Traceback (most recent call last)
<ipython-input-17-5e8ae10bdfeb> in <module>
18
---> 19 browser.find_elements_by_css_selector('.place-result-container-place-link')[click_point].click()

IndexError: list index out of range

以下ソースコード

python

1!pip install selenium 2!pip install beautifulsoup4 3!pip3 install openpyxl 4 5import urllib.request 6from urllib.parse import quote 7from bs4 import BeautifulSoup 8import urllib.request as req 9import time 10 11from selenium import webdriver 12import time 13import pandas as pd 14 15import openpyxl 16 17keyword ='#検索ワード' 18MEO_list = [] 19click_point = 0 20meo_rank = 0 21target_word = '#店舗名' 22 23%GoogleChromeを起動 24browser = webdriver.Chrome() 25browser.implicitly_wait(3) 26 27%アクセス 28url_login = "https://www.google.co.jp/maps/?hl=ja" 29browser.get(url_login) 30time.sleep(3) 31 32element = browser.find_element_by_name("q") 33element.clear() 34element.send_keys(keyword) 35time.sleep(3) 36 37browser_form = browser.find_element_by_class_name("searchbox-searchbutton") 38time.sleep(3) 39browser_form.click() 40time.sleep(3) 41 42%カレントページのURLを取得 43main_url = browser.current_url 44 45%HTMLを取得 46response = req.urlopen(main_url) 47%情報を取得 48parse_html = BeautifulSoup(response,'html.parser') 49 50 51while click_point < 20: 52 53 print(click_point) 54 #指定の店舗をクリック 55 browser.find_elements_by_css_selector('.place-result-container-place-link')[click_point].click() 56 57 time.sleep(3) 58 59 page_source = browser.page_source 60 soup = BeautifulSoup(page_source,'html.parser') 61 62 %店名を抽出し順位表示 63 title = soup.find(class_="section-hero-header-title-title GLOBAL__gm2-headline-5") 64 65 time.sleep(3) 66 67 MEO_list.append(title.text.strip()) 68 print(MEO_list) 69 70 if MEO_list[-1] == target_word: 71 meo_rank = click_point-1 72 73 click_point += 1 74 75 browser.get(main_url) 76 time.sleep(3) 77 print("再度アクセスしました") 78 79if 0 < meo_rank < 20: 80 MEO_rank = "{}位".format(meo_rank) 81 print(MEO_rank) 82else: 83 MEO_rank = "圏外" 84 print(MEO_rank) 85 86wb = openpyxl.load_workbook("#指定ファイルへのパス") 87ws = wb["MEO"] 88 89c1 = ws.cell(row=5, column=5) 90c1.value = format(MEO_rank) 91 92wb.save("#指定ファイルへのパス")

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

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

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

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

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

y_waiwai

2021/03/28 15:18

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
kentalk

2021/03/28 15:36

申し訳ありませんでした。 コードの貼り方を修正しました。
ppaul

2021/03/28 16:34

エラーメッセージの全文を載せてください。
kentalk

2021/03/29 05:00

エラーメッセージを全文載せました。 質問の仕方がなれておらず申し訳ないです。
ppaul

2021/03/29 09:17

別に謝る必要はありませんよ。 ただ、エラーメッセージは問題解決のための重要な情報ですので、それがないと解決が長引いたり、解決できなかったりするだけです。
guest

回答1

0

IndexError: list index out of rangeというのは、listで指定可能な値以上のインデックスを指定してしまうことで発生します。
click_pointは19まで増えるようですが、
browser.find_elements_by_css_selector('.place-result-container-place-link')は常に20個以上要素が存在するのでしょうか。確認してみてください。

投稿2021/03/29 06:22

jeanbiego

総合スコア3966

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問