php 網頁採集程式總結,最近幫朋友做了個採集程式
以www.xxxx.com/shop_list.php?page=1&province=%B1%B1%BE%A9為例
%B1%B1%BE%A9是gb2312的轉碼,例如
$aa=”北京”;
$aa = @iconv(“utf-8″, “gb2312″,$aa);
echo $bb=urlencode($aa);
我們通過file_get_contents($url) 抓取網頁 當然也可以是curl
function getHtml($url){
$ch2 = curl_init($url);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch2);
curl_close($ch2);
return $html;
}
抓取我們想要的頁面資料,可以設定從哪個位置到哪個位置的區間,取出中間資料,通過以下方法實現
function findneed($wholestr,$strkey1,$strkey2)
{
$num1 = strpos($wholestr , $strkey1)+strlen($strkey1);
$num2 = strpos($wholestr ,$strkey2);
$needstr =substr($wholestr ,$num1,$num2-$num1 );
return $needstr;
}
當然這是一種方法,我們只要寫出一個php即可,根據分頁抓取,但是如果都放在迴圈裡面,豈不是很慢
我們介紹另個演算法
<script>
location.href=”index.php?page=<?=$page?>&provinceIndex=<?=$provinceIndex?>&totalPage=<?=$totalPage?>”;
</script>
通過實現網頁跳轉頁數,抓取,訪問程式,不斷跳轉頁數,把當前url的page 數組儲存到資料庫
其他的無非是些Regex的用法:
比如我們想取頁面中的所有城市
可用preg_match_all(‘/<select name=”province”(.*?)>(.*?)<\/select>/s’,$html,$selects);即可
(.*?)表示任一字元 . 是任何東西 * 是0至無限 ? 是0至1
還有種演算法是遞迴,類似迴圈取值
function collectionProvinceData($url,$province,$page=1,$totalPage=-1){
if($page>$totalPage&&$totalPage>-1){
return false;
}
$collectionUrl = $url."?page=".$page."&province=".urlencode(iconv('UTF-8', 'GB2312', $province));
echo "當前url:".$province."第{$page}頁 url".$collectionUrl."<hr/>";
$html = getHtml($collectionUrl);
$html = mb_convert_encoding($html, 'UTF-8', 'UTF-8,GBK,GB2312,BIG5');
if($totalPage==-1){
$latestPageNum = getLatestPageNum($html);
if($latestPageNum>0){
$totalPage = $latestPageNum;
}
}
$dataRows = getDataRows($html);
saveDataRowsOrNot($dataRows);
if(!empty($dataRows)){
$page++;
}
ob_flush();
flush();
collectionProvinceData($url,$province,$page,$totalPage);
}