Python: ¿Cómo se extraen datos diarios de la web dinámica con Python?

Aug 22 2020

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

derringa Aug 22 2020 at 21:07

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.

ro_ot Aug 22 2020 at 21:22

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.

M.Liver Aug 23 2020 at 04:57

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