Python: come si estraggono i dati giornalieri dal Web dinamico utilizzando Python?
Il seguente codice funziona ma si interrompe dopo il 29 febbraio. Il sito web restituisce "hai inserito una data non valida. Per favore inserisci nuovamente la tua ricerca", che richiede di cliccare su "OK". Come posso aggirare questo problema?
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
disconnettersi()
Risposte
Se puoi utilizzare solo i metodi descritti nel post iniziale, proverei qualcosa del tipo:
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
C'è molto di più in questo se si scopre che stai scrivendo questi metodi da solo e hai bisogno di scorrere l'HTML e trovare un modello per i dati giornalieri.
Credo che tu voglia ottenere dinamicamente il numero di giorni in un mese, in modo da poter scorrere quel numero per ottenere i dati per ogni data. Puoi farlo come segue:
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])
Questo produrrà qualcosa del genere ( Numero di giorni in un mese da - marzo 2020 ad agosto 2020 ):
3 - 31
4 - 30
5 - 31
6 - 30
7 - 31
8 - 31
E poi puoi eseguire un ciclo per il numero di giorni facendo riferimento all'intervallo dal dict che hai ottenuto. NOTA: nella funzione in cui si esegue il ciclo per ottenere i dati per ciascuna data, aggiungere una condizione if per verificare se è l'ultimo giorno dell'anno e modificare l'anno di conseguenza.
Forse puoi usare queste funzioni per ottenere il conteggio dei giorni del mese:
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