liti 发表于 2015-8-25 11:10:49

PHP抓取网络数据

  涉及到的知识点不多
  file_get_contents:读取数据;
  preg_match_all:正则匹配;
  和匹配之后的数据分析。
  不同网页所需要抓取的数据是不同的,所以正则表达式自然也不一样,针对抓取之后的数据的分析处理方式也不同。
  用新浪的nba新闻为例,地址:http://roll.sports.sina.com.cn/s_2002-2003NBA_all/index.shtml
  列表页面
  详细页面
  页面整合


[*]列表页面
  第一步,分析这个页面的源码,找到需要匹配的标题的正则

  列表页面的代码如下:



<?php
$con = file_get_contents ( "http://roll.sports.sina.com.cn/s_2002-2003NBA_all/index.shtml" );
// echo $con;
$preg = '#<ahref="(.*)" target="_blank">(.*)</a></span><span class="c_time">(.*)</span></li>#iUs';
preg_match_all ( $preg, $con, $arr );
// var_dump($arr);
echo '<pre>';
$index=0;
foreach ( $arr as $key => $value ) {
//var_dump($value);//★这里是一些分析$arr的过程,分析之后可以知道$arr、$arr、$arr分别是链接地址、标题文字内容、新闻日期时间
//echo $value."<br>";//★

echo (++$index).'.<a href="'.$value.'">'.$arr[$key].'</a><br>';//★注意这里的$arr[$key]就是标题内容,而href中的则是链接地址

}
echo '</pre>';
  
  页面分析如图:



[*]详细页面
  之后是详细页面,同样随便找一条新闻的页面查看源码,分析新闻的标题以及具体内容的正则匹配:

  代码如下:



<?php
//$con = file_get_contents ( "http://sports.sina.com.cn/nba/2013-08-29/12136747450.shtml" );
$con = file_get_contents ( $_GET["url"] );
$preg = '#<h1 id="artibodyTitle">(.*)</h1>#iUs';//标题的正则匹配
$arr= preg($preg, $con);
echo '<pre>';
foreach ($arr as $key=>$value){
echo $value."<br>";
}
$pregContent="#<!-- 正文内容 begin -->(.*)<!-- 正文内容 end -->#iUs";//内容的正则匹配
$arrContent= preg($pregContent, $con);
foreach ($arrContent as $key=>$value){
echo $value;
}
echo '</pre>';
function preg($preg, $con) {
preg_match_all ( $preg, $con, $arr );
return $arr;
}
  
  页面分析如图:



[*]页面整合
  最后一步整理,目的是自己处理之后的列表页直接跳转到对应的处理之后的详细页面,改动只有两个地方:1.列表页面最后echo的链接地址的href值 2 详细页面使用$_GET读取链接参数
  最终代码如下:
  1.列表页面



<?php
$con = file_get_contents ( "http://roll.sports.sina.com.cn/s_2002-2003NBA_all/index.shtml" );
// echo $con;
$preg = '#<ahref="(.*)" target="_blank">(.*)</a></span><span class="c_time">(.*)</span></li>#iUs';
preg_match_all ( $preg, $con, $arr );
// var_dump($arr);
echo '<pre>';
$index=0;
foreach ( $arr as $key => $value ) {
//var_dump($value);//★
//echo $value."<br>";//★

//echo (++$index).'.<a href="'.$value.'">'.$arr[$key].'</a><br>';//★
echo (++$index).'.<a href=20130829.catchDataInfo.php?url='.$value.'>'.$arr[$key].'</a><br>';//★链接到本地的详细页面,并且配置上url参数
   
}
echo '</pre>';
  
  2.详细页面



<?php
//$con = file_get_contents ( "http://sports.sina.com.cn/nba/2013-08-29/12136747450.shtml" );
$con = file_get_contents ( $_GET["url"] );//读取链接参数
$preg = '#<h1 id="artibodyTitle">(.*)</h1>#iUs';//标题的正则匹配
$arr= preg($preg, $con);
echo '<pre>';
foreach ($arr as $key=>$value){
echo $value."<br>";
}
$pregContent="#<!-- 正文内容 begin -->(.*)<!-- 正文内容 end -->#iUs";//内容的正则匹配
$arrContent= preg($pregContent, $con);
foreach ($arrContent as $key=>$value){
echo $value;
}
echo '</pre>';
function preg($preg, $con) {
preg_match_all ( $preg, $con, $arr );
return $arr;
}
  
页: [1]
查看完整版本: PHP抓取网络数据