新浦京81707con > 软件下载 > php模仿百度spider蜘蛛爬虫程序例子,php怎么写爬

原标题:php模仿百度spider蜘蛛爬虫程序例子,php怎么写爬

浏览次数:92 时间:2019-09-25

新近急需搜聚素材,在浏览器上用另存为的章程实在是很麻烦,并且不便利存款和储蓄和搜索。所以自个儿写了贰个小爬虫,在网络爬东西,迄今甘休,已经爬了近百 万张网页。现在正在想办法起头管理这么些多少。

团结用PHP写了个爬虫,基本功用已经达成

```

爬虫的协会:
   爬虫的原理其实非常的粗略,正是深入分析下载的页面,搜索里面的延续,然后再下载那几个链接,再解析再下载,周而复始。在数额存款和储蓄方面,数据库是首要推荐,便于找寻,而 开荒语言,只要永葆正则表明式就能够了,数据库小编采纳了mysql,所以,开拓脚本作者选拔了php。它援助perl兼容正则表明式,连接mysql很方 便,帮衬http下载,并且windows系统和linux系统都能够配备。

linux 意况下运作#php spider.php

/**

正则表明式:
  正则表明式是管理文字的主干工具,要抽取html中的链接和图片,使用的正则表达式如下。

上面为测验进度图

* 爬虫程序 -- 原型

   "#<a[^>] href=(['"])(. )\1#isU"   管理链接
    "#<img[^>] src=(['"])(. )\1#isU" 管理图片

图片 1

*

其它标题:
  写爬虫还要求潜心的二个题目是,对于曾经下载过的url,无法重复举行下载,而略带网页的链接会产生环路,所以必要管理那么些标题,作者的处理格局是测算已经 管理的url的MD5 值,并存入数据库,那样就足以查看是或不是曾经下载过。当然还应该有越来越好的算法,风乐趣的话,能够在网络找一下。

下边为测量试验结果

* BookMoth 2009-02-21

相关磋商:
  爬虫也可能有谈得来的商事,有个robots.txt文件定义了这几个是网址允许遍历的,但是出于自家的年华少于,没有兑现那些职能。

图片 2

*/

其他表明:
  php支持类编制程序,小编写的爬虫首要的类.
  1.url处理web_site_info,首要用处理url,解析域名等。
  2.数据库操作mysql_insert.php,管理和数据库相关的操作。
  3.历史记录管理,记录已经管理的url。
  4.爬虫类。

好玩味的能够尝试

/**

存在的题目和不足

剧本劣势:

* 从给定的url获取html内容

  这么些爬虫在小数据量的意况下,运维卓越,不过在大数据量的处境下,历史记录管理类的功用就不是非常高,通过在数据库结构中,对相关字段进展了目录,速度有了 升高,然而急需持续得读取数据,可能和php本人的array完成有涉嫌,借使一遍加载10万条历史记录,速度极度慢。
  不协理二十四线程,每趟只好管理二个url。
  php运维本人有内部存款和储蓄器使用量限制,有二回在抓取深度为20的页面包车型地铁时候,内部存款和储蓄器用尽程序被杀。

1.未对静态页面实行去重管理
2.未对页面内js操作后的结果开展管理

*

上面包车型地铁url是源码下载。

 

* @param string $url


选拔的时候,先在mysql中开创net_spider数据库,然后用db.sql创建相关表。再在config.php中装置mysql 的客商名口令。
最后

 代码如下

* @return string

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

<?php

*/

就足以最先工作。如

#加载页面
function curl_get($url){
        $ch=curl_init();
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch,CURLOPT_HEADER,1);
        $result=curl_exec($ch);
        $code=curl_getinfo($ch,CURLINFO_HTTP_CODE);
 if($code!='404' && $result){
  return $result;
 }
        curl_close($ch);
}

function _getUrlContent($url){

php -f spider.php 20 

#赢得页面url链接
function get_page_urls($spider_page_result,$base_url){
  $get_url_result=preg_match_all("/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/",$spider_page_result,$out);
  if($get_url_result){
   return $out[1];
  }else{
   return;
  }
}

$handle = fopen($url, "r");

现行倍感下来,其实做个爬虫没那么复杂,难的是数量的积累和研究。小编今日的数据库,最大学一年级个数据表已经15G,正在想办管理那个多少,mysql举办查询已经感到到某些力不能支了。那一点上还真钦佩google

#相对路线转相对路线
function xdtojd($base_url,$url_list){
 if(is_array($url_list)){
  foreach($url_list as $url_item){
   if(preg_match("/^(http:\/\/|https:\/\/|javascript:)/",$url_item)){
    $result_url_list[]=$url_item;
   }else {
    if(preg_match("/^\//",$url_item)){
     $real_url = $base_url.$url_item;
    }else{
     $real_url = $base_url."/".$url_item;
    }
    #$real_url = '; 
                  $result_url_list[] = $real_url; 
   }
  }
  return $result_url_list;
 }else{
  return;
 }
}

if($handle){

 代码如下

#删除别的站点url
function other_site_url_del($jd_url_list,$url_base){
 
 if(is_array($jd_url_list)){
  foreach($jd_url_list as $all_url){
   echo $all_url;
   if(strpos($all_url,$url_base)===0){
    $all_url_list[]=$all_url;
   }  

$content = stream_get_contents($handle,1024*1024);

<?php

  }
  return $all_url_list;
 }else{
  return;
 }

return $content;

#加载页面

}

}else{

functioncurl_get($url){

#除去同样UTucsonL
function url_same_del($array_url){
 
 if(is_array($array_url)){
  $insert_url=array();
  $pizza=file_get_contents("/tmp/url.txt");
                if($pizza){
   $pizza=explode("\r\n",$pizza);
   foreach($array_url as $array_value_url){
    if(!in_array($array_value_url,$pizza)){
     $insert_url[]=$array_value_url;
    }
   }
   if($insert_url){
                                foreach($insert_url as $key => $insert_url_value){
                                        #这里只做了参数一样去重管理
     $update_insert_url=preg_replace('/=[^&]*/','=leesec',$insert_url_value);
                                        foreach($pizza as $pizza_value){
                                         $update_pizza_value=preg_replace('/=[^&]*/','=leesec',$pizza_value);
                                                if($update_insert_url==$update_pizza_value){
                                                 unset($insert_url[$key]);
                                                        continue;
                                                }

return false;

    $ch=curl_init();

                                        }

}

    curl_setopt($ch,CURLOPT_URL,$url);

    }
   }
 
  }else{
   $insert_url=array();
   $insert_new_url=array();
   $insert_url=$array_url;
   foreach($insert_url as $insert_url_value){
    $update_insert_url=preg_replace('/=[^&]*/','=leesec',$insert_url_value);
    $insert_new_url[]=$update_insert_url;  
   }
   $insert_new_url=array_unique($insert_new_url);
   foreach($insert_new_url as $key => $insert_new_url_val){
    $insert_url_bf[]=$insert_url[$key];
   }
   $insert_url=$insert_url_bf;
  }
  return $insert_url;
 }else{
  return;
 }
}

}

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$current_url=$argv[1];
$fp_puts = fopen("/tmp/url.txt","ab");//记录url列表 
$fp_gets = fopen("/tmp/url.txt","r");//保存url列表 
$url_base_url=parse_url($current_url);
if($url_base_url['scheme']==""){
 $url_base="];
}else{
 $url_base=$url_base_url['scheme']."://".$url_base_url['host'];
}

/**

    curl_setopt($ch,CURLOPT_HEADER,1);

do{
 $spider_page_result=curl_get($current_url);
 #var_dump($spider_page_result);
 $url_list=get_page_urls($spider_page_result,$url_base);
 #var_dump($url_list);
 if(!$url_list){
  continue;
 }
 $jd_url_list=xdtojd($url_base,$url_list);
 #var_dump($jd_url_list);
 $result_url_arr=other_site_url_del($jd_url_list,$url_base);
 var_dump($result_url_arr);
 $result_url_arr=url_same_del($result_url_arr);
 #var_dump($result_url_arr);
 if(is_array($result_url_arr)){ 
     $result_url_arr=array_unique($result_url_arr);
            foreach($result_url_arr as $new_url) { 
                fputs($fp_puts,$new_url."\r\n"); 
            }
 } 
 
}

* 从html内容中筛选链接

    $result=curl_exec($ch);

while ($current_url = fgets($fp_gets,1024));//不断取得url 
preg_match_all("/<a[^>] href=[\"']([^\"'] )[\"'][^>] >/",$spider_page_result,$out);
# echo a href
#var_dump($out[1]);

*

    $code=curl_getinfo($ch,CURLINFO_HTTP_CODE);

?>

* @param string $web_content

    if($code!='404'&&$result){

* @return array

     return$result;

*/

    }

function _filterUrl($web_content){

    curl_close($ch);

$reg_tag_a = '/<[a|A].*?href=['"]{0,1}([^>'" ]*).*?>/';

}

$result = preg_match_all($reg_tag_a,$web_content,$match_result);

#获得页面url链接

if($result){

functionget_page_urls($spider_page_result,$base_url){

return $match_result[1];

  $get_url_result=preg_match_all("/<[a|A].*?href=['"]{0,1}([^>'"]*).*?>/",$spider_page_result,$out);

}

  if($get_url_result){

}

    return$out[1];

/**

  }else{

* 改正相对路线

    return;

*

  }

* @param string $base_url

}

* @param array $url_list

#相对路线转相对路线

* @return array

functionxdtojd($base_url,$url_list){

*/

 if(is_array($url_list)){

function _reviseUrl($base_url,$url_list){

  foreach($url_listas$url_item){

$url_info = parse_url($base_url);

    if(preg_match("/^(http://|https://|javascript:)/",$url_item)){

$base_url = $url_info["scheme"].'://';

      $result_url_list[]=$url_item;

if($url_info["user"]&&$url_info["pass"]){

    }else{

$base_url .= $url_info["user"].":".$url_info["pass"]."@";

     if(preg_match("/^//",$url_item)){

}

      $real_url=$base_url.$url_item;

$base_url .= $url_info["host"];

     }else{

if($url_info["port"]){

      $real_url=$base_url."/".$url_item;

$base_url .= ":".$url_info["port"];

     }

}

本文由新浦京81707con发布于软件下载,转载请注明出处:php模仿百度spider蜘蛛爬虫程序例子,php怎么写爬

关键词: 新浦京81707con 随笔

上一篇:HBuilder使用技巧,Hbuilder实用技巧

下一篇:没有了