前提・実現したいこと
私は、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 (注:これは、スクレイピングの練習のために、書いているコードなので、データ自体はなんでも構いません
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー