使用php發送Http請求,抓取網頁資料
做過j2ee 或android開發的童鞋,應該或多或少都使用過Apeache的HttpClient類庫吧。這個類庫給我們提供了十分強大的服務端Http請求操作。在開發中使用起來十分的方便。
最近做php的開發,也有需要在服務端發送http請求,然後處理返回到用戶端,如果用socket來做,未必又太麻煩了,心想這看看php中有沒有類似HttpClient這樣的類庫。
Google了一下,發現php中還真有這麼一個類庫,而且名字就叫做httpclient,相當的激動啊,到官網一看,發現已經好多年都沒更新過了,而且功能貌似也有限,大失所望啊。接著我找到了另外一個類庫Snoopy,對於這個類庫我也不瞭解,不過看網上的響應還不錯,於是決定就用他了。他的API使用和Apeache的HttpClient差別很大,但是還是十分容易使用。而且提供了許多特殊用途的方法,比如可以只抓去頁面中的form表單,或者所有的連結等等。
include 'Snoopy.class.php';$snoopy = new Snoopy();$snoopy->fetch("http://www.baidu.com");echo $snoopy->results;
上面這幾句代碼,就可以很輕鬆的將百度的頁面抓取過來。
當然在需要發送post表單時,可以使用submit方法來提交資料。
同時他還通過了要求標頭,相應頭以及Cookie的相關操作函數,十分的強大。
include "Snoopy.class.php";$snoopy = new Snoopy();$snoopy->proxy_host = "http://www.baidu.cn";$snoopy->proxy_port = "80";$snoopy->agent = "(compatible; MSIE 4.01; MSN 2.5; AOL 4.0; Windows 98)";$snoopy->referer = "http://www.4wei.cn"; $snoopy->cookies["SessionID"] = '238472834723489';$snoopy->cookies["favoriteColor"] = "RED";$snoopy->rawheaders["Pragma"] = "no-cache";$snoopy->maxredirs = 2;$snoopy->offsiteok = false;$snoopy->expandlinks = false;$snoopy->user = "joe";$snoopy->pass = "bloe";if($snoopy->fetchtext("http://www.baidu.cn")) {echo "" . htmlspecialchars($snoopy->results) . "
\n";} else {echo "error fetching document: " . $snoopy->error . "\n";}更多的操作方法,可以去Snoopy的官方查看文檔,或者是直接查看原始碼。
到這裡,snoopy也僅僅是把頁面抓取回來,如果要對抓取回來的頁面進行資料提取,那麼它就幫不上什麼忙了。這裡我又找到了另外一個php解析html的好工具:phpQuery,它提供的操作方法和jquery幾乎一模一樣,而且提供了一些php的特性,熟悉jquery的童鞋,用phpquery應該是相當的順手啊,甚至phpQuery的文檔都不需要了..
使用Snoopy+PhpQuery可以很方便的實現網頁的抓取和資料解析,十分有用啊,我也是最近有這方面的需要,才發現了這兩個不錯的類庫啊,原來很多java可以做的事情,php也能做哦。
有興趣的同學,也可以試試用他們來做個簡易的網頁爬蟲哦。