Python: Wie kratzen Sie mit Python tägliche Daten aus dem dynamischen Web?
Der folgende Code funktioniert, stoppt jedoch nach dem 29. Februar. Die Website gibt "Sie haben ein ungültiges Datum eingegeben. Bitte geben Sie Ihre Suche erneut ein" zurück. Klicken Sie dazu auf "OK". Wie komme ich darum herum?
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
Ausloggen()
Antworten
Wenn Sie nur die im ersten Beitrag beschriebenen Methoden verwenden können, würde ich Folgendes ausprobieren:
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
Es gibt noch viel mehr, wenn sich herausstellt, dass Sie diese Methoden selbst schreiben und HTML durchlaufen und ein Muster für die täglichen Daten finden müssen.
Ich glaube, Sie möchten die Anzahl der Tage in einem Monat dynamisch abrufen, damit Sie diese Anzahl durchlaufen können, um Daten für jedes Datum zu erhalten. Sie können dies wie folgt tun:
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])
Dies gibt ungefähr Folgendes aus ( Anzahl der Tage in einem Monat von - März 2020 bis August 2020 ):
3 - 31
4 - 30
5 - 31
6 - 30
7 - 31
8 - 31
Und dann können Sie eine Schleife für mehrere Tage ausführen, während Sie auf den Bereich des Diktats verweisen, das Sie erhalten haben. HINWEIS: Fügen Sie in der Funktion, in der Sie die Schleife ausführen, um Daten für jedes Datum abzurufen, eine if-Bedingung hinzu, um zu überprüfen, ob es der letzte Tag des Jahres ist, und ändern Sie das Jahr entsprechend.
Vielleicht können Sie diese Funktion verwenden, um die Anzahl der Tage im Monat zu ermitteln:
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