標籤:lib int tar turn class def res fun address
1 #需求:查詢地區天氣 2 #分析:第一步,抓取上面所有的天氣資訊 3 4 from html.parser import HTMLParser 5 from urllib import request 6 import pickle 7 import json 8 9 #解析中國天氣網HTML 10 class WeatherHtmlParser(HTMLParser): 11 def __init__(self): 12 self.flag = False 13 self.weather_data = None 14 super(WeatherHtmlParser,self).__init__() 15 16 def handle_starttag(self,tag,attr): 17 if tag == "script": 18 self.flag = True 19 20 def handle_endtag(self,tag): 21 if tag == "script": 22 self.flag = False 23 24 def handle_data(self,data): 25 if self.flag: 26 if "var hour3data=" in data: 27 data = data.strip("\n") 28 data = data.strip("var hour3data=") 29 self.weather_data = json.loads(data) 30 31 32 #全國城市天氣預報代碼 33 class CityCodeHtmlParser(HTMLParser): 34 35 def __init__(self): 36 self.flag = False 37 self.city_dict = {} 38 super(CityCodeHtmlParser,self).__init__() 39 40 def handle_starttag(self,tag,attr): 41 if tag == "p" or tag == "br": 42 self.flag = True 43 44 def handle_endtag(self,tag): 45 if tag == "p" or tag == "br": 46 self.flag = False 47 48 def handle_data(self,data): 49 if self.flag: 50 if "=" in data: 51 data = data.split("=") 52 self.city_dict[data[1]] = data[0] 53 54 55 def printWeatherInfo(func): 56 def call(): 57 info = func() 58 if info == None: 59 return None 60 61 #一天之內的天氣 62 one_day = info["1d"] 63 for item in one_day: 64 item = item.split(",") 65 print("%s::天氣:%s; 溫度:%s; 風向:%s; 風力:%s" % (item[0],item[2],item[3],item[4],item[5])) 66 67 #未來7天內的天氣 68 flag = input("是否列印未來7天內的天氣:") 69 if flag == "是": 70 seven_day = info["7d"] 71 for i in range(7): 72 if i >= 1: 73 for item in seven_day[i]: 74 item = item.split(",") 75 print("%s::天氣:%s; 溫度:%s; 風向:%s; 風力:%s" % (item[0],item[2],item[3],item[4],item[5])) 76 else: 77 return None 78 79 return call 80 81 82 83 #抓取天氣資訊 84 @printWeatherInfo 85 def getAllWeather(): 86 city = input("請輸入你要查詢的城市:") 87 city = queryCityCode(city) 88 if city == None: 89 return None 90 url_address = "http://www.weather.com.cn/weather1d/%s.shtml" % city 91 req = request.Request(url_address) 92 req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36") 93 with request.urlopen(req) as html: 94 data = html.read().decode("utf-8") 95 html_parser = WeatherHtmlParser() 96 html_parser.feed(data) 97 html_parser.close() 98 return html_parser.weather_data 99 100 101 102 #查詢城市的編碼103 def queryCityCode(city_name):104 105 #從網上抓取資訊,本來我是想放在檔案裡的,部落格園傳不了,我稍微改造了下106 #目前代碼很醜,先做個記錄吧,現在畢竟沒工作,先把總體的知識過一遍再說107 def getAllCityInfo():108 url_address = "http://doc.orz520.com/a/doc/2014/0322/2100581.html"109 req = request.Request(url_address)110 req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36")111 with request.urlopen(req) as html:112 data = html.read().decode("utf-8")113 html_parser = CityCodeHtmlParser()114 html_parser.feed(data)115 html_parser.close()116 return html_parser.city_dict117 118 city_dict = getAllCityInfo()119 if city_name not in city_dict:120 return None121 return city_dict[city_name]122 123 124 getAllWeather()125 aa = input()
Python 基礎實戰 -- 爬蟲(天氣查詢系統)