almost 3 years ago

這裡介紹以Python自帶的模組 urllib、urllib2 開發高鐵時刻查詢的爬蟲

[程式碼]

以下的程式實作以POST方法向 高鐵時刻查詢網站 發送一個Request
並加入User-Agent的header,將這隻爬蟲偽裝成Mac系統的Chorme瀏覽器
獲得response後,取得該網址的 html 原始碼,存成一個名為02_thsrc.html的檔案

02_POST_urllib2.py
# 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 - 十分鐘入門

← [爬蟲] 觀察技巧 with Chrome開發人員工具 [爬蟲] 處理不同的Content-Type(urllib2) →
 
comments powered by Disqus