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

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

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

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

Beautiful Soup

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

Python 3.x

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

selenium

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

Q&A

解決済

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

masamasamasa
reeeeet

総合スコア95

スクレイピング

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

Beautiful Soup

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

Python 3.x

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

selenium

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

1回答

0グッド

1クリップ

339閲覧

投稿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) を何回もやりすぎてるのがよく無いのでしょうか?

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

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

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

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

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

2

ベストアンサー

ランキングサイトからランクと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

総合スコア17151

reeeeet😄を押しています
reeeeet👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

スクレイピング

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

Beautiful Soup

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

Python 3.x

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

selenium

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