采集是很多公司都做最的一件事,能夠快速的獲取別人辛苦得來(lái)的數(shù)據(jù),雖為不道義,但無(wú)法禁止!
創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、成都網(wǎng)站制作與策劃設(shè)計(jì),柯橋網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:柯橋等地區(qū)??聵蜃鼍W(wǎng)站價(jià)格咨詢:18982081108
PHP采集一般方式有:
正則采集。
使用DOM對(duì)象采集。
使用字符串函數(shù)提取。
這里只說(shuō)下DOM對(duì)象采集的一些問(wèn)題:
PHP有DOM對(duì)象專門用來(lái)處理HTML或XML文件,非常方便。
$dom = new DOMDocument('1.0','GBK');//創(chuàng)建DOM對(duì)象 @$dom->loadHTMLFile($url);//加載對(duì)應(yīng)的URL地址HTML內(nèi)容 $xpath=new DOMXPath($dom);//創(chuàng)建DOMXPath對(duì)象
DOMXPath對(duì)象是一個(gè)支持 XPath 路徑表達(dá)式,http://www.w3school.com.cn/xpath/
XPath 路徑表達(dá)式類似 JQuery選擇器一樣,可以方便的找到對(duì)應(yīng)的節(jié)點(diǎn)然后提取內(nèi)容,當(dāng)然 XPath 的選擇方式要遠(yuǎn)比 JQuery 多。而且還支持很多種函數(shù)處理。
注意:
@$dom->loadHTMLFile($url);//加載對(duì)應(yīng)的URL地址HTML內(nèi)容
這句代碼前面最好加上 @ 符號(hào),因?yàn)樵诩虞d解析HTML內(nèi)容時(shí),或多或少會(huì)出現(xiàn)錯(cuò)誤,如:在HTML頁(yè)面內(nèi)一些 & 符號(hào)要轉(zhuǎn)義成 & ,html實(shí)體符號(hào)必須以 ;結(jié)束等等 才能順利解析。而這類要求在采集過(guò)程中是不可能的。
采集過(guò)程中最讓人麻煩的是中文字符處理,使用正則采集時(shí),中文字符加在正則內(nèi)雖然方便但容易出錯(cuò),正則中寫入中文必須保證被采集的字符集與當(dāng)前系統(tǒng)代碼字符集是相同的,否則匹配很容易失敗。
使用DOMDocument解析HTML內(nèi)容,也容易出現(xiàn)中文問(wèn)題,一般是亂碼,其主要原因是HTML結(jié)構(gòu)不標(biāo)準(zhǔn),
出現(xiàn)亂碼都是字符集的問(wèn)題,一般在HTML的head標(biāo)簽要指定字符集
<meta http-equiv=Content-Type content="text/html;charset=gb2312">
當(dāng)這個(gè)標(biāo)簽不存在時(shí),DOMDocument在解析時(shí)就會(huì)以默認(rèn)的方式去解析這個(gè)HTML內(nèi)容,導(dǎo)致中文編碼錯(cuò)誤。
所以在使用DOMDocument采集時(shí)不要直接使用
@$dom->loadHTMLFile($url);//加載對(duì)應(yīng)的URL地址HTML內(nèi)容
方式直接加載HTML,這樣只要所采集的HTML內(nèi)容沒(méi)有包含字符集的指定,整個(gè)HTML內(nèi)容解析后中文就不能用。
最好使用:
$ch = curl_init($url);//創(chuàng)建連接 curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//輸出內(nèi)容 curl_setopt($ch, CURLOPT_TIMEOUT, 10);//設(shè)置超時(shí)時(shí)間 $html = curl_exec($ch);//執(zhí)行連接,獲取內(nèi)容 if($err=curl_error($ch)){//判斷是否出錯(cuò) die($err); }else{ //判斷是否存在這個(gè)標(biāo)簽 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');//創(chuàng)建DOM對(duì)象 @$dom->loadHTML($html);//加載對(duì)應(yīng)的URL地址HTML內(nèi)容 $xpath=new DOMXPath($dom);//創(chuàng)建DOMXPath對(duì)象
對(duì)應(yīng)所采集的頁(yè)面字符集,必須核對(duì)好。
DOMXPath有兩個(gè)函數(shù)用來(lái)操作內(nèi)部節(jié)點(diǎn):
query,和evaluate
query:取出給定的XPath表達(dá)式節(jié)點(diǎn)列表,只要表達(dá)式合法,返回DOMNodeList對(duì)象,否則返回false。
evaluate:取出給定XPath表達(dá)式節(jié)點(diǎn)列表,只要表達(dá)式合法并且有匹配的節(jié)點(diǎn)返回DOMNodeList對(duì)象,否則返回false。
兩個(gè)函數(shù)都是提取節(jié)點(diǎn),只是返回值上有些區(qū)別。
DOMNodeList 對(duì)象有一個(gè)函數(shù)和一個(gè)屬性:
/* 屬性,節(jié)點(diǎn)列表個(gè)數(shù) */
readonly publicint $length ;
/* 方法獲取第幾個(gè)節(jié)點(diǎn) */
DOMNode DOMNodelist::item ( int $index )
使用item函數(shù)獲取的節(jié)點(diǎn) DOMElement對(duì)象 ,
可以使用 getAttribute 獲取節(jié)點(diǎn)屬性值,也可以使用 nodeValue 屬性獲取節(jié)點(diǎn)內(nèi)容。
本文題目:PHP使用DOMDocument采集
文章分享:http://aaarwkj.com/article20/iposco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、網(wǎng)站收錄、網(wǎng)站內(nèi)鏈、定制網(wǎng)站、網(wǎng)站改版、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)