J'essaie de rayer Weather Underground pour les données horaires de plusieurs stations météorologiques et de les mettre dans une base de données pandas. Je ne peux pas utiliser l'API car il y a des limites sur les demandes et je ne veux pas payer des milliers de dollars pour gratter ces données.En boucle dans la liste des valeurs pour plusieurs requêtes url en python
Je peux obtenir le script pour gratter toutes les données que je veux d'une station. Lorsque j'essaie de le modifier pour qu'il passe en boucle dans une liste de stations, j'obtiens une erreur 406 ou il ne renvoie que les données de la première station de ma liste. Comment puis-je faire défiler toutes les stations? Comment puis-je stocker le nom de la station afin qu'elle puisse être ajoutée à l'image dans une autre colonne?
ici est ce que mon code ressemble maintenant:
stations = ['EGMC','KSAT','CAHR']
weather_data = []
date = []
for s in stations:
for y in range(2014,2015):
for m in range(1, 13):
for d in range(1, 32):
#check if a leap year
if y%400 == 0:
leap = True
elif y%100 == 0:
leap = False
elif y%4 == 0:
leap = True
else:
leap = False
#check to see if dates have already been scraped
if (m==2 and leap and d>29):
continue
elif (y==2013 and m==2 and d > 28):
continue
elif(m in [4, 6, 9, 11] and d > 30):
continue
timestamp = str(y) + str(m) + str(d)
print ('Getting data for ' + timestamp)
#pull URL
url = 'http://www.wunderground.com/history/airport/{0}/' + str(y) + '/' + str(m) + '/' + str(d) + '/DailyHistory.html?HideSpecis=1'.format(stations)
page = urlopen(url)
#find the correct piece of data on the page
soup = BeautifulSoup(page, 'lxml')
for row in soup.select("table tr.no-metars"):
date.append(str(y) + '/' + str(m) + '/' + str(d))
cells = [cell.text.strip().encode('ascii', 'ignore').decode('ascii') for cell in row.find_all('td')]
weather_data.append(cells)
weather_datadf = pd.DataFrame(weather_data)
datedf = pd.DataFrame(date)
result = pd.concat([datedf, weather_datadf], axis=1)
result