2016-05-17 19 views
1

Ich versuche, Daten von der Wetter-Website wunderground.com zu kratzen. Ich möchte, dass es jeden Monat (Jan-Dez) für die Jahre 1941-2016 aus Philadelphia kommt.Ausgabedatei lässt Monate leer von Wetterdaten

Zuerst hatte ich diesen Code, aber dies nur gekratzt und machte eine Datei für Januar 2016.

#!/usr/bin/python 
#weather.scraper 

from bs4 import BeautifulSoup 
import urllib 
import json 

def main(): 
    # weatherData = weather_philadelphia_data #Json beginns here 
    # with open(jsonfile, 'w') as outputFile: 
    #  json.dump(weatherData, outputFile) 
    # #scrapping beginns here 
    r = urllib.urlopen("https://www.wunderground.com/history/airport/KPHL/2016/1/1/MonthlyHistory.html?&reqdb.zip=&reqdb.magic=&reqdb.wmo=&MR=1").read() 
    soup = BeautifulSoup(r, "html.parser") 
    tables = soup.find_all("table", class_="responsive airport-history-summary-table") 

    weatherdata = [] 
    for table in tables: #reason for it to do it 12x 

     for tr in table.find_all("tr"): 
      firstTd = tr.find("td") 
      if firstTd and firstTd.has_attr("class") and "indent" in firstTd['class']: 
       values = {} 
       tds = tr.find_all("td") 
       maxVal = tds[1].find("span", class_="wx-value") 
       avgVal = tds[2].find("span", class_="wx-value") 
       minVal = tds[3].find("span", class_="wx-value") 
       if maxVal: 
        values['max'] = maxVal.text 
       if avgVal: 
        values['avg'] = avgVal.text 
       if minVal: 
        values['min'] = minVal.text 
       if len(tds) > 4: 
        sumVal = tds[4].find("span", class_="wx-value") 
        if sumVal: 
         values['sum'] = sumVal.text 
       scrapedData = {} 
       scrapedData[firstTd.text] = values 
       weatherdata.append(scrapedData) 
     break 
    with open ("january_2016.json", 'w') as outFile: 
     json.dump(weatherdata, outFile, indent=2) 


print "done" 
if __name__ == "__main__": 
    main() 

Ich habe versucht, ein for-Schleife zu machen, die all die Jahre und Monate Schleifen durch. Es macht die Datei, aber es ist leer mit Daten, es zeigt nur die Jahre. Dies ist der neue Code:

#!/usr/bin/python 
#weather.scraper 
from bs4 import BeautifulSoup 
import urllib 
import json 

allData = [] 
# this loops through all the Weather years 
for y in range(1941, 2017): 
    yearData = {} 
    yearData['year'] = y 
    months = [] 
    for m in range(1, 13): 
     def main(): 
     # weatherData = weather_philadelphia_data #Json beginns here 
     # with open(jsonfile, 'w') as outputFile: 
     #  json.dump(weatherData, outputFile) 
     # scrapping beginns here 
      url = "https://www.wunderground.com/history/airport/KPHL/%d/%d/1/MonthlyHistory.html" % (y, m) 
      r = urllib.urlopen(url).read() 
      soup = BeautifulSoup(r, "html.parser") 
      tables = soup.find_all("table", class_="responsive airport-history-summary-table") 

      weatherPerMonth = {} 
      weatherdata = [] 
      for table in tables: #reason for it to do it 12x 

       for tr in table.find_all("tr"): 
        firstTd = tr.find("td") 
        if firstTd and firstTd.has_attr("class") and "indent" in firstTd['class']: 
         values = {} 
         tds = tr.find_all("td") 
         maxVal = tds[1].find("span", class_="wx-value") 
         avgVal = tds[2].find("span", class_="wx-value") 
         minVal = tds[3].find("span", class_="wx-value") 
         if maxVal: 
          values['max'] = maxVal.text 
         if avgVal: 
          values['avg'] = avgVal.text 
         if minVal: 
          values['min'] = minVal.text 
         if len(tds) > 4: 
          sumVal = tds[4].find("span", class_="wx-value") 
          if sumVal: 
           values['sum'] = sumVal.text 
         scrapedData = {} 
         scrapedData[firstTd.text] = values 
         weatherdata.append(scrapedData) 
         break 
      monthData = {} 
      monthData['month'] = m 
      monthData['weather'] = weatherPerMonth 
      months.append(monthData) 
     yearData['months'] = months 
     allData.append(yearData) 

     with open ("allData_philly.json", 'w') as outFile: 
      json.dump(allData, outFile, indent=2) 


