1. 程式人生 > >用PHP獲取網頁上的信息相對於xpath效率低點

用PHP獲取網頁上的信息相對於xpath效率低點

所有 pat ini 自己 str rpo fwrite echo bst

用php實現對網頁的抓取,及信息的收集,其實就是爬數據,具體實現步驟如下,首先應引入兩個文件curl_html_get.php和save_file.php文件,兩個文件具體代碼是這樣的curl_html_get.php內代碼為

<?php
function curl_get_file_contents($url) { $c = curl_init(); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); curl_setopt($c, CURLOPT_URL, $url); $contents = curl_exec($c); curl_close($c); if ($contents) return $contents; else return FALSE; } ?> save_file.php文件內容是 <?php
/** * 連續創建目錄 * * @param string $dir 目錄字符串 * @param int $mode 權限數字 * @return boolean */ function make_dir($dir, $mode = "0777") { if (!$dir) return false;
if(!file_exists($dir)) { return mkdir($dir,$mode,true); } else { return true; } }
/** * 保存文件 * * @param string $fileName 文件名(含相對路徑) * @param string $text 文件內容 * @return boolean */ function save_file($filename, $text) { if (!$filename || !$text) return false;
$dirname = dirname($filename); if (make_dir($dirname)) { // file_put_contents($filename, $text, FILE_APPEND); file_put_contents($filename, $text); // if (is_resource($fp = fopen($filename, "w+"))) { // if (@fwrite($fp, $text)) { // fclose($fp); // return true; // } else { // fclose($fp); // return false; // } // } } return false; }

?> 其實就是一個是獲取網頁內容的,另一個是創建文件的。 然後就是PHP代碼了,自己定義一個函數 函數內代碼基本是這樣的 echo "==================start=======================<br />"; // 1、獲取網頁 $path = THIS_PATH . "download"; $url = "http://10.maigoo.com/list_1187.html"; $pathinfo = pathinfo($url); $html_pathname = $path . DS; $html_filename = $html_pathname . "list_1187.htm"; if (!file_exists($html_filename)) { $text = curl_get_file_contents($url); save_file($html_filename, $text); } else { $text = file_get_contents($html_filename); }
// 2、獲取區域 //start pos $start = ‘<div class="b-brand-nlist hoverdetail">‘; //end pos $end = ‘<div id="copyright">‘; $pos_start = strpos($text, $start); $pos_end = strpos($text, $end, $pos_start); $pos_end += strlen($end); $content = substr($text, $pos_start, $pos_end-$pos_start); save_file($html_pathname."list_1187.html", $content); // 3、獲取所有的一級 $pattern = ‘@<div class="aclist">.*<div class="clear"></div>@Usi‘; if (!preg_match_all($pattern, $content, $matches)) { die("===============not match anything===================<"); } echo "=========================================<br />"; $index = 0; foreach ($matches[0] as $pinpai_cate) { save_file($html_pathname. $index . ".html", $pinpai_cate); // 獲得一級分類 url 和 name get_level1_url_and_name($pinpai_cate, $cate1_url, $cate1_name);
// echo "==================$一個品牌=======================<br />"; $pattern = ‘@<li addbg="#400143".*</li>@Usi‘; if (preg_match_all($pattern, $content, $matches)) { foreach($matches[0] as $one_brand); } } echo "==================end=======================<br />"; } 基本原理就是先獲取下載網頁到本地,然後截取,最後用正則匹配。自己做得過程中沒有對代碼進行調優,導致代碼太長,重復的地方太多,若截取的地方用正則還是無法判斷,或者說區域有很多重復點,就需要再次截取接著排除幹擾,比較繁瑣,另外需要多寫函數,把所有代碼優化之後才能更深入提高自己水平。

用PHP獲取網頁上的信息相對於xpath效率低點