close

<前言>

有少部分的讀者問我有沒有爬蟲相關的參考資料可以給他,再加上最近準備去中國工作,短時間內應該不太有機會再碰爬蟲了,因此我就動念想整理一份C#爬蟲的概要,這樣我想我自己以後要重操舊業的時候,還可以比較快有頭緒,知道下哪些關鍵字找參考資料。

其實很多種語言可以寫爬蟲,現在最火熱的爬蟲語言就是python了,但為什麼我會選C#呢,其實只是因為工作上用C#用最多,並且我最熟悉這個語言,比起重新學習一個新語言去完成一個未知的任務,用我熟悉的工具應該會容易得多吧。

我自己過來人的經驗覺得,萬事起頭難,當你有冒出“我想寫一些爬蟲來抓我想要的資料”念頭出現時,到實際開始進入狀況這一段時間是最困難的,剛開始的時候連Google要下什麼關鍵字我都沒頭緒,因此我這一篇會用大綱式的方式來介紹在爬資料的時候我自己目前的流程大概是如何,以及會用到那些套件與工具,這些工具到底扮演著什麼樣的腳色。看完這一篇介紹文,基本上應該能對於爬蟲的運作方式有一個基本了解,若你有一些程式底子並根據下列關鍵字去做搜尋與練習,那爬下一些資料應該是沒什麼問題才是。

 

關鍵字:HtmlJsonHtmlAgilityPackJson.NetFiddler,正規表達式

 

 

1. <理解目標網頁的Url >

 

(圖一)

第一步先理解一下你想抓取的網頁Url:

http://www.twse.com.tw/zh/page/trading/exchange/BWIBBU_d.html

觀察一下後發現,怎麼少了網頁參數?被隱藏了。如果你照著我(圖一)上的Url查詢,永遠會顯示最新一日的資料,那如果你希望查詢歷史資料怎麼辦,你必須輸入年月日,分類項目,甚至必須設定我每一頁要顯示多少筆資料,那就必須把被隱藏的參數找出來,輸入你想輸入的值,這時候就必須借助Fiddler這個工具,它能捕捉所有你用瀏覽器瀏覽網頁的所有行為,找出網頁被隱藏的參數,在做網頁設計時debug也非常有用。

 

 

2. <利用Fiddler找出被隱藏的參數>

 

(圖二)

網路上有很多安裝以及使用說明,我在這就不贅述了,直接切入我們使用上的重點。打開Fiddler後,用瀏覽器瀏覽(圖一)中的網頁,按下網頁中的查詢按鈕,Fiddler會捕捉到一大堆的行為,我則是選取(圖二)中的這一列,按下Inspectors與Raw後,我可以看到實際上網頁其實是對後端Server下了這一條的GET方法:

http://www.twse.com.tw/exchangeReport/BWIBBU_d?response=json&date=20170906&selectType=ALL&_=1504692361850

以“?”為分水嶺,前半段是Url本體,後半段則是參數,參數間則用“&”連接

  • response=json 代表回傳資料格式是使用json,你可以自己選擇更改為html,我在文後再探討Html格式該怎麼爬,json格式又該怎麼爬
  • date=20170906 代表查詢日期
  • selectType=ALL 代表分類項目選為“全部”

後面剩下的參數沒有意義,我則會選擇刪除。因此你會發現,我利用(圖二)的Url查詢結果會是(圖一)中的表格內容,並且我還能更改參數以鎖定我希望查詢的日期以及分類項目。

 

 

3-1. <解析Html & XPath>

接著我們瀏覽修正後的Url:

http://www.twse.com.tw/exchangeReport/BWIBBU_d?response=html&date=20170906&selectType=ALL

(圖三)

這裡你必須對Html標記語言有一點初步的認識,才能解析每一格資料的位置。按下F12叫出開發者工具,你可以找到亞泥殖利率3.31那一格的XPath為 /html/body/div/table/tbody/tr[2]/td[3],它是階層式的,層層剝下來才能找到你要的資料。

 

接下來就要利用C#一個好用的套件叫“HtmlAgilityPack”,這個在google上都有很多說明文件,利用這個套件,你就能連上指定的Url並且解析你鎖定資料的XPath,然後在頁面上把文字讀取回來,接著就能再轉存入你自己的資料庫內。

 

 

3-2. <解析json>

如果把第一個參數改為response=json:

http://www.twse.com.tw/exchangeReport/BWIBBU_d?response=json&date=20170906&selectType=ALL

資料結果就會轉為json格式,這就必須借用Json.Net來解析json資料Json.Net (或稱Newtonsoft.Json),網上也有很多教學,我也就不贅述了

(圖四)

在利用Json.Net的時候,可以不需要搭配HtmlAgilityPack,使用C#內建的WebClient把網頁資料抓下來後,再丟進Json.Net解析也可以

 

 

4.     <正規表示式Regular Expression>

再爬資料的途中,你或許會想做某些篩選,例如股票代號我只想篩出四碼的“股票”,其他什麼六碼的“權證”我通通不想要,這時候就會需要用到正規表示式。

 

 

<結語>

基本上你如果對上面所提到的工具或套件都能有初步的認識之後,從網頁爬資料下來應該就沒什麼問題了,當你走到這一步之後,最後要注意的就是爬蟲的禮節了,最重要的就是注意你的request per second/minute 如果頻率太高對於對方的server造成太大的負荷,可是會被封鎖的喔。最後,如果你對上面提到的工具或者套件,想更深入討論,或是你發現有更好的方式可以爬資料,都歡迎來信與我討論。

 

frank7820055@gmail.com

Frank  2017/9/6

 

arrow
arrow
    全站熱搜

    R-one 發表在 痞客邦 留言(0) 人氣()