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

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

詳細はこちら
DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

while

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

Python

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

selenium

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

Q&A

解決済

1回答

1596閲覧

phthonでwhile文を用いたwebスクレイピング

taniisei

総合スコア5

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

while

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

Python

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

selenium

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

0グッド

1クリップ

投稿2021/01/04 03:19

前提・実現したいこと

私は、webスクレイピングの勉強をしております。現在、https://prtimes.jp/main/html/searchbiscate/busi_cate_id/003/lv2/11 のサイトから、企業名を取得し、リスト化しようとしております。
このサイトは下にスクロールすると、’もっと見るボタン’があり、それをクリックするとさらにデータが表示されます。
’もっと見るボタン’のhrefは、https://prtimes.jp/main/html/index/pagenum/1でした。
ブラウザを操作し、while文を用いて、’もっと見るボタン’をクリックすることはできるのですが、日付条件の設定が出来ていないのか、クリックをやめることができません。日付条件をつけてみると、今度は、クリックされず、データがリスト化できません。何が間違っているのかご教授いただけると幸いです。

取得したデータに対して、日付条件(2020-12-01T00:00:00+0900 から 2021-01-04T00:00:00+0900 まで)を指定して、範囲内ならwebサイトにある’もっと見るボタン’をクリック。さらに表示されたデータを取得したい。また条件外の日付の時になったら、クリックをやめ、それまで取得したデータをリスト化したい。

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

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

エラーメッセージ

該当のソースコード

from bs4 import BeautifulSoup import urllib.request as req import pandas as pd from selenium import webdriver import chromedriver_binary import datetime from datetime import date from datetime import timedelta import time browser = webdriver.Chrome() browser.implicitly_wait(3) url = 'https://prtimes.jp/main/html/searchbiscate/busi_cate_id/003/lv2/11' url_01 = 'https://prtimes.jp/main/html/index/pagenum/1' browser.get(url) time.sleep(3) response = req.urlopen(url) parse_html = BeautifulSoup(response, 'html.parser') parse_html found_lists = parse_html.select('.link-name-company.name-company.name-company-ordinary') found_article = parse_html.select('.item.item-ordinary') found_datetime = parse_html.time['datetime'] found_lists found_article found_datetime dt = datetime.datetime.now() dt_start =datetime.datetime.strptime(str('2021-01-04T00:00:00+0900'), '2021-01-04T00:00:00+0900') dt_end =datetime.datetime.strptime(str('2020-12-01T00:00:00+0900'), '2020-12-01T00:00:00+0900') found_date = datetime.datetime.strptime(str(found_datetime),'%Y-%m-%dT%H:%M:%S+0900') ######これ以降のwhile文に間違いがあると思います。####### while dt_end <= found_date <= dt_start : #クリックの動作を入力 #find_element_by_idはhtmlのidの要素を指定して入力できる browser_from = browser.find_element_by_id('more-load-btn-view') time.sleep(3) browser_from.click() print('クリックしました') url_01 = 'https://prtimes.jp/main/html/index/pagenum/1' #time.sleep(3) #browser.get(url_01) #print(url, 'アクセス完了') response_01 = req.urlopen(url_01) parse_html_01 = BeautifulSoup(response_01, 'html.parser') found_datetime_01 = parse_html_01.time['datetime'] found_date_01 = datetime.datetime.strptime(str(found_datetime_01),'%Y-%m-%dT%H:%M:%S+0900') dt_start =datetime.datetime.strptime(str('2021-01-04T00:00:00+0900'), '2021-01-04T00:00:00+0900') dt_end =datetime.datetime.strptime(str('2020-12-01T00:00:00+0900'), '2020-12-01T00:00:00+0900') def daterange(_dt_end, _dt_start): for m in range(int((_dt_start - _dt_end).days)+1): yield _dt_end + timedelta(m) # found_date_02 = found_date + found_date_01 if not found_date_01 in daterange(dt_end, dt_start) : break else: found_date = found_date_01 #urlへ遷移する前に下の処理に行かないための記述 time.sleep(3) #指定したウェブサイトのhtmlを取得する response = req.urlopen(url) response_01 = req.urlopen(url_01) parse_html = BeautifulSoup(response, 'html.parser') parse_html_01 = BeautifulSoup(response_01, 'html.parser') parse_html parse_html_01 found_lists = parse_html.select('.link-name-company.name-company.name-company-ordinary') found_lists_01 = parse_html_01.select('.link-name-company.name-company.name-company-ordinary') found_lists found_lists_01 #found_list_02 = found_lists + found_lists_01 #テキストのみを取得 #print(found_lists) #取得したデータのリスト化 found_list = [] for i in found_lists: found_list.append(i.string) for s in found_lists_01: found_list.append(s.string) found_list #データフレームにデータを書き出す。 df_found = pd.DataFrame({'会社名':found_list}) df_found #欠損値を除く df_notnull = df_found.dropna(how = 'any') df_notnull #csvへの書き込み df_found.to_csv('output_02.csv')

試したこと

日付条件の設定

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

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/01/04 12:09 編集

下記気になった点。 ・whileのところで日付を比較していますが、 現状、dt_end 、 found_date 、 dt_start それぞれにどのような日付が入っているか、 print文等を使って、確認してみたらいかがでしょう? (現状、dt_end,dt_start は、おそらく想定した日付になっていないはずです) ・while内の関数 daterange(_dt_end, _dt_start) で found_date_01が「指定した範囲内の日付であるかどうか」を判定しようとしているようですが、 この関数が正しく想定通りに動くか、いくつか直接値を入れて確認してみましょう。 おそらく想定通りには動かないはずです。 ・ 「ページ内の最も最後にある日付」を取得して、 found_datetime_01に入れようとしていると考えられますが、 想定通りその日付が取得できているか、確認してみましょう。 ・ttps://prtimes.jp/main/html/searchbiscate/busi_cate_id/003/lv2/11 のページ内ボタンをクリックして延長しようとしているのだと思いますが、 while内でなぜ、「'ttps://prtimes.jp/main/html/index/pagenum/1'」 という全く別のページを開こうとしているのでしょうか。 ( #print(url, 'アクセス完了') response_01 = req.urlopen(url_01) の部分)
guest

回答1

0

ベストアンサー

プログラム全体は見てませんが、

while dt_end <= found_date <= dt_start :

は、どう見ても不等号が逆では?

投稿2021/01/04 12:08

otn

総合スコア85893

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問