本文來自 @範洺源 投稿,在其基礎上作了點修改
最近在學爬蟲和數據分析,看到 天氣網 上有國內城市一年的天氣歷史數據,想以此爲數據源練習一下,因而就有了這個項目。今天在此簡單介紹一下實現思路和最終效果。css
用到的相關庫包括:html
天氣網的 歷史天氣預報查詢 頁面( http:// lishi.tianqi.com/)上有各城市的數據。以 北京 爲例,打開頁面以後通過簡單的嘗試就能夠發現,每月的數據是以 http://lishi.tianqi.com/{城市的拼音}/{年份+月份}.html
這樣的地址來展現的,因而可據此構建一個函數,函數的做用是默認返回北京市2018年1月到12月的 url:python
def get_url(city='beijing'): for time in range(201801,201813): url = "http://lishi.tianqi.com/{}/{}.html".format(city,time) yield url
有了 url 地址就能夠用 requests 來抓取。這裏要注意,得加上本身的 cookies ,不然會返回 404 頁面,應該是對方網站作了反爬。拿到返回值以後,我用 bs4 庫的 select 函數提取數據。select 函數使用的是 css 選擇器 的語法。因爲須要進行必定的數據分析,因此這裏沒有將數據保存到文件,而是直接使用 pandas 的 dataframe 進行儲存。編程
html = requests.get(url=url, headers=header, cookies=cookie) soup = BeautifulSoup(html.content, 'html.parser') date = soup.select("#tool_site > div.tqtongji2 > ul > li:nth-of-type(1) > a") max_temp = soup.select("#tool_site > div.tqtongji2 > ul > li:nth-of-type(2)") min_temp = soup.select("#tool_site > div.tqtongji2 > ul > li:nth-of-type(3)") weather = soup.select("#tool_site > div.tqtongji2 > ul > li:nth-of-type(4)") wind_direction = soup.select("#tool_site > div.tqtongji2 > ul > li:nth-of-type(5)") date = [x.text for x in date] max_temp = [x.text for x in max_temp[1:]] min_temp = [x.text for x in min_temp[1:]] weather = [x.text for x in weather[1:]] wind_direction = [x.text for x in wind_direction[1:]] data = pd.DataFrame([date,max_temp,min_temp,weather,wind_direction]).T
對12個月份進行抓取後再彙總,就獲得了北京2018年整年的天氣數據,包括 最高溫度、最低溫度、天氣情況、風向 等信息。適當加工下信息,咱們用一些圖表來進行可視化的展現:cookie
seaborn.distplot(result['平均溫度'])
平均溫度是使用每日最高溫度和最低溫度取平均的值。北京平均溫度在0度和20多度的日子是最多的。app
result.groupby(result['日期'].apply(lambda x:x.month)).mean().plot(kind='line')
seaborn.countplot(result['天氣情況'])
晴天和多雲是北京一年中主要的天氣。echarts
line = pyecharts.Line("各月降水天數統計") line.add("降水天數", month, is_rain, is_fill=True, area_opacity=0.7, is_stack=True) line.add("未降水天數", month, no_rain, is_fill=True, area_opacity=0.7, is_stack=True)
這裏用 pyecharts 作了一個堆疊折線圖。北京的降水天數很少,主要在七、8月份。能夠對比下重慶的數據,差異就很明顯了:函數
directions = ['北風', '西北風', '西風', '西南風', '南風', '東南風', '東風', '東北風'] schema = [] v = [] days = result['風向'].value_counts() for d in directions: schema.append((d,100)) v.append(days[d]) v = [v] radar = pyecharts.Radar() radar.config(schema) radar.add("風向統計", v, is_axisline_show=True)
爲了讓結果更加直觀,這裏採用了 pyecharts 裏的 雷達圖 ,而且將8個維度按真實方向的角度來排列。一般認爲,北京冬季盛行西北風,夏季盛行東南風。不過從數據上來看,西南風纔是北京2018年的最熱門的風向。網站
以上就是我這個項目所作的工做,內容仍是比較基礎的。你們能夠作進一步的擴展,好比爬取其餘的城市,而後進行全國多城市的天氣比較,或者結合地圖進行可視化。url
幾個相關庫的官網都很不錯,供參考:
文章源碼及相關文件已上傳,獲取代碼及可視化效果可在公衆號( Crossin的編程教室 )回覆關鍵字 天氣
本文是咱們編程教室新春徵稿活動的一篇投稿,來自 @ 範洺源 同窗。
咱們編程教室會持續向全部人開放,若是有投稿或參與志願者的意向,歡迎隨時在公衆號裏給咱們留言。
Python | 新手引導 | 一圖學Python
開發案例:智能防擋彈幕 | 紅包提醒 | 流浪地球 | 漫威
歡迎搜索及關注: Crossin的編程教室