当前位置:首页 > PHP教程 > 正则表达式 > 列表

php使用curl和正则表达式抓取网页数据示例

发布:smiling 来源: PHP粉丝网  添加日期:2020-11-09 11:54:13 浏览: 评论:0 

这篇文章主要介绍了php使用curl和正则表达式抓取网页数据示例,这里是抓取某网站的小说,需要的朋友可以修改一下抓取其它数据。

利用curl和正则表达式做的一个针对磨铁中文网非vip章节的小说抓取器,支持输入小说ID下载小说。

依赖项:curl

可以简单的看下,里面用到了curl ,正则表达式,ajax等技术,适合新手看看。在本地测试,必须保证联网并且确保php开启curl的mode

SpiderTools.class.php 代码如下:

  1. <?php 
  2.   session_start(); 
  3.  //封装成类 开启这些自动抓取文章 
  4.   #header("Refresh:30;http://www.test.com:8080"); 
  5.  class SpiderTools{  
  6.  ////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  7.  /*传入文章ID 解析出文章标题*/ 
  8.  ////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  9.  public function getBookNameById($aid){ 
  10.   //初始化curl 
  11.   $ch= curl_init(); 
  12.   //url 
  13.   $url='http://www.motie.com/book/'.$aid
  14.   if(is_numeric($aid)){ 
  15.   //正则表达式匹配 
  16.   $ru="/<h1\sclass=\"p-title\">\s*<a\shref=\"\/book\/\d+\">(.*)\s*<\/a>\s*<\/h1>/"
  17.   } 
  18.   else
  19.   //<title>丧尸爆发之全家求生路_第一章  丧尸爆发  为吾友爱乐儿更新~_磨铁</title> 
  20.   $ru="/<title>(.*)<\/title>/"
  21.   } 
  22.   //设置选项,包括URL 
  23.   curl_setopt($ch, CURLOPT_URL, $url); 
  24.   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自动输出内容 
  25.   curl_setopt($ch, CURLOPT_HEADER, 0);//不返回头部信息 
  26.   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0);  
  27.  //执行curl 
  28.   $output = curl_exec($ch); 
  29.   //错误提示 
  30.   if(curl_exec($ch) === false){ 
  31.    die(curl_error($ch)); 
  32.   } 
  33.   // 检查是否有错误发生 
  34.   if(curl_errno($ch)){ 
  35.   echo 'Curl error: ' . curl_error($ch); 
  36.   } 
  37.   //释放curl句柄 
  38.   curl_close($ch); 
  39.   $arr=array(); 
  40.   preg_match_all($ru,$output,$arr); 
  41.   return $arr[1][0]; 
  42.    } 
  43.  //////////////////////////////////////////////////////////////////////////////////////////////////////////      
  44.  /*传入文章ID  解析文章内容*/ 
  45.  ////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  46.  public  function getBookContextById($aid){ 
  47.   //开始解析文章 
  48.   $ids=array(); 
  49.   $ids=explode("_",$aid); 
  50.   $titleId=trim($ids[0]); 
  51.   $aticleId=trim($ids[1]); 
  52.   $ch= curl_init(); 
  53.   $ru="/<div class=\"page-content\">[\s\S]*<pre ondragstart=\"return false\" oncopy=\"return false;\" oncut=\"return false;\" oncontextmenu=\"return false\" class=\"note\" id=\"html_content_\d*\">[\s\S]*(.*)<img src=\"\/ajax\/chapter\/$titleId\/$aticleId\" class=\"hidden\" \/><\/pre>/ui";  
  54.   $url='http://www.motie.com/book/'.$aid
  55.   //正则表达式匹配 
  56.  
  57.  //设置选项,包括URL 
  58.   curl_setopt($ch, CURLOPT_URL, $url); 
  59.   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自动输出内容 
  60.   curl_setopt($ch, CURLOPT_HEADER, 0);//不返回头部信息 
  61.   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0);  
  62.  //执行curl 
  63.   $output = curl_exec($ch); 
  64.   //错误提示 
  65.   if(curl_exec($ch) === false){ 
  66.    die(curl_error($ch)); 
  67.   } 
  68.   // 检查是否有错误发生 
  69.   if(curl_errno($ch)){ 
  70.    echo 'Curl error: ' . curl_error($ch); 
  71.   } 
  72.   $arr=array(); 
  73.   $arr2=array(); 
  74.   preg_match_all($ru,$output,$arr); 
  75.   curl_close($ch); 
  76.   #var_dump($arr); 
  77.   $s=$arr[0][0]; 
  78.   $s=substr($s,180); 
  79.   $arr2=explode("<img",$s); 
  80.   return trim($arr2[0]); 
  81.  } 
  82.  
  83. //////////////////////////////////////////////////////////////////////////////////////////////////////////  
  84.  /*静态方法 @生成小说文件 可以直接调用 */ 
  85.  ////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  86.      public static function createBookById($id){ 
  87.    
  88.   if(!is_numeric($id)){ 
  89.  
  90.  echo "<br/>INIT BEGIN START WRITE!"
  91.   $st=new self(); 
  92.   $cons=$st->getBookContextById($id); 
  93.   $title=$st->getBookNameById($id); 
  94.   $cons=trim($cons); 
  95.   $t=explode(" ",$title); 
  96.   //构造目录 
  97.   $dir=array(); 
  98.   $dir=explode("_",$t[0]); 
  99.   $wzdir=$dir[0];  //书名称 作为目录名称 
  100.   $wzchapter=$dir[1]; //第几章 
  101.   //创建目录 
  102.   $wzdir2=iconv("UTF-8""GBK"$wzdir);//目录编码 注意这里保留对$wzdir字符串的引用,用来构造文件名,不能用此处,防止二次编码 
  103.   if(!file_exists($wzdir2)){ 
  104.    mkdir($wzdir2); //创建目录 
  105.   } 
  106.   //构造文件名 
  107.   $wztitle="./".$wzdir."/"."$t[0]".".txt"
  108.   //保证保存的文件名称不是乱码 
  109.   $wztitle=iconv("UTF-8""GBK"$wztitle); 
  110.   $f=fopen($wztitle,"w+"); 
  111.   fwrite($f,$cons); 
  112.   echo "<font color='green'>$wzdir </font>".$wzchapter."<font color='red'>写入成功</font>"
  113.   fclose($f);  
  114.    
  115.   }  
  116.   else
  117.   $ids=self::getBookIdsById($id);  
  118.   
  119.   //这里服务器可能会掉线,所以最好用session记录循环 
  120.   #for($i=$_SESSION["$id"."_fid"];$i<=count($ids);$_SESSION["$id"."_fid"]++,$i++){ 
  121.   
  122.    #self::createBookById($id."_".$ids[$_SESSION["$id"."_fid"]++]);//构造id 
  123.   #} 
  124.    
  125.   for($i=$_SESSION["$id"."_fid"];$i<=count($ids);$_SESSION["$id"."_fid"]++,$i++){ 
  126.   
  127.    self::createBookById($id."_".$ids[$i]);//构造id 
  128.   } 
  129.    
  130.   #echo "<hr/><hr/><br/><h1>写入工作全部完成</h1>"
  131.   #echo $id."_".$ids[0]."<br/>";  
  132.   #var_dump($ids); 
  133.    
  134.   } 
  135.  
  136.  
  137.   /* 
  138.   获取小说的所有ID 
  139.   @param $id 文章ID 
  140.   @return array; 
  141.   */ 
  142.   public static function getBookIdsById($aid){  
  143.   $ch= curl_init(); 
  144.   $url='http://www.motie.com/book/'.$aid."/chapter"
  145.   //注意这里的?可以获取最少匹配项 
  146.   $ru='/[\s\S]*?<li class=\"\" createdate=\"\d{4}\-\d{2}\-\d{2} \d{2}:\d{2}:\d{2}\">[\s\S]*?<a href=\"\/book\/'.$aid.'_(\d*?)\"\s{1}>.*?<\/a>.*?/u';//正则表达式匹配 
  147.   //设置选项,包括URL 
  148.   curl_setopt($ch, CURLOPT_URL, $url); 
  149.   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自动输出内容 
  150.   curl_setopt($ch, CURLOPT_HEADER, 0);//不返回头部信息 
  151.   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0);  
  152.  //执行curl 
  153.   $output = curl_exec($ch); 
  154.   // 检查是否有错误发生 
  155.   if(curl_errno($ch)){ 
  156.   echo 'Curl error: ' . curl_error($ch); 
  157.   } 
  158.   //释放curl句柄 
  159.   curl_close($ch); 
  160.   $arr=array(); 
  161.   preg_match_all($ru,$output,$arr,PREG_PATTERN_ORDER); 
  162.   return $arr[1]; 
  163.   } 
  164. ?> 

