1. 程式人生 > >python爬天氣網歷史資料

python爬天氣網歷史資料

#爬取天氣網氣象資料____聶拉木
from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import pandas as pd
## 生成爬取網址 由於氣象網資料的網站連結地址比較特殊,採用如http://lishi.tianqi.com/nielamu/201102.html 即 http://lishi.tianqi.com/ + 城市 + 時間的形式 所以首先生成爬取的網頁的地址
#生成url連結
def year_month():
    urllist = []
    for i in range(2011
,2018): for j in range(1,13): if j <10: url_text = 'http://lishi.tianqi.com/nielamu/'+str(i)+'0'+str(j)+'.html' else: url_text = 'http://lishi.tianqi.com/nielamu/'+str(i)+str(j)+'.html' urllist.append(url_text) return urllist url_list = year_month() #到現今共可取url_list[0:79]
url_list[1:5]
[‘http://lishi.tianqi.com/nielamu/201102.html’, ‘http://lishi.tianqi.com/nielamu/201103.html’, ‘http://lishi.tianqi.com/nielamu/201104.html’, ‘http://lishi.tianqi.com/nielamu/201105.html’]

如下圖網站中的資料儲存在如下表格中

這裡寫圖片描述

檢視原始碼發現 所需的資料在 div的tqtongji2 下

這裡寫圖片描述

因此使用BeautifulSoup解析網頁原始碼,並且使用find函式尋找 div class=”tqtongji2” 標籤

然後繼續使用find_all函式解析ul 標籤, ul標籤內包含了所需資料

#獲取天氣網下天氣情況部分的資料
def weather_scraping(url):
    html = urlopen(url)
    bsObj = BeautifulSoup(html.read())
    div = bsObj.find("div",'tqtongji2')
    ul = div.find_all('ul')
    return ul
可以看出weath_scraping函式 返回的是一個list 包含了div 下的每個 ul標籤
weul = weather_scraping(url_list[0])
isinstance(weul , list)
True 解析每一個ul標籤,用get_text函式取出li標籤下的資料,然後儲存為datafram 格式
#解析獲取的ul標籤內資料 , 返回datafram 格式資料
def analysis_ul(url):
    ul = weather_scraping(url)
    weather_list = []
    for ul_text in ul[1:]:
        li_text = ul_text.find_all('li')
        day_data = []
        for text in li_text:
            data= text.get_text()
            day_data.append(data)

        weather_list.append(day_data)

    columns = [ i.get_text() for i in ul[0].find_all('li')]
    weather_pd = pd.DataFrame(weather_list , columns=columns )
    return weather_pd
## 遍歷所有的網址 生成一個總的datafram 並儲存
#爬取資料
weather_data = analysis_ul(url_list[0])
for i in url_list[1:79]:
    data_month  = analysis_ul(i)
    weather_data = weather_data.append(data_month,ignore_index=1)
#儲存資料
weather_data.to_csv('weather_201101_201707.txt' , index = False , sep = ',')
weather_data.head(7)
日期 最高氣溫 最低氣溫 天氣 風向 風力
0 2011-01-01 3 -7 無持續風向~西風 微風~7-8級
1 2011-01-02 5 -6 西風 7-8級
2 2011-01-03 6 -5 西風~無持續風向 7-8級~微風
3 2011-01-04 4 -6 無持續風向 微風
4 2011-01-05 3 -7 晴~多雲 無持續風向 微風
5 2011-01-06 2 -8 晴~多雲 無持續風向 微風
6 2011-01-07 0 -8 無持續風向 微風
7 2011-01-08 0 -13 無持續風向 微風

7 rows × 6 columns