最近有個任務是須要我檢查一些網站,若是純手工檢查的話,感受既費時又無聊。因此我就想用採集。思路其實很簡單,先把網站的源碼採集下來,而後用正則表達式去匹配符合的連接,最後把標題和網址入庫、分析。由於我使用最多的是php,因此打算用php作網頁採集。php
第一步,連接數據庫,取出須要檢查的網站和正則。html
數據庫這裏我用了postgresql,數據庫和表已經按要求建好。由於默認配置的環境是centos系統加nginx、mysql和php,因此首先是配置環境。配置具體不在這裏多說,下次總結。環境配置好後在php中用pg_connect鏈接數據庫,這裏我鏈接了兩個不一樣的數據庫。mysql
$conn_1=pg_connect("host=xxx.xxx.xxx.xxx port=5432 dbname=mydb1 user=postgres password=xxxxxx") ;nginx
$conn_2=pg_connect("host=xxx.xxx.xxx.xxx port=5432?dbname=mydb2?user=postgres password=xxxxxx") ;正則表達式
第二步,取出網頁源碼,對源碼進行初步處理。sql
不一樣網站編碼格式不同,須要先把編碼統一轉換成utf-8,否則以後入庫會出現亂碼。數據庫
//獲取網頁源碼centos
//$url='http://www.sijitao.net/' ;數組
$str = file_get_contents($url);函數
//使用preg_match和正則表達式取出編碼
$wcharset = preg_match("/<meta.+?charset=[^\w]?([-\w]+)/i",$str,$temp) ? strtolower($temp[1]):"" ;
//編碼轉換
if($wcharset){
$str=iconv("$wcharset", "UTF-8", $str) ;
}
這裏我還使用str_ireplace()函數對取到的源碼作了些字符替換,否則最後用正則匹配網址的時候會出現問題。
第三步,匹配處理後的源碼字符串,對匹配的數據入庫。
從數據庫中取出對應的正則,保存在$preg變量,符合正則的數據已數組形式保存在$m。
$pat = "/<a(.*?)href=\"($preg)\"(.*?)>(.*?)<\/a>/is";
preg_match_all($pat, $str, $m);
$cnt=count($m[2]) ;
for($i=0;$i<$cnt;$i++){
if(strip_tags($m[2][$i])){
$url=strip_tags($m[2][$i]) ;
$url=$m[2][$i] ;
}
if(strip_tags($m[4][$i])){
$title=strip_tags($m[4][$i]) ;
}
else{
$title="There's Something Errors!" ;
}
//編寫代碼,對title和url進行入庫操做。
}
}
採集單個網頁這樣基本上就算完成了。總結,這裏其實就用了preg_match(),preg_match_all()和str_ireplace()函數。程序菜鳥,寫的很差請見諒。