接上一篇,為了在抓取的頁面內容中提取我們想要的信息,我們一般要用正則來處理頁面內容結果。
比如preg_match_all 函數,可以把符合規則的內容 存到一個數組裡面。
用法:
$content=file_get_contents("http://health.china.com/html/breast/fxlan/1.html"); $pattern = "@http://www.yjbys.com/zhaopinhui/index.asp\?rq=(.*?)\">(.*?)@i"; $flag = preg_match_all($pattern,$content,$m);
這裡$flag會有兩個結果,一是沒有匹配到符合規則$pattern的內容,返回false;一是匹配到符合規則的內容,將內容存儲在數組$m裡。你可以print_r($m); 來檢查$m到底有沒有內容。
采集就是如此簡單。
當然,取得內容後的操作,就不一一說了,無非是入庫之類的操作。
在這裡要提一下如何才能提高采集效率,就是讓你的采集程序跑起來不會太占資源以至於拖垮服務器!
1.在采集程序開始前 先臨時定義一下php環境的的限制,如此可以預防跑著跑著突然停止的尴尬。同時也可預防php崩潰。
//腳本最長的運行時間 set_time_limit(180000); //臨時調整的php可用的內存 $r = ini_set("memory_limit","500M") ; //PCRE的最大回溯(backtracking)步數。貌似跟for循環的次數緊密相關 $r = ini_set("pcre.backtrack_limit","8000") ; //PCRE的最大遞歸(recursion)深度。如果你將該值設的非常高,將可能耗盡進程的棧空間,導致PHP崩潰 $r = ini_set("pcre.recursion_limit","8000") ;
2.多點用strpos,substr,explode,str_replace函數,而盡量少用preg_match_all,preg_match()這類正則函數,因為這類函數的效率實在不咋樣,我一般都是先用strpos,substr,explode,str_replace函數處理,實在不行,才會用preg_match_all,preg_match
最後也發一下preg_match的用法例子:
//這個表示在字符串$name中查找css字符,將匹配的個數放到$matches裡去。 preg_match("/css/", $name, $matches) $cont=preg_replace("/(?<=href=)([^\>]*)(?=\>)/i","", $cont); //過濾url $cont=preg_replace( "/.*<\/script>/isU ", "", $cont );//過濾掉javscript
替換所有 class=innerlink 的 a 標簽:
$content = preg_replace('/<A\s+class=innerlink.*?>(.*?)<\/A>/i', '${1}', $content);
上面是兩個正則替換的例子。
基本上采集就這些了,而有關正則的話題,下一篇繼續…