getinfo.php 代码如下:

  1. <?php 
  2.   session_start(); 
  3.  require_once("SpiderTools.class.php"); 
  4.  if($_REQUEST["bid"]){ 
  5.  if(is_numeric($_REQUEST["bid"])){ 
  6.   SpiderTools::createBookById(trim($_REQUEST["bid"])); 
  7.   } 
  8.   else
  9.    echo "<br/>请输入正确的文章ID<br/>"
  10.   } 
  11.  } 
  12.  ?> 

index.html 代码如下:

  1. <html> 
  2.  <head><meta charset="utf-8"/></head> 
  3.  <title>下载小说啦</title> 
  4.  <body> 
  5.  <h1>输入磨铁中文网你想看到的小说ID号就可以下载小说啦</h1> 
  6.  <form method="get" action="getinfo.php"
  7.  <input type="text" id="myid" name="myid" value=""/> 
  8.  <input type="button" value="生成小说" onclick="createbook();"/> 
  9.  </form> 
  10.  <div id="info" style="background:black;height:500px;width:1067px;overflow:scroll;color:white"
  11.  </div> 
  12.  
  13. <!-----AJAX------> 
  14.  <script language="javascript"
  15.  var xmlHttp; 
  16.  function createbook() 
  17.  { 
  18.  xmlHttp=GetXmlHttpObject() 
  19.  if (xmlHttp==null) 
  20.   { 
  21.   alert ("浏览器不支持ajax"
  22.   return 
  23.   } 
  24.  var bookid=document.getElementById("myid").value 
  25.  var url="getinfo.php" 
  26.  url=url+"?bid="+bookid; 
  27.  url=url+"&sid="+Math.random() 
  28.  xmlHttp.onreadystatechange=stateChanged  
  29. xmlHttp.open("GET",url,true) 
  30.  xmlHttp.send(null) 
  31.  } 
  32.  
  33. function stateChanged()  
  34. {  
  35. if(xmlHttp.readyState==1){ 
  36.  
  37.  document.getElementById("info").innerHTML="正在准备工作,请耐心点哦~^_^~<img src=\"img/1.gif\"  /><br/>";  
  38. }  
  39. if(xmlHttp.readyState==2){ 
  40.  
  41.  document.getElementById("info").innerHTML="正在联系服务器,这可能需要一点时间啦^><img src=\"img/2.gif\"  /><^<br/>";  
  42.  
  43. if(xmlHttp.readyState==3){ 
  44.  
  45.  document.getElementById("info").innerHTML="正在解析数据<img src=\"img/3.gif\"  /><br/>";  
  46.  
  47. if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete"
  48.   {  
  49.  
  50.   document.getElementById("info").innerHTML=xmlHttp.responseText;  
  51.  //xmlHttp.abort(); 
  52.  
  53.  
  54.  
  55.  } 
  56.  
  57.  
  58.  
  59. function GetXmlHttpObject() 
  60.  { 
  61.  var xmlHttp=null; 
  62.  try 
  63.   { 
  64.   // Firefox, Opera 8.0+, Safari 
  65.   xmlHttp=new XMLHttpRequest(); 
  66.   } 
  67.  catch (e) 
  68.   { 
  69.   //Internet Explorer 
  70.   try 
  71.    { 
  72.    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); 
  73.    } 
  74.   catch (e) 
  75.    { 
  76.    xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); 
  77.    } 
  78.   } 
  79.  return xmlHttp; 
  80.  } 
  81.  </script> 
  82.  </body> 
  83.  </html> 

Tags: curl抓取网页数据

分享到: