您好,登錄后才能下訂單哦!
采集是很多公司都做最的一件事,能夠快速的獲取別人辛苦得來的數據,雖為不道義,但無法禁止!
PHP采集一般方式有:
正則采集。
使用DOM對象采集。
使用字符串函數提取。
這里只說下DOM對象采集的一些問題:
PHP有DOM對象專門用來處理HTML或XML文件,非常方便。
$dom = new DOMDocument('1.0','GBK');//創建DOM對象 @$dom->loadHTMLFile($url);//加載對應的URL地址HTML內容 $xpath=new DOMXPath($dom);//創建DOMXPath對象
DOMXPath對象是一個支持 XPath 路徑表達式,http://www.w3school.com.cn/xpath/
XPath 路徑表達式類似 JQuery選擇器一樣,可以方便的找到對應的節點然后提取內容,當然 XPath 的選擇方式要遠比 JQuery 多。而且還支持很多種函數處理。
注意:
@$dom->loadHTMLFile($url);//加載對應的URL地址HTML內容
這句代碼前面最好加上 @ 符號,因為在加載解析HTML內容時,或多或少會出現錯誤,如:在HTML頁面內一些 & 符號要轉義成 & ,html實體符號必須以 ;結束等等 才能順利解析。而這類要求在采集過程中是不可能的。
采集過程中最讓人麻煩的是中文字符處理,使用正則采集時,中文字符加在正則內雖然方便但容易出錯,正則中寫入中文必須保證被采集的字符集與當前系統代碼字符集是相同的,否則匹配很容易失敗。
使用DOMDocument解析HTML內容,也容易出現中文問題,一般是亂碼,其主要原因是HTML結構不標準,
出現亂碼都是字符集的問題,一般在HTML的head標簽要指定字符集
<meta http-equiv=Content-Type content="text/html;charset=gb2312">
當這個標簽不存在時,DOMDocument在解析時就會以默認的方式去解析這個HTML內容,導致中文編碼錯誤。
所以在使用DOMDocument采集時不要直接使用
@$dom->loadHTMLFile($url);//加載對應的URL地址HTML內容
方式直接加載HTML,這樣只要所采集的HTML內容沒有包含字符集的指定,整個HTML內容解析后中文就不能用。
最好使用:
$ch = curl_init($url);//創建連接 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//輸出內容 curl_setopt($ch, CURLOPT_TIMEOUT, 10);//設置超時時間 $html = curl_exec($ch);//執行連接,獲取內容 if($err=curl_error($ch)){//判斷是否出錯 die($err); }else{ //判斷是否存在這個標簽 if(!stripos('"Content-Type"', $html)&&!stripos('content="text/html;', $html)){ $meta='<head><meta http-equiv="Content-Type" content="text/html; charset=GBK" />'; $html=str_replace('<head>', $meta, $html); } } curl_close($ch); $dom = new DOMDocument('1.0','GBK');//創建DOM對象 @$dom->loadHTML($html);//加載對應的URL地址HTML內容 $xpath=new DOMXPath($dom);//創建DOMXPath對象
對應所采集的頁面字符集,必須核對好。
DOMXPath有兩個函數用來操作內部節點:
query,和evaluate
query:取出給定的XPath表達式節點列表,只要表達式合法,返回DOMNodeList對象,否則返回false。
evaluate:取出給定XPath表達式節點列表,只要表達式合法并且有匹配的節點返回DOMNodeList對象,否則返回false。
兩個函數都是提取節點,只是返回值上有些區別。
DOMNodeList 對象有一個函數和一個屬性:
/* 屬性,節點列表個數 */
readonly publicint $length ;
/* 方法獲取第幾個節點 */
DOMNode DOMNodelist::item ( int $index )
使用item函數獲取的節點 DOMElement 對象 ,
可以使用 getAttribute 獲取節點屬性值,也可以使用 nodeValue 屬性獲取節點內容。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。