国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

一個PHP實現的輕量級簡單爬蟲

2024-05-04 23:37:25
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了一個PHP實現的輕量級簡單爬蟲,本文總結了爬蟲的一些知識如爬蟲的結構、正則表達式、其他問題等,然后給出了爬蟲實現代碼,需要的朋友可以參考下
 

最近需要收集資料,在瀏覽器上用另存為的方式實在是很麻煩,而且不利于存儲和檢索。所以自己寫了一個小爬蟲,在網上爬東西,迄今為止,已經爬了近百 萬張網頁。現在正在想辦法著手處理這些數據。

爬蟲的結構:
   爬蟲的原理其實很簡單,就是分析下載的頁面,找出其中的連接,然后再下載這些鏈接,再分析再下載,周而復始。在數據存儲方面,數據庫是首選,便于檢索,而 開發語言,只要支持正則表達式就可以了,數據庫我選擇了mysql,所以,開發腳本我選擇了php。它支持perl兼容正則表達式,連接mysql很方 便,支持http下載,而且windows系統和linux系統都可以部署。

正則表達式:
  正則表達式是處理文字的基本工具,要取出html中的鏈接和圖片,使用的正則表達式如下。

 

復制代碼代碼如下:

   "#<a[^>]+href=(['/"])(.+)//1#isU"   處理鏈接
    "#<img[^>]+src=(['/"])(.+)//1#isU" 處理圖片

 

其他問題:
  寫爬蟲還需要注意的一個問題是,對于已經下載過的url,不能重復進行下載,而有些網頁的鏈接會形成環路,所以需要處理這個問題,我的處理方法是計算已經 處理的url的MD5 值,并存入數據庫,這樣就可以檢驗是否已經下載過。當然還有更好的算法,有興趣的話,可以在網上找一下。

相關協議:
  爬蟲也有自己的協議,有個robots.txt文件定義了那些是網站允許遍歷的,但是由于我的時間有限,沒有實現這個功能。

其他說明:
  php支持類編程,我寫的爬蟲主要的類.
  1.url處理web_site_info,主要用處理url,分析域名等。
  2.數據庫操作mysql_insert.php,處理和數據庫相關的操作。
  3.歷史記錄處理,記錄已經處理的url。
  4.爬蟲類。

存在的問題和不足

  這個爬蟲在小數據量的情況下,運行良好,但是在大數據量的情況下,歷史記錄處理類的效率就不是很高,通過在數據庫結構中,對相關字段進行了索引,速度有了 提高,但是需要不斷得讀取數據,可能和php本身的array實現有關系,如果一次加載10萬條歷史記錄,速度非常慢。
  不支持多線程,每次只能處理一個url。
  php運行本身有內存使用量限制,有一次在抓取深度為20的頁面的時候,內存用盡程序被殺。

下面的url是源碼下載。


使用的時候,先在mysql中創建net_spider數據庫,然后用db.sql創建相關表。再在config.php中設置mysql 的用戶名口令。
最后

 

復制代碼代碼如下:

php -f spider.php 深度(數值) url 

 

就可以開始工作。如

 

復制代碼代碼如下:

php -f spider.php 20 http://news.sina.com.cn

 

