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()
全站熱搜
留言列表