php使用curl和 正则表达式抓取网页数据示例,这里是抓取某网站的小说。

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

<?phpsession_start();//封装成类 开启这些自动抓取文章#header("Refresh:30;http://www.jbxue.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="/<h1\sclass=\"p-title\">\s*<a\shref=\"\/book\/\d+\">(.*)\s*<\/a>\s*<\/h1>/";}else{//<title>丧尸爆发之全家求生路_第一章  丧尸爆发  为吾友爱乐儿更新~_磨铁</title>$ru="/<title>(.*)<\/title>/";}//设置选项,包括URLcurl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自动输出内容curl_setopt($ch, CURLOPT_HEADER, 0);//不返回头部信息curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0); //执行curl$output = curl_exec($ch);//错误提示if(curl_exec($ch) === false){die(curl_error($ch));}// 检查是否有错误发生if(curl_errno($ch)){echo 'Curl error: ' . curl_error($ch);}//释放curl句柄curl_close($ch);$arr=array();preg_match_all($ru,$output,$arr);return $arr[1][0];}//     /*传入文章ID  解析文章内容*///public  function getBookContextById($aid){//开始解析文章$ids=array();$ids=explode("_",$aid);$titleId=trim($ids[0]);$aticleId=trim($ids[1]);$ch= curl_init();$ru="/<div class=\"page-content\">[\s\S]*<pre οndragstart=\"return false\" οncοpy=\"return false;\" oncut=\"return false;\" οncοntextmenu=\"return false\" class=\"note\" id=\"html_content_\d*\">[\s\S]*(.*)<img src=\"\/ajax\/chapter\/$titleId\/$aticleId\" class=\"hidden\" \/><\/pre>/ui"; $url='http://www.motie.com/book/'.$aid;//正则表达式匹配//设置选项,包括URLcurl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自动输出内容curl_setopt($ch, CURLOPT_HEADER, 0);//不返回头部信息curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0); //执行curl$output = curl_exec($ch);//错误提示if(curl_exec($ch) === false){die(curl_error($ch));}// 检查是否有错误发生if(curl_errno($ch)){echo 'Curl error: ' . curl_error($ch);} www.jbxue.com$arr=array();$arr2=array();preg_match_all($ru,$output,$arr);curl_close($ch);#var_dump($arr);$s=$arr[0][0];$s=substr($s,180);$arr2=explode("<img",$s);return trim($arr2[0]);}// /*静态方法 @生成小说文件 可以直接调用 *///public static function createBookById($id){if(!is_numeric($id)){echo "<br/>INIT BEGIN START WRITE!";$st=new self();$cons=$st->getBookContextById($id);$title=$st->getBookNameById($id);$cons=trim($cons);$t=explode(" ",$title);//构造目录$dir=array();$dir=explode("_",$t[0]);$wzdir=$dir[0];  //书名称 作为目录名称$wzchapter=$dir[1]; //第几章//创建目录$wzdir2=iconv("UTF-8", "GBK", $wzdir);//目录编码 注意这里保留对$wzdir字符串的引用,用来构造文件名,不能用此处,防止二次编码if(!file_exists($wzdir2)){mkdir($wzdir2); //创建目录}//构造文件名$wztitle="./".$wzdir."/"."$t[0]".".txt";//保证保存的文件名称不是乱码$wztitle=iconv("UTF-8", "GBK", $wztitle);$f=fopen($wztitle,"w+");fwrite($f,$cons);echo "<font color='green'>$wzdir </font>".$wzchapter."<font color='red'>写入成功</font>";fclose($f); } else{$ids=self::getBookIdsById($id); //这里服务器可能会掉线,所以最好用session记录循环#for($i=$_SESSION["$id"."_fid"];$i<=count($ids);$_SESSION["$id"."_fid"]++,$i++){#self::createBookById($id."_".$ids[$_SESSION["$id"."_fid"]++]);//构造id#}for($i=$_SESSION["$id"."_fid"];$i<=count($ids);$_SESSION["$id"."_fid"]++,$i++){self::createBookById($id."_".$ids[$i]);//构造id}#echo "<hr/><hr/><br/><h1>写入工作全部完成</h1>";#echo $id."_".$ids[0]."<br/>"; #var_dump($ids);}}/*获取小说的所有ID@param $id 文章ID@return array;*/public static function getBookIdsById($aid){ $ch= curl_init();$url='http://www.motie.com/book/'.$aid."/chapter";//注意这里的?可以获取最少匹配项$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';//正则表达式匹配//设置选项,包括URLcurl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自动输出内容curl_setopt($ch, CURLOPT_HEADER, 0);//不返回头部信息curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0); //执行curl$output = curl_exec($ch);// 检查是否有错误发生if(curl_errno($ch)){echo 'Curl error: ' . curl_error($ch);}//释放curl句柄curl_close($ch);$arr=array();preg_match_all($ru,$output,$arr,PREG_PATTERN_ORDER);return $arr[1];}
}
?>

