PHP抓取及分析网页的方法详解


Posted in PHP onApril 26, 2016

本文实例讲述了PHP抓取及分析网页的方法。分享给大家供大家参考,具体如下:

抓取和分析一个文件是非常简单的事。这个教程将通过一个例子带领你一步一步地去实现它。让我们开始吧!

首先,我首必须决定我们将抓取的URL地址。可以通过在脚本中设定或通过$QUERY_STRING传递。为了简单起见,让我们将变量直接设在脚本中。

<?php
$url = 'http://www.php.net';
?>

第二步,我们抓取指定文件,并且通过file()函数将它存在一个数组里。

<?php
$url = 'http://www.php.net';
$lines_array = file($url);
?>

好了,现在在数组里已经有了文件了。但是,我们想分析的文本可能不全在一行里面。为了解决这个文件,我们可以简单地将数组$lines_array转化成一个字符串。我们可以使用implode(x,y)函数来实现它。如果在后面你想用explode(将字符串变量数组),将x设成"|"或"!"或其它类似的分隔符可能会更好。但是出于我们的目的,最好将x设成空格。y是另一个必要的参数,因为它是你想用implode()处理的数组。

<?php
$url = 'http://www.php.net';
$lines_array = file($url);
$lines_string = implode('', $lines_array);
?>

现在,抓取工作就做完了,下面该进行分析了。出于这个例子的目的,我们想得到在<head>到</head>之间的所有东西。为了分析出字符串,我们还需要叫做正规表达式的东西。

<?php
$url = 'http://www.php.net';
$lines_array = file($url);
$lines_string = implode('', $lines_array);
eregi("<head>(.*)</head>", $lines_string, $head);
?>

让我们看一下代码。正如你所见,eregi()函数按下面的格式执行:

eregi("<head>(.*)</head>", $lines_string, $head);

"(.*)"表示所有东西,可以解释为,"分析在<head>和</head>间的所以东西"。$lines_string是我们正在分析的字符串,$head是分析后的结果存放的数组。

最后,我们可以输数据。因为仅在<head>和</head>间存在一个实例,我们可以安全的假设数组中仅存在着一个元素,而且就是我们想要的。让我们把它打印出来吧。

<?php
$url = 'http://www.php.net';
$lines_array = file($url);
$lines_string = implode('', $lines_array); eregi("<head>(.*)</head>", $lines_string, $head);
echo $head[0];
?>

这就是全部的代码了。

