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 相关文章推荐
discuz程序的PHP加密函数原理分析
Aug 05 PHP
php中将时间差转换为字符串提示的实现代码
Aug 08 PHP
很让人受教的 提高php代码质量36计
Sep 05 PHP
PHP判断指定时间段的2个方法
Mar 14 PHP
Codeigniter操作数据库表的优化写法总结
Jun 12 PHP
phpnow php探针环境检测代码
Nov 04 PHP
5款适合PHP使用的HTML编辑器推荐
Jul 03 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
Aug 31 PHP
PHP实现生成带背景的图形验证码功能
Oct 03 PHP
php抛出异常与捕捉特定类型的异常详解
Oct 26 PHP
PHP+iframe图片上传实现即时刷新效果
Nov 18 PHP
PHP实现的折半查找算法示例
Dec 19 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
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
修改发贴的编辑功能
2007/03/07 Javascript
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
2014/12/29 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
学习使用bootstrap基本控件(table、form、button)
2016/04/12 Javascript
javascript用正则表达式过滤空格的实现代码
2016/06/14 Javascript
jQuery基于ID调用指定iframe页面内的方法
2016/07/06 Javascript
JavaScript中原型链存在的问题解析
2016/09/25 Javascript
vue.js开发环境安装教程
2017/03/17 Javascript
原生js封装运动框架的示例讲解
2017/10/01 Javascript
微信小程序基于picker实现级联菜单
2019/02/15 Javascript
Python中的True,False条件判断实例分析
2015/01/12 Python
python魔法方法-自定义序列详解
2016/07/21 Python
浅谈scrapy 的基本命令介绍
2017/06/13 Python
Python 中的Selenium异常处理实例代码
2018/05/03 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
Python3 pandas 操作列表实例详解
2019/09/23 Python
Python3操作MongoDB增册改查等方法详解
2020/02/10 Python
Python图像处理库PIL的ImageFilter模块使用介绍
2020/02/26 Python
Pytest框架之fixture的详细使用教程
2020/04/07 Python
如何利用Python识别图片中的文字
2020/05/31 Python
keras中的History对象用法
2020/06/19 Python
好的演讲稿开场白
2013/12/30 职场文书
写求职信有什么意义
2014/02/17 职场文书
内衣营销方案
2014/03/15 职场文书
社会发展项目建议书
2014/08/25 职场文书
反对形式主义、官僚主义、享乐主义和奢靡之风整改措施
2014/09/17 职场文书
创业计划书之家教托管
2019/09/25 职场文书
数据库之SQL技巧整理案例
2021/07/07 SQL Server