這裡介紹以Python自帶的模組 urllib、urllib2 開發高鐵時刻查詢的爬蟲
[程式碼]
以下的程式實作以POST
方法向 高鐵時刻查詢網站 發送一個Request
並加入User-Agent的header,將這隻爬蟲偽裝成Mac系統的Chorme瀏覽器
獲得response後,取得該網址的 html 原始碼,存成一個名為02_thsrc.html的檔案
# encoding: utf-8
import urllib,urllib2
url = "http://www.thsrc.com.tw/tw/TimeTable/SearchResult"
request = urllib2.Request(url)
request.add_header("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36")
form_data = {
"StartStation": "977abb69-413a-4ccf-a109-0272c24fd490",
"EndStation": "f2519629-5973-4d08-913b-479cce78a356",
"SearchDate": "2016/01/10",
"SearchTime": "17:00",
"SearchWay":"DepartureInMandarin",
"RestTime":"",
"EarlyOrLater":""
}
form_data = urllib.urlencode(form_data)
response = urllib2.urlopen(request,data=form_data)
html = response.read()
file_out = file("02_thsrc.html",'w')
file_out.write(html)
file_out.close()
[程式說明]
在這個範例程式中,我們要查詢的是從台北到左營2016/01/10 17:00出發可能班次
從Chrome開發人員工具可以看到高鐵時刻查詢
是以POST方式發送request,也可以看到Form Data的樣貌
另外,我們從開發人員工具中看到的Form Data的格式並不是真正向Server發送的格式,
利用view URL encoded
看到的才是真正的格式
在程式中form_data是以dictionary的方式儲存資料,
在傳送時需要透過urllib這個module來做urlencode才能當成最後傳送出去的資料
而高鐵網站會檢查發送request的對象,若為爬蟲程式會阻擋,
因次我們需要將此爬蟲程式偽裝成瀏覽器
也就是在header中的User-Agent屬性加上資料
這個值可以從Chrome開發人員工具中Network看到的User-Agent直接複製
{替換查詢內容}
從Form Data大概看得出2016/01/10、17:00的資訊,
但起訖站卻沒有看到「台北」跟「左營」這兩個關鍵字,
我們可以從StartStation、EndStation這兩個名稱猜測,這兩個特殊的編碼應該分別代表「台北」跟「左營」
利用檢查元素的方式,可以看到在開發人員工具中,各站名的value,也就是這些特殊的編碼
也可以看到以出發時間查詢的value是DepartureInMandarin
若要查詢其他地區或是改成以抵達時間的查詢方式就可用這些value來替換
爬蟲系列教學文目錄
爬蟲系列教學文程式碼
安裝Python及Python常用語法可參考 Python - 十分鐘入門