<?php
//获取所有内容url保存到文件
function get_index ( $save_file , $prefix = "index_" ){
   $count = 68 ;
   $i = 1 ;
  if ( file_exists ( $save_file )) @ unlink ( $save_file );
   $fp = fopen ( $save_file , "a+" ) or die( "Open " . $save_file . " failed" );
  while( $i < $count ){
     $url = $prefix . $i . ".htm" ;
    echo "Get " . $url . "..." ;
     $url_str = get_content_url ( get_url ( $url ));
    echo " OK/n" ;
     fwrite ( $fp , $url_str );
    ++ $i ;
  }
   fclose ( $fp );
}
//获取目标多媒体对象
function get_object ( $url_file , $save_file , $split = "|--:**:--|" ){
  if (! file_exists ( $url_file )) die( $url_file . " not exist" );
   $file_arr = file ( $url_file );
  if (! is_array ( $file_arr ) || empty( $file_arr )) die( $url_file . " not content" );
   $url_arr = array_unique ( $file_arr );
  if ( file_exists ( $save_file )) @ unlink ( $save_file );
   $fp = fopen ( $save_file , "a+" ) or die( "Open save file " . $save_file . " failed" );
  foreach( $url_arr as $url ){
    if (empty( $url )) continue;
    echo "Get " . $url . "..." ;
     $html_str = get_url ( $url );
    echo $html_str ;
    echo $url ;
    exit;
     $obj_str = get_content_object ( $html_str );
    echo " OK/n" ;
     fwrite ( $fp , $obj_str );
  }
   fclose ( $fp );
}
//遍历目录获取文件内容
function get_dir ( $save_file , $dir ){
   $dp = opendir ( $dir );
  if ( file_exists ( $save_file )) @ unlink ( $save_file );
   $fp = fopen ( $save_file , "a+" ) or die( "Open save file " . $save_file . " failed" );
  while(( $file = readdir ( $dp )) != false ){
    if ( $file != "." && $file != ".." ){
      echo "Read file " . $file . "..." ;
       $file_content = file_get_contents ( $dir . $file );
       $obj_str = get_content_object ( $file_content );
      echo " OK/n" ;
       fwrite ( $fp , $obj_str );
    }
  }
   fclose ( $fp );
}
//获取指定url内容
function get_url ( $url ){
   $reg = '/^http:////[^//].+$/' ;
  if (! preg_match ( $reg , $url )) die( $url . " invalid" );
   $fp = fopen ( $url , "r" ) or die( "Open url: " . $url . " failed." );
  while( $fc = fread ( $fp , 8192 )){
     $content .= $fc ;
  }
   fclose ( $fp );
  if (empty( $content )){
    die( "Get url: " . $url . " content failed." );
  }
  return $content ;
}
//使用socket获取指定网页
function get_content_by_socket ( $url , $host ){
   $fp = fsockopen ( $host , 80 ) or die( "Open " . $url . " failed" );
   $header = "GET /" . $url . " HTTP/1.1/r/n" ;
   $header .= "Accept: */*/r/n" ;
   $header .= "Accept-Language: zh-cn/r/n" ;
   $header .= "Accept-Encoding: gzip, deflate/r/n" ;
   $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" ;
   $header .= "Host: " . $host . "/r/n" ;
   $header .= "Connection: Keep-Alive/r/n" ;
   //$header .= "Cookie: cnzz02=2; rtime=1; ltime=1148456424859; cnzz_eid=56601755-/r/n/r/n";
   $header .= "Connection: Close/r/n/r/n" ;
   fwrite ( $fp , $header );
   while (! feof ( $fp )) {
     $contents .= fgets ( $fp , 8192 );
   }
   fclose ( $fp );
   return $contents ;
}
//获取指定内容里的url
function get_content_url ( $host_url , $file_contents ){
   //$reg = '/^(#|<a href="http://lib.csdn.net/base/18" class='replace_word' title="JavaScript知识库" target='_blank' style='color:#df3434; font-weight:bold;'>JavaScript</a>.*?|ftp:////.+|http:////.+|.*?href.*?|play.*?|index.*?|.*?asp)+$/i';
   //$reg = '/^(down.*?/.html|/d+_/d+/.htm.*?)$/i';
   $rex = "/([hH][rR][eE][Ff])/s*=/s*['/"]*([^>'/"/s]+)[/"'>]*/s*/i" ;
   $reg = '/^(down.*?/.html)$/i' ;
   preg_match_all ( $rex , $file_contents , $r );
   $result = "" ; //array();
   foreach( $r as $c ){
    if ( is_array ( $c )){
      foreach( $c as $d ){
        if ( preg_match ( $reg , $d )){ $result .= $host_url . $d . "/n" ; }
      }
    }
  }
  return $result ;
}
//获取指定内容中的多媒体文件
function get_content_object ( $str , $split = "|--:**:--|" ){
   $regx = "/href/s*=/s*['/"]*([^>'/"/s]+)[/"'>]*/s*(.*?<//b>)/i" ;
   preg_match_all ( $regx , $str , $result );
  if ( count ( $result ) == 3 ){
     $result [ 2 ] = str_replace ( "多媒体: " , "" , $result [ 2 ]);
     $result [ 2 ] = str_replace ( " " , "" , $result [ 2 ]);
     $result = $result [ 1 ][ 0 ] . $split . $result [ 2 ][ 0 ] . "/n" ;
  }
  return $result ;
}
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP设计模式之结构模式的深入解析
Jun 13 PHP
PHP限制页面只能在微信自带浏览器访问的代码
Jan 15 PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 PHP
php跨站攻击实例分析
Oct 28 PHP
php采用curl模仿登录人人网发布动态的方法
Nov 07 PHP
用php来限制每个ip每天浏览页面数量的实现思路
Feb 24 PHP
PHP生成唯一订单号
Jul 05 PHP
PHP实现动态web服务器方法
Jul 29 PHP
让你的PHP7更快之Hugepage用法分析
May 31 PHP
php 魔术常量详解及实例代码
Dec 04 PHP
PHP编程计算文件或数组中单词出现频率的方法
May 22 PHP
深入浅析yii2-gii自定义模板的方法
Apr 26 #PHP
基于PHP实现通过照片获取ip地址
Apr 26 #PHP
各种快递查询--Api接口
Apr 26 #PHP
浅析Yii2集成富文本编辑器redactor实例教程
Apr 25 #PHP
Yii2增加验证码步骤详解
Apr 25 #PHP
Yii实现显示静态页的方法
Apr 25 #PHP
mysql_escape_string()函数用法分析
Apr 25 #PHP
You might like
提问的智慧(2)
2006/10/09 PHP
PHP实现基于mysqli的Model基类完整实例
2016/04/08 PHP
WordPress中设置Post Type自定义文章类型的实例教程
2016/05/10 PHP
PHP环境搭建(php+Apache+mysql)
2016/11/14 PHP
几行代码轻松实现PHP文件打包下载zip
2017/03/01 PHP
js计算字符串长度包含的中文是utf8格式
2013/10/15 Javascript
javascript消除window.close()的提示窗口
2015/05/20 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
郁闷!ionic中获取ng-model绑定的值为undefined如何解决
2016/08/27 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
AngularJS创建一个上传照片的指令实例代码
2018/02/24 Javascript
js实现简单选项卡功能
2020/03/23 Javascript
Vue实现push数组并删除的例子
2019/11/01 Javascript
javascript实现数字时钟效果
2021/02/06 Javascript
简明 Python 基础学习教程
2007/02/08 Python
Python 爬虫爬取指定博客的所有文章
2016/02/17 Python
Windows下安装Django框架的方法简明教程
2018/03/28 Python
Python实现的读写json文件功能示例
2018/06/05 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
python opencv肤色检测的实现示例
2020/12/21 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
Kipling澳洲官网:购买凯浦林包包
2020/12/17 全球购物
优秀员工个人的自我评价
2013/11/29 职场文书
大学三年计划书范文
2014/04/30 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
2014年民主评议党员个人总结
2014/09/24 职场文书
大学运动会加油稿200字(5篇)
2014/09/27 职场文书
2014年信贷员工作总结
2014/11/18 职场文书
先进教师事迹材料
2014/12/16 职场文书
教师工作能力自我评价
2015/03/04 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
小学班主任教育随笔
2015/08/15 职场文书
浅析MySQL如何实现事务隔离
2021/06/26 MySQL