close

因為交通部氣象局的網站大改版,我的爬蟲程式也需要更著更新,也順便把以前程式碼冗長的地方做個修改,於是就做了這個教學。

這個教學我是邊寫程式邊做,以前都想著把程式寫好之後也順便寫個教學,可是每次寫完之後都會懶得做,反正程式能跑就行,也不管到底好不好進行修改,於是這次決定邊寫程式邊做教學,希望會有幫助。

今天要來爬的是交通部氣象局的溫度觀測資料,一般來說要爬蟲的話只需要BeautifulSoup跟 urllib 套件,前者需要特別去下載,後者不用,至於怎麼下載可能我以後會寫教學,或者自己先上網看一看。

(連結:https://www.cwb.gov.tw/V8/C/W/OBS_County.html?ID=63)

先看看網頁,我們需要的資料有測站觀測時間、溫度這兩個欄位,使用chrome瀏覽器對著測站觀測時間按右鍵並點擊檢查,發現所有的觀測資料都在<tbody id=’stations’>的標籤裡面,每一欄的測站資訊都在一個<tr>的標籤裡面,用python檢查一下。

# coding: utf-8
from bs4 import BeautifulSoup
import urllib

url = 'https://www.cwb.gov.tw/V8/C/W/OBS_County.html?ID=63'
urlopen = urllib.request.urlopen(url)

soup = BeautifulSoup(urlopen, features='lxml')

tbody = soup.find('tbody',{'id':'stations'})
print(tbody)

發現<tbody>底下找不到我們要的<tr>標籤,這是因為這個網頁是一個動態生成的網頁,我們向網頁發起請求之後,只能獲得網頁的框架,並不能取得框架內的內容。

我們需要selenium 來模擬點擊網頁的情形,這樣就可以取得我們要的資訊。首先需要到selenium的網頁下載模擬瀏覽器還有安裝套件,就可以爬取動態網頁內的訊息了。(連結: https://docs.seleniumhq.org/download/ )

# coding: utf-8
from bs4 import BeautifulSoup
from selenium import webdriver
import datetime

#全臺測站分區 - 臺北市測站列表
url = 'https://www.cwb.gov.tw/V8/C/W/OBS_County.html?ID=63'

#啟動模擬瀏覽器
driver = webdriver.Chrome()

#取得網頁代馬
driver.get(url)

#指定 lxml 作為解析器
soup = BeautifulSoup(driver.page_source, features='lxml')

#<tbody id='stations'>
tbody = soup.find('tbody',{'id':'stations'})

#<tbody>内所有<tr>標籤
trs = tbody.find_all('tr')

#使用datetime取得時間年分
year = str(datetime.datetime.now().year)

#對list中的每一項 <tr>
for tr in trs:

    #<tr>內的<th>標籤
    th = tr.th

    #取得下個標籤內的文字
    name = th.next_element

    #把字串中測站名稱去除,留下觀測時間
    sp = th.text.split(name)

    #date = 01/1907:00
    date = sp[1]
    
    #date = 201901/1907:00
    date = year + date

    #字串轉為datetime格式
    date = datetime.datetime.strptime(date, '%Y%m/%d%H:%M')

    #測站異常時,溫度='-'
    if not th.nextSibling.text == '-':
        temp = float(th.nextSibling.text)
    else:
        temp = -99

    print(name, temp, date)
    

#關閉模擬瀏覽器       
driver.quit()
arrow
arrow
    全站熱搜

    理性與感性 發表在 痞客邦 留言(0) 人氣()