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

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

新規登録して質問してみよう
ただいま回答率
85.46%
while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Python

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

Q&A

解決済

1回答

4113閲覧

もっと見るボタンがあるwebサイトのスクレイピングについて

taniisei

総合スコア5

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Python

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

1グッド

0クリップ

投稿2021/01/08 05:52

前提・実現したいこと

私は、webスクレイピングの勉強をしております。現在、https://prtimes.jp/main/html/searchbiscate/busi_cate_id/003/lv2/11 のサイトから、企業名を取得し、リスト化しようとしております。
このサイトは下にスクロールすると、’もっと見るボタン’があり、それをクリックするとさらにデータが表示されます。今回は練習として、15回程クリックして、そこに表示されたデータをリスト化しようとしております。

ブラウザを操作し、while文を用いて、’もっと見るボタン’をクリックすることはできるのですが、クリック後のデータがリスト化できません。(クリック前の直近40データはリスト化できます。)何が間違っているのかご教授いただけると幸いです。

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

python

1#ライブラリのimport 2from bs4 import BeautifulSoup 3import urllib.request as req 4import pandas as pd 5from selenium import webdriver 6import chromedriver_binary 7import datetime 8from datetime import date 9from datetime import timedelta 10import time 11 12#googlechromeを起動 13browser = webdriver.Chrome() 14#chromeドライバーが見つかるまでの待ち時間を設定 15browser.implicitly_wait(3) 16 17#ページサイトへアクセス 18 19#urlの指定 20url = 'https://prtimes.jp/main/html/searchbiscate/busi_cate_id/003/lv2/11' 21#指定したurlへ遷移する 22browser.get(url) 23 24#urlへ遷移する前に下の処理に行かないための記述 25time.sleep(3) 26 27x = 1 28while x <= 15: 29 #クリックの動作を入力 30 #find_element_by_idはhtmlのidの要素を指定して入力できる 31 browser_from = browser.find_element_by_id('more-load-btn-view') 32 time.sleep(3) 33 browser_from.click() 34 print('クリックしました') 35 x = x + 1 36 37#指定したウェブサイトのhtmlを取得する 38response = req.urlopen(url) 39 40parse_html = BeautifulSoup(response, 'html.parser') 41parse_html 42 43 44#aタグの一覧から複数のクラス名を[]で指定して取得する 45found_lists = parse_html.find_all('article' ,class_= 'item item-ordinary') 46 47 48 49found_articles = [] 50 51for article in found_lists: 52 datetime = article.find('time', class_='time-release time-release-ordinary icon-time-release-svg') 53 found_datetime = datetime['datetime'] 54 found_articles.append(found_datetime.split()) 55 found_company_a = article.find('a', class_='link-name-company name-company name-company-ordinary') 56 found_company =found_company_a.text 57 found_title_a =article.find('a', class_='link-title-item link-title-item-ordinary') 58 59 60 61 62 63 article={ 64 'found_datetime':found_datetime.split(), 65 'found_company':found_company_a.contents[0], 66 'found_title':found_title_a.contents[0] 67 } 68 found_articles.append(article) 69#------------------------------------------------------------- 70print(found_articles) 71

試したこと

取得classの確認

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

Python 3.6.0 lxml4.6.2 pandas0.25.3 datetime
ここにより詳細な情報を記載してください。
変換したいデータを取得したホームページ https://prtimes.jp/main/html/searchbiscate/busi_cate_id/003/lv2/11 (注:これは、スクレイピングの練習のために、書いているコードなので、データ自体はなんでも構いません
ここにより詳細な情報を記載してください。

uram👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

#指定したウェブサイトのhtmlを取得する response = req.urlopen(url)

ボタンクリック後、この部分で「urllib.request」を使用してHTMLを再取得しているので、Ajax取得したHTMLが取れてません。urllibは静的なHTML取得にしか使えません。

以下のようにAjax後のレスポンスを待ってからSeleniumドライバからHTMLを取得したらどうでしょうか。

# ~ボタンクリック後 time.sleep(3) parse_html = BeautifulSoup(browser.page_source, 'html.parser')

投稿2021/01/08 06:26

umau

総合スコア805

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

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

taniisei

2021/01/08 07:24

回答ありがとうございます。 ご指摘通りにしたら、情報を取得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問