跳到主要內容

抓抓爬爬的好幫手 PHP CURL

好一個抓爬仔 PHP cURL

現在好流行 “自己的 OO 自己 O” 前次的會議中,看到傳播學院的學生實實在在的貫徹了這個理論,“自己的網頁自己”該學生由於不想一頁一頁的存需要的網頁,自己寫了一個小爬蟲來爬這些網頁的資料存成 CSV 檔。只能在心裡說:同學,留口飯給我們吃啦!

對於爬資料,PHP 裡面除了使用 fopen 的方式抓取網頁,還有一個厲害的抓爬仔函式庫 cURL (client URL)。這個函式庫支援 libcurl,允許我們使用來與不同類型的 Server 做溝通。在 ubuntu 下預設是沒有安裝這個套件,可透過 apt-get 來安裝。

$ sudo apt-get install php5-curl

cURL 函式

使用 PHP cURL 的方法很簡單,只要初始化、設定、執行、關閉四個步驟就好,活用和複雜的部分是在設定這個步驟裡的參數設定。

  1. 初始化

    curl_init() 函式初始化一個 cURL session,會傳回一個 cURL handle 作為後面設定執行等函式使用。初始化的時候可以直接指定 URL ,或保留空白由後面設定中在指定。
  2. 設定

    使用 curl_setopt() 函式設定 cURL session handle 的項目內容,這裡有非常非常多的項目參數可以設定,可以參考 官方網站 curl_setopt 的項目參數說明本文後面僅列出常用的參數。
  3. 執行

    curl_exec() 函式執行一個已經設定好參數的 cURL session。執行成功時會回傳 TRUE 失敗時回傳 FALSE,如果參數裡包含 CURLOPT_RETURNTRANSFER 設定為 TRUE 時,執行成功後會回傳內容。
  4. 關閉

    curl_close() 函式會關閉指定的 cURL session,並釋放資源及刪除 cURL handle。
一個簡單的範例:

// 建立一個新的 cURL session
$ch = curl_init();

// 設置 URL 及其他參數
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);

// 抓取 URL 內容
curl_exec($ch);

// 關閉 cURL session 釋放系統資源
curl_close($ch);

cURL 傳送常用項目參數

Option Note
CURLOPT_RETURNTRANSFER 將獲得的資料傳回
CURLOPT_TIMEOUT 允許 cURL 執行的最長秒數
CURLOPT_CONNECTTIMEOUT 允許和伺服器連線的最長秒數
CURLOPT_POST 啟用後會送出一個常規的 POST 請求
CURLOPT_POSTFIELDS POST 請求時的參數,可以是陣列或字串
CURLOPT_USERAGENT 在 HTTP 請求中加入 user-agent 字串,可用來模擬瀏覽器或其他爬蟲
CURLOPT_COOKIE 設定 HTTP 請求中「Set-Cookie:」部分的內容,以分號 ; 作為參數間的分隔
CURLOPT_COOKIEJAR cURL 收到的 HTTP 請求中 Set-Cookie 存放為檔案的檔案位置
CURLOPT_COOKIEFILE cURL 發出的 HTTP 請求的 Cookie 檔案存放位置
CURLOPT_REFERER 設定 HTTP 請求中「Referer:」部分的值
CURLOPT_FOLLOWLOCATION 遞迴跟隨 「Location:」,可用來跟隨被重新導向的頁面資料
CURLOPT_MAXREDIRS 指定最大重新導向的數量,這個選項是與 CURLOPT_FOLLOWLOCATION 一起使用的。
CURLOPT_VERBOSE 啟用時會報告 cURL 每一件意外的事情
CURLOPT_STDERR 設置一個錯誤輸出地址,值是一個資源類型
抓取資料很有趣也很有挑戰性,會隨著我們的目標不同而有不同的抓法及解析方法,有空再繼續補充了!

留言

這個網誌中的熱門文章

USB裝置無法安全移除解決之道

