PHP采集 抓取

什么是php采集程序?

    php采集程序,也叫php小偷,主要是用于自动搜集网络上web页里特定内容,用php语言写的web程序,运行于支持php的平台上。谈到“自动搜集”,你可能联想到百度goole,联想到搜索引擎所做的事情。php采集程序,正是做类似的工作。

为什么要采集?

互联网正以飞快的速度在发展,web数据每天以几何级数据量递增,面对这庞大的数据,作为一个网站管理员的你,该如何搜集自己所需要的信息呢?特别对某个 或某几个同类网站,你需要它们的大量信息,来充实你的网站内容,难道就只能复制粘贴的过日子吗?一个网站管理员,你真的就得花大量时间去搞原创内容,而与整个互联网信息量的发展速度脱节吗?这些问题的解决方法只有一个:采集。如果有那么一个程序,你帮你的网站自动或半自动的采集你所需要的特定内容,即时更 新你网站的信息,是否是你梦寐以求的呢?这就是采集程序出现的原因所在。

采集些什么?

这要看你做的什么类型的网站了。如果你做图片站,就采集图片;做音乐站,就采集mp3,做新闻站,就采集新闻等等。一切根据你网站的内容架构需要而定。确定你要采集的东西,才好写出相应的采集程序。

如何采集?

通常采集程序,都是有的放矢的。也就是需要有目标网站,搜集一些你需要的采集内容的网站,分别对其html代码进行分析,找出规律性的东西,依据你要采集 的特定内容,写出php代码。采集到你要的东西以后,你可以选择自己需要的存放方式。比如直接生成html页面,或是放进数据库,作进一步处理或是存放成 特定的形式,以备后用。

采集思路

采集程序的思路很简单大体可以分为以下几个步骤:

1. 获取远程文件源代码(file_get_contents或用fopen).

2.分析代码得到自己想要的内容(这里用正则匹配,一般是得到分页)。

3.跟根得到的内容进行下载入库等操作。

  在这里第二步有可能要重复的操作好几次,比如说要先分析一下分页地址,在分析一下内页的内容才能取得我们想要的东西。

