使用Python獲取天氣信息

思路

這里抓取的是中國天氣網(wǎng)的數(shù)據(jù),它是個靜態(tài)頁面,請求的URL是:

http://d1.weather.com.cn/sk_2d/101190101.html?_=1527152861827

兩個變量,一個是html前的一串?dāng)?shù)字,這個數(shù)字代表一個城市,因此我們需要城市名和數(shù)字編號的轉(zhuǎn)換關(guān)系。后面一串?dāng)?shù)字很明顯是當(dāng)前時間。

該請求會返回一個字典,每個key的命名還是很容易猜到其意義的,就不多說了。

代碼

weather-result.jpg

weather.py

import re
import Sqlite3api as sqlite3
import Configure as Configs
import requests
from random import choice
from bs4 import BeautifulSoup
import time
import ast

def import_data():
    with open('cityWeather18-03-4.sql', 'r', encoding='utf-8') as file:
        content = file.read()

    pattern = re.compile('(\d+),\'(.*?)\',\'(\d+)\'',re.S)
    data = pattern.findall(content)
    print ("Retrieve {0:d} weather codes.".format(len(data)))

    conn = sqlite3.sqlite3_init()

    for d in data:
        print (d)
        sql = "INSERT INTO weather VALUES ({0:s},'{1:s}',{2:s})".format(d[0], d[1].strip(),d[2])
        sqlite3.sqlite3_execute(conn, sql)

    sqlite3.sqlite3_close(conn)

def get_citycode_by_cityname(cityname):
    conn = sqlite3.sqlite3_init()

    ret = sqlite3.sqlite3_execute(conn, "select cityname, citycode from weather WHERE cityname LIKE '%{0:s}%'".format(cityname))

    sqlite3.sqlite3_close(conn)

    return ret

def get_weather_by_citycode(citycode):
    url = "http://d1.weather.com.cn/sk_2d/{0:d}.html?_={1:d}".format(citycode, int(time.time()*1000))

    header = {}
    header['user-agent'] = choice(Configs.FakeUserAgents)
    header['Referer'] = "http://www.weather.com.cn/weather1d/101190101.shtml"

    try:
        response = requests.get(url, headers=header)
        content = ''
        if response.status_code == requests.codes.ok:
            response.encoding = 'utf-8'
            content = response.text
    except Exception as e:
        print (e)

    pattern = re.compile('{(.*?)}', re.S)
    data = pattern.findall(content)[0]
    data = ast.literal_eval("{"+data+"}")

    print ("城市:", data.get('cityname'))
    print ("日期:", data.get('date'))
    print ("時間:", data.get('time'))
    print ("攝氏溫度:", data.get('temp'))
    print ("華氏溫度:", data.get('tempf'))
    print ("天氣:", data.get('weather'))
    print ("濕度:", data.get('SD'))
    print ("風(fēng)向:", data.get('WD'))
    print ("風(fēng)級:", data.get('WS'))
    print ("空氣質(zhì)量:", data.get('aqi'))
    print ("空氣質(zhì)量PM2.5:", data.get('aqi_pm25'))



def main():
    while True:
        print ("-"*80)
        cityname = input("請輸入要查詢的城市名: ")

        ret = get_citycode_by_cityname(cityname)

        if not ret:
            print ("沒有找到該城市,請重新輸入。")
            continue
        
        if 1 == len(ret):
            get_weather_by_citycode(int(ret[0][1]))
            continue

        cnt = 1
        table = PrettyTable()
        table.field_names = ["編號", "城市名字"]
        table.sortby = "編號"

        for r in ret:
            table.add_row([cnt, r[0]])
            cnt += 1

        print (table)

        code = int(input("找到不只一個城市,請輸入其編號: "))
        get_weather_by_citycode(int(ret[code-1][1]))
    


if __name__ == '__main__':
    #import_data()
    main()
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,222評論 3 119
  • 【健心踐行打卡第186天:】(2018.4.24) 一、功課: 看書60分鐘,靜心30分鐘,完成。 二、感恩 1....
    Yoyo袁閱讀 176評論 2 1
  • 一個人在生活中可能有太多的不順心和太多的誘惑,樂極生悲和痛不欲生的人我們實在看得太多了。雖然僅二十余歲,但...
    紅發(fā)香克斯_閱讀 240評論 0 0

友情鏈接更多精彩內(nèi)容