Python: ¿Cómo se extraen datos diarios de la web dinámica con Python?
El siguiente código funciona, pero se detiene después del 29 de febrero. El sitio web devuelve "ha introducido una fecha no válida. Vuelva a introducir su búsqueda", por lo que debe hacer clic en "Aceptar". ¿Cómo puedo solucionar esto?
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
cerrar sesión()
Respuestas
Si solo puede usar los métodos presentados en la publicación inicial, probaría algo como:
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
Hay mucho más en esto si resulta que usted mismo está escribiendo estos métodos y necesita recorrer HTML y encontrar un patrón para los datos diarios.
Creo que desea obtener dinámicamente el número de días en un mes, de modo que pueda recorrer ese número para obtener datos para cada fecha. Puede hacer esto de la siguiente manera:
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])
Esto generará algo como esto ( Número de días en un mes desde marzo de 2020 hasta agosto de 2020 ):
3 - 31
4 - 30
5 - 31
6 - 30
7 - 31
8 - 31
Y luego puede ejecutar un ciclo durante varios días mientras consulta el rango del dict que ha obtenido. NOTA: En la función donde está ejecutando el ciclo para obtener datos para cada fecha, agregue una condición if para verificar si es el último día del año y modifique el año en consecuencia.
Tal vez pueda usar estas funciones para contar los días del mes:
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