PHP網(wǎng)站制作中經(jīng)常需要采集其他網(wǎng)站的數(shù)據(jù),有些細(xì)節(jié)問題會(huì)導(dǎo)致遇到很大麻煩,至于攻防采集在此不細(xì)說(shuō),下面方維網(wǎng)絡(luò)記錄一下采集過(guò)程中的幾個(gè)要點(diǎn)需要注意的地方
1、首先要獲取到對(duì)方網(wǎng)址的所有內(nèi)容,可能你會(huì)想到用file_gets_contents來(lái)獲取,但此函數(shù)不適合用于獲取遠(yuǎn)程文件,用于打開本地txt文件還是蠻好用的。那么用什么來(lái)獲取呢?Curl,這個(gè)php的擴(kuò)展來(lái)處理。下面就是一個(gè)簡(jiǎn)單的獲取網(wǎng)頁(yè)內(nèi)容的基本配置,更多參數(shù)配置可以到網(wǎng)上去搜。
2、在采集網(wǎng)頁(yè)匹配數(shù)據(jù)時(shí),特別是在列表頁(yè),可以先把獲取到的對(duì)方所有的空格換行等html標(biāo)簽去掉,寫起正則來(lái)就會(huì)容易很多。這里提供一個(gè)函數(shù):
3、在獲取到對(duì)方的數(shù)據(jù)的時(shí)候就要開始正則匹配了,這里介紹幾個(gè)常有的匹配規(guī)則:
一個(gè)是任意字符(.*?),另一個(gè)是([\s\S]*?)表示包括換行符的任意字符,在匹配過(guò)程中夠用了。然后選擇匹配模式i即可。
4、介紹一下采集的思路,可以先把符合頁(yè)面的數(shù)據(jù)下載下來(lái)保存為txt文件,再來(lái)本地處理就更快一些。還有就是為了避免頻繁訪問對(duì)方網(wǎng)站或數(shù)據(jù)丟失狀態(tài)可以加一個(gè)while(){}循環(huán)或是sleep()暫停幾秒來(lái)處理。把相關(guān)的數(shù)據(jù)庫(kù)處理函數(shù)要封裝好,直接調(diào)用。
5、還有一個(gè)重要的事情,很多人可能會(huì)忽略,就是頁(yè)面的編碼問題,如果對(duì)方網(wǎng)站是gbk的編碼,則相應(yīng)的php文件或是用于提交條件的html文件也會(huì)是gbk的編碼。但是這會(huì)存在一個(gè)問題,就是發(fā)生在gbk的html向gbk的php頁(yè)面提交中文數(shù)據(jù)的時(shí)候,gbk的php文件可能就不會(huì)給你反應(yīng),如果你用這些中文數(shù)據(jù)去匹配的時(shí)候會(huì)遇到問題。于是要轉(zhuǎn)變思路,utf-8是最好的編碼模式,所以我們要采用utf-8的編碼,而對(duì)方的又是gbk的,如何做呢?
$allcontent =iconv('gbk', 'utf-8',removetag(curl_exec($ch)));
上面的這樣轉(zhuǎn)換就ok了!所有的都用utf-8
本文作者:方維網(wǎng)絡(luò)王國(guó)梁
如沒特殊注明,文章均為方維網(wǎng)絡(luò)原創(chuàng),轉(zhuǎn)載請(qǐng)注明來(lái)自http://m.oulysa.com/news/4092.html