隐藏行号 复制代码 这是一段程序代码。
  1. LibreOffice<?php
    
    
  2. /****获?取?远?程?文?件?源?代?码?常?用?三?种?方?法?***/
    
    
  3. /***方?法?一?、? fopen(),?stream_context_create()方?法?****/
    
    
  4. $opts = array(
    
    
  5.   'http'=>array(
    
    
  6.     'method'=>"GET",
    
    
  7.     'header'=>"Accept-language: en\r\n" .
    
    
  8.               "Cookie: foo=bar\r\n"
    
    
  9.   )
    
    
  10. );
    
    
  11. $context = stream_context_create($opts);
    
    
  12. $fp = fopen('http://www.example.com', 'r', false, $context);
    
    
  13. fpassthru($fp);
    
    
  14. fclose($fp); /******方?法?二?、? socket*******/
    
    
  15. function get_content_by_socket($url, $host){
    
    
  16.     $fp = fsockopen($host, 80) or die("Open ". $url ." failed");
    
    
  17.     $header = "GET /".$url ." HTTP/1.1\r\n";
    
    
  18.     $header .= "Accept: */*\r\n";
    
    
  19.     $header .= "Accept-Language: zh-cn\r\n";
    
    
  20.     $header .= "Accept-Encoding: gzip, deflate\r\n";
    
    
  21.     $header .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; InfoPath.1; .NET CLR 2.0.50727)\r\n";
    
    
  22.     $header .= "Host: ". $host ."\r\n";
    
    
  23.     $header .= "Connection: Keep-Alive\r\n";
    
    
  24.     //$header .= "Cookie: cnzz02=2; rtime=1; ltime=1148456424859; cnzz_eid=56601755-\r\n\r\n";
    
    
  25.     $header .= "Connection: Close\r\n\r\n";
    
    
  26.     fwrite($fp, $header);
    
    
  27.     while (!feof($fp)) {
    
    
  28.         $contents .= fgets($fp, 8192);
    
    
  29.     }
    
    
  30.     fclose($fp);
    
    
  31.     return $contents;
    
    
  32. }
    
    
  33.  
  34. /******方?法?三?、?file_get_contents (),?stream_context_create() 方?法?三?********/
    
    
  35. $opts = array(
    
    
  36.         'http'=>array(
    
    
  37.         'method'=>"GET",
    
    
  38.         'header'=>"Content-Type: text/html; charset=utf-8" 
    
    
  39.             )
    
    
  40.         );        
    
    
  41. $context = stream_context_create($opts);        
    
    
  42. $file = file_get_contents('http://www.sohu.com/', false, $context);        
    
    
  43.  
  44. /******方?法?四?、? PHP的?cURL http://www.chinaz.com/program/2010/0119/104346.shtml*******/
    
    
  45. $ch = curl_init();
    
    
  46. // 2. 设?置?选?项?,?包?括?URL
    
    
  47. curl_setopt($ch, CURLOPT_URL, "http://www.sohu.com");
    
    
  48. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    
    
  49. curl_setopt($ch, CURLOPT_HEADER, 0);
    
    
  50. curl_setopt($ch,CURLOPT_HTTPHEADER,array ("Content-Type: text/xml; charset=utf-8","Expect: 100-continue"));
    
    
  51. // 3. 执?行?并?获?取?HTML文?档?内?容?
    
    
  52. $output = curl_exec($ch);
    
    
  53. var_dump($output);
    
    
  54. // 4. 释?放?curl句?柄?
    
    
  55. curl_close($ch);
    
    
  56.  
  57. /*注?意?
    
    
  58. .使?用?file_get_contents和?fopen必?须?空?间?开?启?allow_url_fopen。?方?法?:?编?辑?php.ini,?设?置? allow_url_fopen = On,?allow_url_fopen关?闭?时?fopen和?file_get_contents都?不?能?打?开?远?程?文?件?。?
    
    
  59. . 使?用?curl必?须?空?间?开?启?curl。?方?法?:?windows下?修?改?php.ini,?将?extension=php_curl.dll前?面?的?分?号?去?掉?,?而?且?需? 要?拷?贝?ssleay32.dll和?libeay32.dll到?C:/WINDOWS/system32下?;?Linux下?要?安?装?curl扩?展?。?
    
    
  60. */
    
    
  61. ?>
    
    

采集范例程序

 

 

隐藏行号 复制代码 这是一段程序代码。
  1. LibreOffice/*一?个?图?片?下?载?函?数?*/
    
    
  2. function getimg($url,$filename){
    
    
  3.  ? ? ? ?/*判?断?图?片?的?url是?否?为?空?,?如?果?为?空?停?止?函?数?*/
    
    
  4.  ? ? ? ?if($url==""){
    
    
  5.  ? ? ? ? ? ? ? ?return false;
    
    
  6.  ? ? ? ?}
    
    
  7.  ? ? ? ?/*取?得?图?片?的?扩?展?名?,?存?入?变?量?$ext中?*/
    
    
  8.  ? ? ? ?$ext=strrchr($url,".");
    
    
  9.  ? ? ? ?/*判?断?是?否?是?合?法?的?图?片?文?件?*/
    
    
  10.  ? ?if($ext!=".gif" && $ext!=".jpg"){
    
    
  11.  ? ? ? ? ? ? ? ?return false;
    
    
  12.  ? ? ? ?}
    
    
  13.  ? ? ? ?/*读?取?图?片?*/
    
    
  14.  ? ? ? ?$img=file_get_contents($url);
    
    
  15.  ? ? ? ?/*打?开?指?定?的?文?件?*/
    
    
  16.  ? ? ? ?$fp=@fopen($filename.$ext,"a");
    
    
  17.  ? ? ? ?/*写?入?图?片?到?指?点?的?文?件?*/
    
    
  18.  ? ? ? ?fwrite($fp,$img);
    
    
  19.  ? ? ? ?/*关?闭?文?件?*/
    
    
  20.  ? ? ? ?fclose($fp);
    
    
  21.  ? ? ? ?/*返?回?图?片?的?新?文?件?名?*/
    
    
  22.  ? ? ? ?return $filename.$ext;
    
    
  23. }
    
    
