Python: Jak codziennie usuwać dane z dynamicznej sieci za pomocą Pythona?

Aug 22 2020

Poniższy kod działa, ale przestaje działać po 29 lutego. Witryna zwraca komunikat „wprowadzono nieprawidłową datę. Wprowadź ponownie wyszukiwanie”, co wymaga kliknięcia przycisku „OK”. Jak mam to obejść?

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

Wyloguj()

Odpowiedzi

derringa Aug 22 2020 at 21:07

Jeśli możesz użyć tylko metod opisanych w początkowym poście, spróbuję czegoś takiego:

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

Jest o wiele więcej, jeśli okaże się, że sam piszesz te metody i musisz przejrzeć HTML i znaleźć wzór dla codziennych danych.

ro_ot Aug 22 2020 at 21:22

Uważam, że chcesz dynamicznie uzyskiwać liczbę dni w miesiącu, aby móc przeglądać tę liczbę w celu uzyskania danych dla każdej daty. Możesz to zrobić w następujący sposób:

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])

To wyświetli coś takiego ( liczba dni w miesiącu od - marca 2020 do sierpnia 2020 ):

3 - 31
4 - 30
5 - 31
6 - 30
7 - 31
8 - 31

A następnie możesz uruchomić pętlę przez liczbę dni, odnosząc się do zakresu z uzyskanego dyktu. UWAGA: W funkcji, w której uruchamiasz pętlę, aby uzyskać dane dla każdej daty, dodaj warunek if, aby sprawdzić, czy jest to ostatni dzień roku, i odpowiednio zmodyfikuj rok.

M.Liver Aug 23 2020 at 04:57

Może możesz użyć tej funkcji, aby policzyć dni miesiąca:

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