您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Python如何讀取網絡數據,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
很多時候,程序并不能直接展示本地文件中的數據,此時需要程序讀取網絡數據,并展示它們。
比如前面介紹的 http://lishi.tianqi.com 站點的數據,它并未提供下載數據的鏈接(前面程序所展示的 csv 文件本身就是使用程序抓取下來的)。在這種情況下,程序完全可以直接解析網絡數據,然后將數據展示出來。
前面已經介紹了 Python 的網絡支持庫 urllib,通過該庫下的 request 模塊可以非常方便地向遠程發送 HTTP 請求,獲取服務器響應。因此,本程序的思路是使用 urllib.request 向 lishi.tianqi.com 發送請求,獲取該網站的響應,然后使用 Python 的 re 模塊來解析服務器響應,從中提取天氣數據。
本程序將會通過網絡讀取 http://lishi.tianqi.com 站點的數據,并展示 2017 年廣州的最高氣溫和最低氣溫。
import re from datetime import datetime from datetime import timedelta from matplotlib import pyplot as plt from urllib.request import * # 定義一個函數讀取lishi.tianqi.com的數據 def get_html(city, year, month): #① url = 'http://lishi.tianqi.com/' + city + '/' + str(year) + str(month) + '.html' # 創建請求 request = Request(url) # 添加請求頭 request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64)' + 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36') response = urlopen(request) # 獲取服務器響應 return response.read().decode('gbk') # 定義3個list列表作為展示的數據 dates, highs, lows = [], [], [] city = 'guangzhou' year = '2017' months = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'] prev_day = datetime(2016, 12, 31) # 循環讀取每個月的天氣數據 for month in months: html = get_html(city, year, month) # 將html響應拼起來 text = "".join(html.split()) # 定義包含天氣信息的div的正則表達式 patten = re.compile('<divclass="tqtongji2">(.*?)</div><divstyle="clear:both">') table = re.findall(patten, text) patten1 = re.compile('<ul>(.*?)</ul>') uls = re.findall(patten1, table[0]) for ul in uls: # 定義解析天氣信息的正則表達式 patten2 = re.compile('<li>(.*?)</li>') lis = re.findall(patten2, ul) # 解析得到日期數據 d_str = re.findall('>(.*?)</a>', lis[0])[0] try: # 將日期字符串格式化為日期 cur_day = datetime.strptime(d_str, '%Y-%m-%d') # 解析得到最高氣溫和最低氣溫 high = int(lis[1]) low = int(lis[2]) except ValueError: print(cur_day, '數據出現錯誤') else: # 計算前、后兩天數據的時間差 diff = cur_day - prev_day # 如果前、后兩天數據的時間差不是相差一天,說明數據有問題 if diff != timedelta(days=1): print('%s之前少了%d天的數據' % (cur_day, diff.days - 1)) dates.append(cur_day) highs.append(high) lows.append(low) prev_day = cur_day # 配置圖形 fig = plt.figure(dpi=128, figsize=(12, 9)) # 繪制最高氣溫的折線 plt.plot(dates, highs, c='red', label='最高氣溫', alpha=0.5, linewidth = 2.0) # 再繪制一條折線 plt.plot(dates, lows, c='blue', label='最低氣溫', alpha=0.5, linewidth = 2.0) # 為兩個數據的繪圖區域填充顏色 plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1) # 設置標題 plt.title("廣州%s年最高氣溫和最低氣溫" % year) # 為兩條坐標軸設置名稱 plt.xlabel("日期") # 該方法繪制斜著的日期標簽 fig.autofmt_xdate() plt.ylabel("氣溫(℃)") # 顯示圖例 plt.legend() ax = plt.gca() # 設置右邊坐標軸線的顏色(設置為none表示不顯示) ax.spines['right'].set_color('none') # 設置頂部坐標軸線的顏色(設置為none表示不顯示) ax.spines['top'].set_color('none') plt.show()
程序中第 32 行代碼使用正則表達式來獲取包含全部天氣信息的 <div.../> 元素,即圖 1 中數字 1 所標識的 <div.../> 元素。
程序中第 34 行代碼使用正則表達式來匹配天氣 <div.../> 中沒有屬性的 <ul.../> 元素,即圖 1 中數字 2 所標識的 <ul.../> 元素。這樣的 <ul.../> 元素有很多個,每個 <ul.../> 元素代表一天的天氣信息,因此,上面程序使用了循環來遍歷每個 <ul.../> 元素。
程序中第 38 行代碼使用正則表達式來匹配每日天氣 <ul...> 中的 <li.../> 元素,即圖 1 中數字 3 所標識的 <li.../> 元素。在每個 <ul.../> 元素內可匹配到 6 個 <li.../> 元素,但程序只獲取日期、最高氣溫和最低氣溫,因此,程序只使用前三個 <li.../> 元素的數據。
以上就是Python如何讀取網絡數據,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。