2017-10-04 2 views
-1

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 

Répondre

0

Voici l'explication de votre erreur https://httpstatuses.com/406

Vous devez ajouter User-Agent aux en-têtes. Mais je pense que sur ce site existe une certaine protection contre l'exploration et vous devriez utiliser des choses plus spécifiques comme Scrapy, Crawlera, proxy-list, user-agent rotator