Python:Pythonを使用して動的Webから毎日のデータをどのように取得しますか?
Aug 22 2020
次のコードは機能しますが、2月29日以降に停止します。ウェブサイトは「無効な日付を入力しました。検索を再入力してください」と返すため、[OK]をクリックする必要があります。どうすればこれを回避できますか?
country_search("United States")
time.sleep(2)
date_select = Select(driver.find_element_by_name("dr"))
date_select.select_by_visible_text("Enter date range...") #All Dates
select_economic_news()
#btnModifySearch
for month in range(1,9):
for day in range(1,32):
try:
set_from_month(month)
set_from_date(day)
set_from_year("2020")
set_to_month(month)
set_to_date(day)
set_to_year("2020")
time.sleep(5)
#select_economic_news()
time.sleep(5)
search_now()
time.sleep(8)
export_csv()
modify_search()
time.sleep(5)
#country_remove()
except ElementClickInterceptedException:
break
ログアウト()
回答
derringa Aug 22 2020 at 21:07
最初の投稿で紹介されている方法しか使用できない場合は、次のような方法を試してみます。
set_from_year('2020')
set_to_year('2020')
for month in range(1, 9):
# 1 to 9 for Jan to Aug
month_str = '0' + str(month)
set_from_month(month_str)
set_to_month(month_str)
for day in range(1, 32):
# Assuming an error is thrown for invalid days
try:
# Store data as needed
except Exception as e:
# print(e) to learn from error if needed
pass
これらのメソッドを自分で作成していて、HTMLをループして毎日のデータのパターンを見つける必要があることが判明した場合は、さらに多くのことが起こります。
ro_ot Aug 22 2020 at 21:22
1か月の日数を動的に取得して、その数をループして各日付のデータを取得できるようにする必要があると思います。これは次のように実行できます。
from datetime import datetime
currentDay = datetime.today()
# You can set the currentDay using this if you want the data till the current date or
# whenever your scheduler runs the job.
# Now you need to get the number of days in each month from the chosen date, you can
# have the corresponding function like getStartMonth() in your program which will
# return the starting month.
from calendar import monthrange
daysPerMonth = {}
year = currentDay.year #TODO : change this to getStartYear()
startMonth = 3 # TODO : Implement getStartMonth() in your code.
for month in range(startMonth, currentDay.month+1):
# monthrange returns (weekday,number of days in that month)
daysPerMonth[month] = monthrange(year, month)[1]
for month in daysPerMonth.items():
print(month[0], '-',month[1])
これにより、次のように出力されます(2020年3月から2020年8月までの1か月の日数):
3 - 31
4 - 30
5 - 31
6 - 30
7 - 31
8 - 31
そして、取得したdictからの範囲を参照しながら、数日間ループを実行できます。注:ループを実行して各日付のデータを取得する関数で、if条件を1つ追加して、それが年の最後の日であるかどうかを確認し、それに応じて年を変更します。
M.Liver Aug 23 2020 at 04:57
たぶん、これらの関数を使用して、月のカウント日を取得できます。
import datetime
def get_month_days_count(year: int, month: int) -> int:
date = datetime.datetime(year, month, 1)
while (date + datetime.timedelta(days=1)).month == month:
date = date + datetime.timedelta(days=1)
return date.day