Home >Backend Development >PHP Tutorial >php使用curl和正则表达式抓取网页数据示例_PHP

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

WBOY
WBOYOriginal
2016-06-01 11:54:401003browse

正则表达式

利用curl和正则表达式做的一个针对磨铁中文网非vip章节的小说抓取器,支持输入小说ID下载小说。
依赖项:curl
可以简单的看下,里面用到了curl ,正则表达式,ajax等技术,适合新手看看。在本地测试,必须保证联网并且确保php开启curl的mode

SpiderTools.class.php
复制代码 代码如下:
  session_start();
 //封装成类 开启这些自动抓取文章
  #header("Refresh:30;http://www.test.com:8080");
 class SpiderTools{ 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////
 /*传入文章ID 解析出文章标题*/
 //////////////////////////////////////////////////////////////////////////////////////////////////////////
 public function getBookNameById($aid){
  //初始化curl
  $ch= curl_init();
  //url
  $url='http://www.motie.com/book/'.$aid;
  if(is_numeric($aid)){
  //正则表达式匹配
  $ru="/

\s*(.*)\s*\s*/";
  }
  else{
  //丧尸爆发之全家求生路_第一章  丧尸爆发  为吾友爱乐儿更新~_磨铁
  $ru="/(.*)/";<br>  }<br>  //设置选项,包括URL<br>  curl_setopt($ch, CURLOPT_URL, $url);<br>  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自动输出内容<br>  curl_setopt($ch, CURLOPT_HEADER, 0);//不返回头部信息<br>  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0); <br>  //执行curl<br>  $output = curl_exec($ch);<br>  //错误提示<br>  if(curl_exec($ch) === false){<br>   die(curl_error($ch));<br>  }<br>  // 检查是否有错误发生<br>  if(curl_errno($ch)){<br>  echo 'Curl error: ' . curl_error($ch);<br>  }<br>  //释放curl句柄<br>  curl_close($ch);<br>  $arr=array();<br>  preg_match_all($ru,$output,$arr);<br>  return $arr[1][0];<br>   }<br> //////////////////////////////////////////////////////////////////////////////////////////////////////////     <br> /*传入文章ID  解析文章内容*/<br> //////////////////////////////////////////////////////////////////////////////////////////////////////////<br> public  function getBookContextById($aid){<br>  //开始解析文章<br>  $ids=array();<br>  $ids=explode("_",$aid);<br>  $titleId=trim($ids[0]);<br>  $aticleId=trim($ids[1]);<br>  $ch= curl_init();<br>  $ru="/<div class='\"page-content\"'>[\s\S]*<pre ondragstart='\"return' false oncopy='\"return' oncut='\"return' oncontextmenu='\"return' class='\"note\"' id='\"html_content_\d*\"'>[\s\S]*(.*)<img src="%5C%22%5C/ajax%5C/chapter%5C/%24titleId%5C/%24aticleId%5C%22" class='\"hidden\"' alt="php使用curl和正则表达式抓取网页数据示例_PHP" >/ui"; <br>  $url='http://www.motie.com/book/'.$aid;<br>  //正则表达式匹配 <p>  //设置选项,包括URL<br>  curl_setopt($ch, CURLOPT_URL, $url);<br>  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自动输出内容<br>  curl_setopt($ch, CURLOPT_HEADER, 0);//不返回头部信息<br>  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0); <br>  //执行curl<br>  $output = curl_exec($ch);<br>  //错误提示<br>  if(curl_exec($ch) === false){<br>   die(curl_error($ch));<br>  }<br>  // 检查是否有错误发生<br>  if(curl_errno($ch)){<br>   echo 'Curl error: ' . curl_error($ch);<br>  }<br>  $arr=array();<br>  $arr2=array();<br>  preg_match_all($ru,$output,$arr);<br>  curl_close($ch);<br>  #var_dump($arr);<br>  $s=$arr[0][0];<br>  $s=substr($s,180);<br>  $arr2=explode("<img alt="php使用curl和正则表达式抓取网页数据示例_PHP" >  return trim($arr2[0]);<br> }</p> <p> ////////////////////////////////////////////////////////////////////////////////////////////////////////// <br> /*静态方法 @生成小说文件 可以直接调用 */<br> //////////////////////////////////////////////////////////////////////////////////////////////////////////<br>     public static function createBookById($id){<br><br>  if(!is_numeric($id)){</p> <p>  echo "<br>INIT BEGIN START WRITE!";<br>  $st=new self();<br>  $cons=$st->getBookContextById($id);<br>  $title=$st->getBookNameById($id);<br>  $cons=trim($cons);<br>  $t=explode(" ",$title);<br>  //构造目录<br>  $dir=array();<br>  $dir=explode("_",$t[0]);<br>  $wzdir=$dir[0];  //书名称 作为目录名称<br>  $wzchapter=$dir[1]; //第几章<br>  //创建目录<br>  $wzdir2=iconv("UTF-8", "GBK", $wzdir);//目录编码 注意这里保留对$wzdir字符串的引用,用来构造文件名,不能用此处,防止二次编码<br>  if(!file_exists($wzdir2)){<br>   mkdir($wzdir2); //创建目录<br>  }<br>  //构造文件名<br>  $wztitle="./".$wzdir."/"."$t[0]".".txt";<br>  //保证保存的文件名称不是乱码<br>  $wztitle=iconv("UTF-8", "GBK", $wztitle);<br>  $f=fopen($wztitle,"w+");<br>  fwrite($f,$cons);<br>  echo "<font color="green">$wzdir </font>".$wzchapter."<font color="red">写入成功</font>";<br>  fclose($f); <br><br>  } <br>  else{<br>  $ids=self::getBookIdsById($id); <br><br>  //这里服务器可能会掉线,所以最好用session记录循环<br>  #for($i=$_SESSION["$id"."_fid"];$i<br>   #self::createBookById($id."_".$ids[$_SESSION["$id"."_fid"]++]);//构造id<br>  #}<br><br>  for($i=$_SESSION["$id"."_fid"];$i<br>   self::createBookById($id."_".$ids[$i]);//构造id<br>  }<br><br>  #echo "</p><hr><hr><br><h1>写入工作全部完成</h1>";<br>  #echo $id."_".$ids[0]."<br>"; <br>  #var_dump($ids);<br><br>  } <p><br> }<br>  /*<br>  获取小说的所有ID<br>  @param $id 文章ID<br>  @return array;<br>  */<br>  public static function getBookIdsById($aid){ <br>  $ch= curl_init();<br>  $url='http://www.motie.com/book/'.$aid."/chapter";<br>  //注意这里的?可以获取最少匹配项<br>  $ru='/[\s\S]*?</p></pre> <li class='\"\"' createdate='\"\d{4}\-\d{2}\-\d{2}'>[\s\S]*?<a href="%5C%22%5C/book%5C/'.%24aid.'_(%5Cd*?)%5C%22%5Cs%7B1%7D">.*?.*?/u';//正则表达式匹配<br>  //设置选项,包括URL<br>  curl_setopt($ch, CURLOPT_URL, $url);<br>  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自动输出内容<br>  curl_setopt($ch, CURLOPT_HEADER, 0);//不返回头部信息<br>  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0); <br>  //执行curl<br>  $output = curl_exec($ch);<br>  // 检查是否有错误发生<br>  if(curl_errno($ch)){<br>  echo 'Curl error: ' . curl_error($ch);<br>  }<br>  //释放curl句柄<br>  curl_close($ch);<br>  $arr=array();<br>  preg_match_all($ru,$output,$arr,PREG_PATTERN_ORDER);<br>  return $arr[1];<br>  }<br>}<br>?><br> <p>getinfo.php<br><u>复制代码</u> 代码如下:<br><?php <BR> session_start();<br>require_once("SpiderTools.class.php");<br>if($_REQUEST["bid"]){<br>if(is_numeric($_REQUEST["bid"])){<br> SpiderTools::createBookById(trim($_REQUEST["bid"]));<br> }<br> else{<br>  echo "<br>请输入正确的文章ID<br>";<br> }<br>}<br>?><br></p> <p>index.html<br><u>复制代码</u> 代码如下:<br><br></p> <meta charset="utf-8"> <br><title>下载小说啦

输入磨铁中文网你想看到的小说ID号就可以下载小说啦








function stateChanged()
{
if(xmlHttp.readyState==1){

 document.getElementById("info").innerHTML="正在准备工作,请耐心点哦~^_^~php使用curl和正则表达式抓取网页数据示例_PHP
";
}
if(xmlHttp.readyState==2){

 document.getElementById("info").innerHTML="正在联系服务器,这可能需要一点时间啦^>php使用curl和正则表达式抓取网页数据示例_PHP";
}

if(xmlHttp.readyState==3){

 document.getElementById("info").innerHTML="正在解析数据php使用curl和正则表达式抓取网页数据示例_PHP
";
}

if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete")
 {

 document.getElementById("info").innerHTML=xmlHttp.responseText;
 //xmlHttp.abort();

 

 }


}

function GetXmlHttpObject()
{
var xmlHttp=null;
try
 {
 // Firefox, Opera 8.0+, Safari
 xmlHttp=new XMLHttpRequest();
 }
catch (e)
 {
 //Internet Explorer
 try
  {
  xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
  }
 catch (e)
  {
  xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
 }
return xmlHttp;
}



Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Previous article:免费手机号码归属地API查询接口和PHP使用实例分享_PHPNext article:php中的curl使用入门教程和常见用法实例_PHP

Related articles

See more