Python: Comment extraire les données quotidiennes du Web dynamique en utilisant Python?
Le code suivant fonctionne mais s'arrête après le 29 février. Le site Web renvoie "vous avez entré une date invalide. Veuillez ressaisir votre recherche", ce qui nécessite de cliquer sur "OK". Comment puis-je contourner cela?
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
Se déconnecter()
Réponses
Si vous ne pouvez utiliser que les méthodes présentées dans le message initial, j'essaierais quelque chose comme:
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
Il y a beaucoup plus à faire s'il s'avère que vous écrivez vous-même ces méthodes et que vous devez parcourir HTML et trouver un modèle pour les données quotidiennes.
Je crois que vous voulez obtenir dynamiquement le nombre de jours dans un mois, afin que vous puissiez boucler sur ce nombre pour obtenir des données pour chaque date. Vous pouvez le faire comme suit:
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])
Cela affichera quelque chose comme ceci ( Nombre de jours dans un mois de - mars 2020 à août 2020 ):
3 - 31
4 - 30
5 - 31
6 - 30
7 - 31
8 - 31
Et puis vous pouvez exécuter une boucle pendant un certain nombre de jours tout en faisant référence à la plage du dict que vous avez obtenu. REMARQUE: Dans la fonction où vous exécutez la boucle pour obtenir des données pour chaque date, ajoutez une condition if pour vérifier si c'est le dernier jour de l'année et modifiez l'année en conséquence.
Peut-être que vous pouvez utiliser ces fonctions pour obtenir le nombre de jours du mois:
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