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

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

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

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

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

selenium

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

Q&A

解決済

1回答

1298閲覧

seleniumでスクレイピング。ある部分が取れない

masamasamasa

総合スコア95

スクレイピング

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

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

selenium

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

0グッド

1クリップ

投稿2023/01/21 06:02

編集2023/01/21 07:07

前提

ランキングサイトからランクとnameを取得するコードを作成中

  • 1ページにランキングは100個
  • それが1591ページまである
  • ランキング部分はjavascriptだから、requestsではなくseleniumを使用
  • 「次のページ」ボタンは10ページまでしかないので、urlのページ番号をwhileで変更させてアクセス
  • クラウドではなく、ローカル
  • mac

実現したいこと

ランキングサイトからランクとnameを取得したい

発生している問題

2つあります

①「値が無いよ」と言われて途中で止まる

(ページ数) 238 ->1591まで 239 ->1591まで 240 ->1591まで 241 ->1591まで 242 ->1591まで 243 ->1591まで 244 ->1591まで 245 ->1591まで list index out of range <-エラーメッセージ

②取得成功した値の中でも、途中で抜けている部分がある
イメージ説明

該当のソースコード

python

1from selenium import webdriver 2from selenium.webdriver.chrome.options import Options 3from selenium.webdriver.common.by import By 4from selenium.webdriver.common.keys import Keys 5from bs4 import BeautifulSoup 6from pprint import pprint 7import pandas as pd 8 9 10# オプション 11options = webdriver.ChromeOptions() 12options.add_argument('--headless') # ブラウザ立ち上げるか 13driver = webdriver.Chrome("/Users/mt/Documents/program/Python/scraping_かむなび/chromedriver", options=options) 14driver.implicitly_wait(10) 15 16url= "https://navi.kamuitracker.com/ranking/youtube_alltime?pg=" 17pageNum = 1 18rankList = [] 19chNameList = [] 20 21def main(): 22 try: 23 while pageNum < 1592: 24 driver.get(url + str(pageNum)) 25 driver.implicitly_wait(10) 26 content = driver.page_source 27 soup = BeautifulSoup(content, "html.parser") 28 elements = soup.find_all('div', class_='ranking-wrap')[0] 29 for a in elements.find_all('a'): 30 rankList.append(a.find('p', class_='num').string) # ランキング 31 chNameList.append(a.find('p', class_='name').string) # ch名 32 pageNum += 1 33 print(pageNum, " ->1591まで") 34 # csvに保存 35 df = pd.DataFrame(rankList) 36 df.to_csv('rankList.csv') 37 df = pd.DataFrame(chNameList) 38 df.to_csv('chNameList.csv') 39 except Exception as e: 40 print(e) 41 # csvに保存 42 df = pd.DataFrame(rankList) 43 df.to_csv('rankList.csv') 44 df = pd.DataFrame(chNameList) 45 df.to_csv('chNameList.csv') 46 47 48if __name__ == '__main__': 49 main() 50 51

試したこと

①「値が無いよ」と言われて途中で止まる
の部分は、再度そこからスタートさせると普通に取れる

②はなにも試していない
もしかしてdriver.get(url) を何回もやりすぎてるのがよく無いのでしょうか?

すみませんがよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

ランキングサイトからランクとnameを取得したい

前回の質問でコメントしましたが、HTTP GET によってランキングや番組名などの属性データを取得することが可能です。ただ、1591回もアクセスしますので、対象のウェブサイトに過大な負荷を掛けることにもなりかねません。その点はご注意下さい。

python

1import pandas as pd 2import time 3 4url = 'https://app.kamuitracker.com/kamunavi/v1/channels/search?page={}' 5dfs = [] 6for i in range(1, 1592): 7 df = pd.read_json(url.format(i))['item'].apply(pd.Series)[['rank', 'title']] 8 dfs.append(df) 9 time.sleep(10) 10 11dfx = pd.concat(dfs) 12dfx.to_csv('ranking_and_channel_name.csv', index=False)

Developers Tools
イメージ説明

投稿2023/01/21 07:29

編集2023/01/21 07:57
melian

総合スコア19749

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

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

masamasamasa

2023/01/21 07:46

ご回答ありがとうございます。前回の質問で全然理解していませんでした。サイトに負荷がかからないように気をつけたいと思います。 ちょっと混乱しているのですが、このurlはどうやって作られているのでしょうか?
masamasamasa

2023/01/21 09:28

何度もありがとうございます。非常に助かりました。 最後に答えられたらで良いのですが このXHRのGETは、 ・javascriptで情報を表示しているサイトでは基本的に有効 ・サイト側が見せないようにしていたらGETでも表示されない という理解であっていますでしょうか?
melian

2023/01/21 10:11

はい、その通りです。
masamasamasa

2023/01/21 11:27

最後までありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問