這裡介紹以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 - 十分鐘入門
這裡介紹以Python自帶的模組 urllib2 開發抓取MoneyDJ的人氣指數的爬蟲
[程式碼]
# encoding: utf-8
import urllib,urllib2
url = "http://www.moneydj.com/InfoSvc/apis/vc"
request = urllib2.Request(url)
request.add_header("Content-Type","application/json")
payload = '{"counts":[{"svc":"NV","guid":"a180a15b-9e4f-4575-b28f-927fcb5c63a3"}]}'
response = urllib2.urlopen(request,data=payload)
html = response.read()
print html
輸出結果
{"counts":[{"count":3609,"guid":"a180a15b-9e4f-4575-b28f-927fcb5c63a3","svc":"NV"}]}
[程式說明]
在這個範例程式中,我們要抓取MoneyDJ的人氣指數
由於此網頁的人氣指數並不是直接輸出在html原始碼中(原始碼的是假人氣資料)
而是另外透過http://www.moneydj.com/InfoSvc/apis/vc 這隻 api 去產生真實的人氣指數
且透過開發人員工具,我們也可以看到 request header 的 Content-Type 為 json
而此API是透過POST的方式傳遞資料,
我們直接將 Request Payload 的資料複製貼上(按下view source會產生程式內的格式)
程式輸出的結果就有包含正確的人氣指數3609
爬蟲系列教學文目錄
爬蟲系列教學文程式碼
安裝Python及Python常用語法可參考 Python - 十分鐘入門