getinfo.php

<?phpsession_start();
require_once("SpiderTools.class.php");
if($_REQUEST["bid"]){
if(is_numeric($_REQUEST["bid"])){SpiderTools::createBookById(trim($_REQUEST["bid"]));}else{echo "<br/>请输入正确的文章ID<br/>";}
}
?>

index.html

<html>
<head><meta charset="utf-8"/></head>
<title>下载小说啦--脚本学堂-www.jbxue.com</title>
<body>
<h1>输入磨铁中文网你想看到的小说ID号就可以下载小说啦</h1>
<form method="get" action="getinfo.php">
<input type="text" id="myid" name="myid" value=""/>
<input type="button" value="生成小说" οnclick="createbook();"/>
</form>
<div id="info" style="background:black;height:500px;width:1067px;overflow:scroll;color:white">
</div>
<!-----AJAX------>
<script language="javascript">
var xmlHttp;
function createbook()
{
xmlHttp=GetXmlHttpObject()
if (xmlHttp==null){alert ("浏览器不支持ajax")return}
var bookid=document.getElementById("myid").value
var url="getinfo.php"
url=url+"?bid="+bookid;
url=url+"&sid="+Math.random()
xmlHttp.onreadystatechange=stateChanged
xmlHttp.open("GET",url,true)
xmlHttp.send(null)
}
function stateChanged()
{
if(xmlHttp.readyState==1){document.getElementById("info").innerHTML="正在准备工作,请耐心点哦~^_^~<img src=\"img/1.gif\"  /><br/>";
}
if(xmlHttp.readyState==2){document.getElementById("info").innerHTML="正在联系服务器,这可能需要一点时间啦^><img src=\"img/2.gif\"  /><^<br/>";
}
if(xmlHttp.readyState==3){document.getElementById("info").innerHTML="正在解析数据<img src=\"img/3.gif\"  /><br/>";
}
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+, SafarixmlHttp=new XMLHttpRequest();}
catch (e){//Internet Explorertry{xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");}catch (e){xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");}}
return xmlHttp;
}
</script>
</body>
</html>