隐藏行号 复制代码 这是一段程序代码。
  1. LibreOfficeView Code <?php
    
    
  2. /**
    
    
  3. *  采?集?图?片?php程?序?
    
    
  4. *
    
    
  5. *  Copyright(c) 2008 by 小?超?(ccxxcc) All rights reserved
    
    
  6. *
    
    
  7. *  To contact the author write to {@link mailto:[email protected]}
    
    
  8. *
    
    
  9. * @author ccxxcc
    
    
  10. * @version $Id: {filename},v 1.0 {time} $
    
    
  11. * @package system
    
    
  12. */
    
    
  13.  
  14. set_time_limit(0);
    
    
  15. /**
    
    
  16. * 写?文?件?
    
    
  17. * @param    string  $file   文?件?路?径?
    
    
  18. * @param    string  $str    写?入?内?容?
    
    
  19. * @param    char    $mode   写?入?模?式?
    
    
  20. */
    
    
  21. function wfile($file,$str,$mode='w')
    
    
  22. {
    
    
  23.     $oldmask = @umask(0);
    
    
  24.     $fp = @fopen($file,$mode);
    
    
  25.     @flock($fp, 3);
    
    
  26.     if(!$fp)
    
    
  27.     {
    
    
  28.         Return false;
    
    
  29.     }
    
    
  30.     else
    
    
  31.     {
    
    
  32.         @fwrite($fp,$str);
    
    
  33.         @fclose($fp);
    
    
  34.         @umask($oldmask);
    
    
  35.         Return true;
    
    
  36.     }
    
    
  37. }
    
    
  38.  
  39. function savetofile($path_get,$path_save)
    
    
  40. {
    
    
  41.         @$hdl_read = fopen($path_get,'rb');
    
    
  42.         if($hdl_read == false)
    
    
  43.         {
    
    
  44.                 echo("<span style='color:red'>$path_get can not get</span>");
    
    
  45.                 Return ;
    
    
  46.         }
    
    
  47.         if($hdl_read)
    
    
  48.         {
    
    
  49.                 @$hdl_write = fopen($path_save,'wb');
    
    
  50.                 if($hdl_write)
    
    
  51.                 {
    
    
  52.                         while(!feof($hdl_read))
    
    
  53.                         {
    
    
  54.                                 fwrite($hdl_write,fread($hdl_read,8192));
    
    
  55.                         }
    
    
  56.                         fclose($hdl_write);
    
    
  57.                         fclose($hdl_read);
    
    
  58.                         return 1;
    
    
  59.                 }
    
    
  60.                 else
    
    
  61.                         return 0;
    
    
  62.         }
    
    
  63.         else
    
    
  64.                 return -1;
    
    
  65. }
    
    
  66.  
  67. function getExt($path)
    
    
  68. {
    
    
  69.         $path = pathinfo($path);
    
    
  70.         return strtolower($path['extension']);
    
    
  71. }
    
    
  72.  
  73. /**
    
    
  74. * 按?指?定?路?径?生?成?目?录?
    
    
  75. *
    
    
  76. * @param    string     $path    路?径?
    
    
  77. */
    
    
  78. function mkDirs($path)
    
    
  79. {
    
    
  80.     $adir = explode('/',$path);
    
    
  81.     $dirlist = '';
    
    
  82.     $rootdir = array_shift($adir);
    
    
  83.     if(($rootdir!='.'||$rootdir!='..')&&!file_exists($rootdir))
    
    
  84.     {
    
    
  85.         @mkdir($rootdir);
    
    
  86.     }
    
    
  87.     foreach($adir as $key=>$val)
    
    
  88.     {
    
    
  89.         if($val!='.'&&$val!='..')
    
    
  90.         {
    
    
  91.             $dirlist .= "/".$val;
    
    
  92.             $dirpath = $rootdir.$dirlist;
    
    
  93.             if(!file_exists($dirpath))
    
    
  94.             {
    
    
  95.                 @mkdir($dirpath);
    
    
  96.                 @chmod($dirpath,0777);
    
    
  97.             }
    
    
  98.         }
    
    
  99.     }
    
    
  100. }
    
    
  101.  
  102. /**
    
    
  103. * 从?文?本?中?取?得?一?维?数?组?
    
    
  104. *
    
    
  105. * @param    string     $file_path    文?本?路?径?
    
    
  106. */
    
    
  107. function getFileListData($file_path)
    
    
  108. {
    
    
  109.     $arr = @file($file_path);
    
    
  110.     $data = array();
    
    
  111.     if(is_array($arr) && !empty($arr))
    
    
  112.     {
    
    
  113.         foreach($arr as $val)
    
    
  114.         {
    
    
  115.             $item = trim($val);
    
    
  116.             if(!empty($item))
    
    
  117.             {
    
    
  118.                 $data[] = $item;
    
    
  119.             }
    
    
  120.         }
    
    
  121.     }
    
    
  122.     Return $data;
    
    
  123. }
    
    
  124.  
  125. //采?集?开?始?
    
    
  126.  
  127. //传?入?自?己?的?需?要?采?集?的?图?片?url列?表?文?本?文?件? 每?个?图?片?url写?一?行?
    
    
  128. $url_file = isset($_GET['file'])&&!empty($_GET['file'])?$_GET['file']:null;
    
    
  129. $txt_url = "txt/".$url_file;
    
    
  130.  
  131. $urls = array_unique(getFileListData($txt_url));
    
    
  132. if(empty($urls))
    
    
  133. {
    
    
  134.         echo('<div style="color:red">无?链?接?地?址?</div>');
    
    
  135.         die();
    
    
  136. }
    
    
  137. $save_url = "images/".date("y_m_d",time())."/";
    
    
  138. mkDirs($save_url);  //按?日?期?建?立?文?件?夹?
    
    
  139. $i = 1;
    
    
  140. if(is_array($urls)&&count($urls))
    
    
  141. {
    
    
  142.         foreach($urls as $val)
    
    
  143.         {
    
    
  144.                 savetofile($val,$save_url.date("His",time())."_".$i.".".getExt($val));
    
    
  145.                 echo($i.".".getExt($val)." got\n");
    
    
  146.                 $i++;
    
    
  147.         }
    
    
  148. }
    
    
  149.  
  150. echo('<div style="color:green">finish</div>');
    
    
  151.  
  152. ?>
    
    

除了以上方法还可以用Snoopy,也不错。

Snoopy是什么? (下载snoopy

Snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。

Snoopy的一些特点:

* 方便抓取网页的内容

* 方便抓取网页的文本内容 (去除HTML标签)

* 方便抓取网页的链接

* 支持代理主机

* 支持基本的用户名/密码验证

* 支持设置 user_agent, referer(来路), cookies 和 header content(头文件)

* 支持浏览器转向,并能控制转向深度

* 能把网页中的链接扩展成高质量的url(默认)

* 方便提交数据并且获取返回值

* 支持跟踪HTML框架(v0.92增加)

* 支持再转向的时候传递cookies (v0.92增加)

采集心得

共享一下个人的采集心德:

  1.不采那些作防盗链了的站,其实可以作假来路但是这样的站采集成本太高

  2.采集尽量快的站,最好在本地进行采集

  3.采集时有很多时候可以先把一部分数据存入数据库,等以后进行下一步的处理。

  4.采集的时候一定要作好出错处理,我一般都是如果采集三次没有成功就跳过。以前经常就因为一条内容不能采就卡在那里一直的采。

  5.入库前一定要作好判断,检查内容的合法,过滤不必要的字符串。

你可能感兴趣的:(PHP)