現在感覺下來,其實做個爬蟲沒那么復雜,難的是數據的存儲和檢索。我現在的數據庫,最大一個數據表已經15G,正在想辦處理這些數據,mysql進 行查詢已經感覺有點力不從心了。這點上還真佩服google
 

  1. <?php 
  2. #加載頁面 
  3. function curl_get($url){ 
  4.     $ch=curl_init(); 
  5.     curl_setopt($ch,CURLOPT_URL,$url); 
  6.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
  7.     curl_setopt($ch,CURLOPT_HEADER,1); 
  8.     $result=curl_exec($ch); 
  9.     $code=curl_getinfo($ch,CURLINFO_HTTP_CODE); 
  10.     if($code!='404' && $result){ 
  11.      return $result; 
  12.     } 
  13.     curl_close($ch); 
  14. #獲取頁面url鏈接 
  15. function get_page_urls($spider_page_result,$base_url){ 
  16.   $get_url_result=preg_match_all("/<[a|A].*?href=[/'/"]{0,1}([^>/'/"/]*).*?>/",$spider_page_result,$out); 
  17.   if($get_url_result){ 
  18.     return $out[1]; 
  19.   }else
  20.     return
  21.   } 
  22. #相對路徑轉絕對路徑 
  23. function xdtojd($base_url,$url_list){ 
  24.  if(is_array($url_list)){ 
  25.   foreach($url_list as $url_item){ 
  26.     if(preg_match("/^(http:////|https:////|javascript:)/",$url_item)){ 
  27.       $result_url_list[]=$url_item; 
  28.     }else { 
  29.      if(preg_match("/^///",$url_item)){ 
  30.       $real_url = $base_url.$url_item; 
  31.      }else
  32.       $real_url = $base_url."/".$url_item; 
  33.      } 
  34.      #$real_url = 'http://www.sumpay.cn/'.$url_item;  
  35.      $result_url_list[] = $real_url;  
  36.     } 
  37.   } 
  38.    return $result_url_list; 
  39.  }else
  40.    return
  41.  } 
  42. #刪除其他站點url 
  43. function other_site_url_del($jd_url_list,$url_base){ 
  44.  if(is_array($jd_url_list)){ 
  45.   foreach($jd_url_list as $all_url){ 
  46.     echo $all_url; 
  47.     if(strpos($all_url,$url_base)===0){ 
  48.      $all_url_list[]=$all_url; 
  49.     }   
  50.   } 
  51.   return $all_url_list; 
  52.  }else
  53.   return
  54.  } 
  55. #刪除相同URL 
  56. function url_same_del($array_url){ 
  57.    if(is_array($array_url)){ 
  58.      $insert_url=array(); 
  59.      $pizza=file_get_contents("/tmp/url.txt"); 
  60.      if($pizza){ 
  61.         $pizza=explode("/r/n",$pizza); 
  62.         foreach($array_url as $array_value_url){ 
  63.          if(!in_array($array_value_url,$pizza)){ 
  64.           $insert_url[]=$array_value_url;  
  65.          } 
  66.         } 
  67.         if($insert_url){ 
  68.            foreach($insert_url as $key => $insert_url_value){ 
  69.              #這里只做了參數相同去重處理 
  70.              $update_insert_url=preg_replace('/=[^&]*/','=leesec',$insert_url_value); 
  71.              foreach($pizza as $pizza_value){ 
  72.                 $update_pizza_value=preg_replace('/=[^&]*/','=leesec',$pizza_value); 
  73.                 if($update_insert_url==$update_pizza_value){ 
  74.                    unset($insert_url[$key]); 
  75.                    continue
  76.                 } 
  77.              } 
  78.            } 
  79.         }      
  80.      }else
  81.         $insert_url=array(); 
  82.         $insert_new_url=array(); 
  83.         $insert_url=$array_url; 
  84.         foreach($insert_url as $insert_url_value){ 
  85.          $update_insert_url=preg_replace('/=[^&]*/','=leesec',$insert_url_value); 
  86.          $insert_new_url[]=$update_insert_url;   
  87.         } 
  88.         $insert_new_url=array_unique($insert_new_url); 
  89.         foreach($insert_new_url as $key => $insert_new_url_val){ 
  90.           $insert_url_bf[]=$insert_url[$key]; 
  91.         }  
  92.         $insert_url=$insert_url_bf; 
  93.      } 
  94.      return $insert_url; 
  95.    }else
  96.     return;  
  97.    } 
  98.   
  99. $current_url=$argv[1]; 
  100. $fp_puts = fopen("/tmp/url.txt","ab");//記錄url列表  
  101. $fp_gets = fopen("/tmp/url.txt","r");//保存url列表  
  102. $url_base_url=parse_url($current_url); 
  103. if($url_base_url['scheme']==""){ 
  104.   $url_base="http://".$url_base_url['host']; 
  105. }else
  106.   $url_base=$url_base_url['scheme']."://".$url_base_url['host']; 
  107. do
  108.   $spider_page_result=curl_get($current_url); 
  109.   #var_dump($spider_page_result); 
  110.   $url_list=get_page_urls($spider_page_result,$url_base); 
  111.   #var_dump($url_list); 
  112.   if(!$url_list){ 
  113.    continue
  114.   } 
  115.   $jd_url_list=xdtojd($url_base,$url_list); 
  116.   #var_dump($jd_url_list); 
  117.   $result_url_arr=other_site_url_del($jd_url_list,$url_base); 
  118.   var_dump($result_url_arr); 
  119.   $result_url_arr=url_same_del($result_url_arr);  
  120.   #var_dump($result_url_arr);  
  121.   if(is_array($result_url_arr)){  
  122.     $result_url_arr=array_unique($result_url_arr); 
  123.        foreach($result_url_arr as $new_url) {  
  124.          fputs($fp_puts,$new_url."/r/n");  
  125.        } 
  126.   } 
  127. }while ($current_url = fgets($fp_gets,1024));//不斷獲得url  
  128. preg_match_all("/<a[^>]+href=[/"']([^/"']+)[/"'][^>]+>/",$spider_page_result,$out); 
  129. # echo a href 
  130. #var_dump($out[1]); 
  131. ?> 
?
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 祥云县| 宜阳县| 五家渠市| 汾西县| 民勤县| 运城市| 芦山县| 聊城市| 永平县| 铁岭县| 达拉特旗| 稻城县| 开原市| 静海县| 绥棱县| 普陀区| 阜康市| 社会| 伊宁市| 三明市| 墨竹工卡县| 曲阜市| 乌海市| 甘孜县| 阳城县| 桑日县| 同心县| 资溪县| 渝中区| 辉南县| 双辽市| 临朐县| 阳曲县| 江源县| 南投县| 大关县| 林口县| 郁南县| 台中市| 阿荣旗| 天门市|