php curl与正则表达式抓取网页数据的例子相关推荐

  1. php 正则抓取页面内容_php使用curl和正则表达式抓取网页数据示例

    session_start(); //封装成类 开启这些自动抓取文章 #header("Refresh:30;http://www.test.com:8080"); class S ...

  2. php正则获取li,用正则表达式抓取网页中的ul 和 li标签中最终的值!

    获取你要抓取的页面 const string URL = "http://www.hn3ddf.gov.cn/price/GetList.html?pageno=1";       ...

  3. cookie追加数据_集算器 SPL 抓取网页数据

    [摘要] 集算器 SPL 支持抓取网页数据,根据抓取定义规则,可将网页数据下载到在本地进行统计分析.具体定义规则要求.使用详细情况,请前往乾学院:集算器 SPL 抓取网页数据! 网站上的数据源是我们进 ...

  4. php如何抓取网页内容,php如何抓取网页数据?

    php抓取网页数据header("Content-type: text/html; charset=utf-8"); //$url = "https://www.cnbl ...

  5. iOS开发——网络使用技术OC篇网络爬虫-使用正则表达式抓取网络数据

    网络爬虫-使用正则表达式抓取网络数据 关于网络数据抓取不仅仅在iOS开发中有,其他开发中也有,也叫网络爬虫,大致分为两种方式实现 1:正则表达 2:利用其他语言的工具包:java/Python 先来看 ...

  6. matlab抓取网页信息,如何利用Matlab抓取网页数据

    如何利用Matlab抓取网页数据 2019-01-01 %朋友需要做金融方面的分析,要求从网站上下载大量的数据,一个一个复制粘贴太费事.我写了一个简单的网络爬虫,主要用到正则表达式,可以自动下载网页源 ...

  7. php 抓取网页数据

    php 抓取网页数据 header("Content-type: text/html; charset=utf-8"); //$url = "https://www.cn ...

  8. php取网页内容乱码,如何解决php用file_get_contents方法抓取网页数据出现乱码

    我们都经常碰到在抓取数据时碰到乱码现象,让人崩溃.今天主要和大家探讨如何解决php用file_get_contents方法抓取网页数据出现乱码的问题,需要的朋友可以参考下,希望能帮助到大家.下面跟随小 ...

  9. r语言抓取网页数据_使用R进行网页抓取的简介

    r语言抓取网页数据 by Hiren Patel 希伦·帕特尔(Hiren Patel) 使用R进行网页抓取的简介 (An introduction to web scraping using R) ...

最新文章

  1. 小工程结算书范本_工程结算合同书范本_工程结算合同格式
  2. matlab cfun,【图片】求求各位大佬帮弱鸡看看【matlab吧】_百度贴吧
  3. C++:14---虚继承,虚函数,多态
  4. win10系统崩溃怎么修复_系统崩溃怎么重装系统图文教程
  5. python模拟多线程http请求_用python实现自己的http服务器——多进程、多线程、协程、单进程非堵塞版、epoll版...
  6. 自动档汽车正确的操作方法和习惯---请教贴
  7. reconnecting-websocket.min.js
  8. 4am永远 鼠标按键设置_2020年最新更新,游戏鼠标用哪个品牌比较好,该怎么选?...
  9. 思考像微信QQ视频通话最小化后悬浮展现实现思路
  10. 物理机下安装 VMware ESXi 6.7
  11. java 参数中含有… 是什么意思
  12. 【数学】用C语言实现函数的定积分—— 把 “定积分定义计算出的值” 和 “牛顿-莱布尼兹公式计算出的值” 两者进行误差比较
  13. 腾讯云Ubuntu建FTP心得
  14. 华为云数据转发与分析
  15. 深入理解RPC-RPC要解决的核心问题和在企业服务中的地位
  16. 软件测试 | 测试开发 | Git实战(四)| Git分支管理实操,在线合并和本地合并
  17. 熊猫烧香作者李俊的个人简历
  18. android手机做路由器,手机充当无线路由 给电脑无线信号的方法
  19. python里order什么意思_order是什么意思?看完我有点懵圈儿
  20. 【rmzt】XP系统动漫桌面主题下载

热门文章

  1. SAP ECN修改记录实现方案
  2. linux应用层之进程间通信学习笔记
  3. 解决连接蓝牙音箱默认音量100%的问题
  4. MongoDB入门操作汇总
  5. 神奇的“狼抓兔子”(The absolute security Place)
  6. 线上数据监测之数据采集
  7. prometheus-operater监控etcd
  8. unary_function和binary_function详解
  9. Uniapp的消息推送Unipush(在线、离线、服务端)
  10. 读书笔记 | 之Photoshop里Pantone色类型该如何选择