Python: Bagaimana Anda mengikis data harian dari web dinamis menggunakan Python?
Kode berikut berfungsi tetapi berhenti setelah 29 Februari. Situs web mengembalikan "Anda telah memasukkan tanggal yang tidak valid. Silakan masukkan kembali pencarian Anda", yang mengharuskan mengklik "OK". Bagaimana cara mengatasi ini?
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
keluar()
Jawaban
Jika Anda hanya dapat menggunakan metode yang ditampilkan di posting awal maka saya akan mencoba sesuatu seperti:
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
Ada lebih banyak hal yang masuk ke dalam masalah ini jika ternyata Anda menulis metode ini sendiri dan perlu mengulang melalui HTML dan menemukan pola untuk data harian.
Saya yakin Anda ingin mendapatkan jumlah hari secara dinamis dalam sebulan, sehingga Anda dapat mengulang angka tersebut untuk mendapatkan data setiap tanggal. Anda dapat melakukan ini sebagai berikut:
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])
Ini akan menghasilkan sesuatu seperti ini ( Jumlah hari dalam sebulan dari - Maret 2020 hingga Agustus 2020 ):
3 - 31
4 - 30
5 - 31
6 - 30
7 - 31
8 - 31
Dan kemudian Anda dapat menjalankan loop selama beberapa hari sambil merujuk rentang dari dict yang Anda peroleh. CATATAN: Dalam fungsi di mana Anda menjalankan perulangan untuk mendapatkan data untuk setiap tanggal, tambahkan satu kondisi if untuk memeriksa apakah itu hari terakhir dalam setahun dan memodifikasi tahun yang sesuai.
Mungkin Anda bisa menggunakan fungsi ini untuk menghitung hari dalam sebulan:
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