print "done" 
if __name__ == "__main__": 
    main() 

Dieser Teil der Ausgabedatei ist es macht.

[ 
{ 
    "months": [], 
    "year": 1941 
}, 
] 

Es ist wie diese, bis zum Jahr 2016

Das Problem ist die folgende. Ich möchte eine Datei, die mir die Wetterdaten für 12 Monate (Januar-Dezember) für die Jahre 1941 bis 2016, und es sollte so aussehen etwas gibt:

[ 
    { 
    "months": [{ 
       'month': 12 
       'weather' : { 
        "Max Temperature": { 
        "max": "18", 
        "avg": "6", 
        "min": "-2" 
        } 
       }, 
       { 
        "Mean Temperature": { 
        "max": "12", 
        "avg": "1", 
        "min": "-6" 
        } 
       }, 
       { 
        "Min Temperature": { 
        "max": "6", 
        "avg": "-3", 
        "min": "-11" 
        } 

     }], 
    "year": 1941 
    }, 
] 

Aber ich kann nicht herausfinden, warum meine Code funktioniert nicht, ich hoffe, jemand kann helfen!

Antwort

1

Ihr Code sieht gut aus, es gibt nur ein paar kleine Dinge, die Sie daran hindern, die richtige Ausgabe zu erhalten.

  • def main(): wird in einer Schleife befindet, also wenn Sie main() nennen es nicht eine Schleife durch alle Jahre. Es sieht gut in Ihrem ersten Beispiel aus.
  • deklarieren Sie weatherPerMonth als eine leere Liste und dann zu monthData['weather'] zuweisen. Ihre tatsächlichen Daten sind in weatherdata, aber es wird nie irgendwo geschrieben.
  • Der folgende Code ist nur eine geringfügige Änderung Ihres Codes, ein paar Umordnungen und Einrückungsänderungen, aber es sollte Ihnen die gewünschte Ausgabe geben.

#weather.scraper 
from bs4 import BeautifulSoup 
import urllib.request 
import json 

allData = [] 
# this loops through all the Weather years 
for y in range(2012, 2014): 
    yearData = {} 
    yearData['year'] = y 
    months = [] 
    for m in range(1, 13): 
     # weatherData = weather_philadelphia_data #Json beginns here 
     # with open(jsonfile, 'w') as outputFile: 
     #  json.dump(weatherData, outputFile) 
     # scrapping beginns here 
     url = "https://www.wunderground.com/history/airport/KPHL/%d/%d/1/MonthlyHistory.html" % (y, m) 
     r = urllib.request.urlopen(url).read() 
     soup = BeautifulSoup(r, "html.parser") 
     tables = soup.find_all("table", class_="responsive airport-history-summary-table") 

     weatherPerMonth = {} 
     weatherdata = [] 

     monthData = {} 

     for table in tables: #reason for it to do it 12x 

      for tr in table.find_all("tr"): 
       firstTd = tr.find("td") 
       if firstTd and firstTd.has_attr("class") and "indent" in firstTd['class']: 
        values = {} 
        tds = tr.find_all("td") 

        maxVal = tds[1].find("span", class_="wx-value") 
        avgVal = tds[2].find("span", class_="wx-value") 
        minVal = tds[3].find("span", class_="wx-value") 
        if maxVal: 
         values['max'] = maxVal.text 
        if avgVal: 
         values['avg'] = avgVal.text 
        if minVal: 
         values['min'] = minVal.text 
        if len(tds) > 4: 
         sumVal = tds[4].find("span", class_="wx-value") 
         if sumVal: 
          values['sum'] = sumVal.text 
        scrapedData = {} 
        scrapedData[firstTd.text] = values 

        weatherdata.append(scrapedData) 
        monthData['month'] = m 
        monthData['weather'] = values 
        break 


     months.append(monthData) 
    yearData['months'] = months 
    allData.append(yearData) 

with open ("allData_philly.json", 'w') as outFile: 
    json.dump(allData, outFile, indent=2) 
+0

der Code für Python 3, wenn Sie Python verwenden 2 der 'Import urllib.request' geändert zu Ihrem ursprünglichen Code werden muss zurück. –