USB裝置在日常生活的應用上已經越來越普遍,相機、隨身碟、MP3、外接式硬碟等等。當我們在使用了這些設備後,專家都會建議我們一定「 安全的移除硬體裝置 」,尤其在使用了外接式儲存設備以後,正確安全的移除才不會造成設備或資料的毀損,尤其是資料的毀損可就嚴重了。 有時候存取傳送完這些設備後,在移除硬體裝置時會出現「 '一般磁碟區'裝置無法立即停止.請稍候再試 」,這表示還有應用程式還在存取這個裝置,造成無法順利的移除,通常我們只要把存取該裝置的應用程式關閉或移除,有部分軟體需要先把瀏覽到別的資料夾(非外接裝置的資料夾)例如:使用AcdSee、Total Commander之類的軟體。 很多人即使關掉所有的應用程式,無法安全移除的問題還是存在。這是因為系統寫入快取的問題,當寫入資料到外接設備時有些檔案並沒有真正的寫入,而是暫時放到快取,當快取快滿或是要關機時才真正的寫入到外接設備,有時候系統會莫名的忘了寫入...XD,在移除裝置時就會出現上述無法立即停止的錯誤訊息,在網路上爬了一些文,通常這類事件只要 登出再登入 目前的系統使用者帳號就可以獲得解決了。 當然,如果要一直登出登入登出登入,應該會氣到想砸電腦(像辦研討會時,每個講者都是拿USB來插來插去 >. unlocker (236 kb),這款Freeware的軟體,讓你將不需要再當登入登出狂人。 Unlocker 軟體性質: Freeware 最近版本: 1.8.6 作業系統: Windows 2000 / XP / 2003 / Vista 語言界面: 繁體中文 原創公司: Cedrick 'Nitch' Collomb >> Download 滑鼠右鍵 ,在右鍵選單中會多了一個Unlocker的選項,點選Unlocker,這時就會看到是什麼程式或程序還在使用此設備,點選該程式選「 解鎖 」,完成後應該就可以順利在系統列上安全的移除硬體裝置了。

Word的合併列印如何出現「千分位」符號

今天樓下的同事突然問我一個問題,合併列印的時候如何顯示「千分位符號」(逗號),就是12 , 300。在Excel我們可以很容易的為儲存格裡的數字加上千分位的標記,但是儲存格實際儲存的還是只有數字,那個千分位符號是Excel給我們看的一種「格式」。 當我們在Word裡使用Excel做好的報表來合併列印的時候,Word會最真實的將這個數字欄位給讀出來,呈現在合併列印的欄位數值裡,無論在Excel理事不是有設定千分位符號,在Word合併列印後卻沒有出現,所以我們同樣的必須給他加上格式。 Word裡加上格式並不如Excel裡按一下就完成,加上逗號的千分位格式方法如後: 1.在Word裡插入合併列印的欄位變數。 2.在變數上按滑鼠右鍵,選擇「切換功能變數代碼」(也可以直接按Alt+F9),變數會由 經費 >> 變成 { MERGEFIELD "經費" } 。 3.加上格式就是把 { MERGEFIELD "經費" } 在}前加入數字格式參數 /##,###,會成為 { MERGEFIELD "經費" /# ##,### }(這裡指定五位數,以此類推) #:這個格式項目會指定要在結果中顯示的必要位數;如果結果不含該位數的數字,則 Word 會顯示一個空格。 0:這個格式項目會指定要在結果中顯示的必要位數;如果結果不含該位數的數字,則 Word 會顯示 0 (零)。 4.預覽內容,就可以發現千分位(逗號)出現,如果數值有零的話,最好可以換成 /# ##,## 0 ,避免空格出現。 數字格式參數請參考 Microsoft Office Online 。

使用 Stackedit 發佈至 Blogger

使用 StackEdit 發佈至 Blogger 目前部落格裡新的文章幾乎都是在 StackEdit 上使用 Markdown 來完成撰寫,是一個舒適的撰寫體驗,也更能讓自己專注在文章的撰寫,不用去調整版面上的細節。StackEdit 除了可以將文本直接存在 Google Drive 上,圖形直接嵌入引用 Google+ 相簿,讓整個寫作的流程都是在雲端上完成,另外一個我喜歡的優點,是能夠直接將寫好的文章發佈到自己的部落格上。 發佈至 Blogger 部落格 將文章發佈至 Blogger 上的方法非常簡單,在 StackEdit 的左上角開啓左邊的功能列,拉開 Publish 項目並點選 Blogger,如下圖: 第一次使用時會導引至 Google 的授權頁,回到彈出的對話視窗,填寫好 Blogger 的 URL 內容。新發佈不用填寫 POST ID,這個是未來若需要更新內容的時候使用的。 按下「OK」後就完成發佈的動作,發佈完成後,在 StackEdit 該篇文章的右上角會出現 Blogger 的 Icon。 部落格的樣本改造 文章發佈至 Blogger 後有的模板會有小小的問題,如果我們使用 Markdown 時沒有寫入圖片的最大寬度,插入的圖片若比較大就會造成圖形突破樣板的驚嚇感。 這個可以透過自己改造Blogger 模板內容的 CSS,將圖片最大限制在某個數值。簡單一點的方式,是選擇現在 Blogger 中就已經有限制圖片大小的佈景主題。 程式碼高亮標識 StackEdit 的程式區塊是有支援程式碼高亮標識(Highlight)的功能,預設是使用 Highlight.js 的函式庫,也可以使用 Google prettify。Highlight.js 目前已經支援 118 種的程式語法自動偵測。還有 54 種的 Style 可以選擇。但是發佈至 Blogger 後因模板沒有相關的引入,所以程式碼區塊就和一般的文字一樣,沒有區塊和程式碼標識的區別。 我們可以透過修改 Blogger 的樣板的樣式,引入 Highlight.js 的函式庫與樣式。進入 Blogger 的後臺管理頁面,在左方的選單中選擇 範本 ,然後右方選 編輯 HTML ,開啓樣板的 HTML 編輯畫面。 我們可以在 Highlight.js ...