手机
当前位置:查字典教程网 >编程开发 >php教程 >php使用curl和正则表达式抓取网页数据示例
php使用curl和正则表达式抓取网页数据示例
摘要:利用curl和正则表达式做的一个针对磨铁中文网非vip章节的小说抓取器,支持输入小说ID下载小说。依赖项:curl可以简单的看下,里面用到了...

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

依赖项:curl

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

SpiderTools.class.php

复制代码 代码如下:

<?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="/<h1sclass="p-title">s*<ashref="/book/d+">(.*)s*</a>s*</h1>/";

}

else{

//<title>丧尸爆发之全家求生路_第一章 丧尸爆发 为吾友爱乐儿更新~_磨铁</title>

$ru="/<title>(.*)</title>/";

}

//设置选项,包括URL

curl_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>[sS]*<pre ondragstart="return false" oncopy="return false;" oncut="return false;" oncontextmenu="return false" id="html_content_d*">[sS]*(.*)<img src="/ajax/chapter/$titleId/$aticleId" /></pre>/ui";

$url='http://www.motie.com/book/'.$aid;

//正则表达式匹配

//设置选项,包括URL

curl_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);

}

$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='/[sS]*"" createdate="d{4}-d{2}-d{2} d{2}:d{2}:d{2}">[sS]*"/book/'.$aid.'_(d*"s{1}>.*?</a>.*?/u';//正则表达式匹配

//设置选项,包括URL

curl_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

复制代码 代码如下:

<?php

session_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>下载小说啦</title>

<body>

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

<form method="get" action="getinfo.php">

<input type="text" id="myid" name="myid" value=""/>

<input type="button" value="生成小说"/>

</form>

<div id="info">

</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+""+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+, Safari

xmlHttp=new XMLHttpRequest();

}

catch (e)

{

//Internet Explorer

try

{

xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");

}

catch (e)

{

xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");

}

}

return xmlHttp;

}

</script>

</body>

</html>

PS:关于正则,这里再为大家推荐2款本站的正则表达式在线工具供大家参考使用(包括正则生成、匹配、验证等功能):

JavaScript正则表达式在线测试工具:http://tools.jb51.net/regex/javascript

正则表达式在线生成工具:http://tools.jb51.net/regex/create_reg

【php使用curl和正则表达式抓取网页数据示例】相关文章:

php实现修改新闻时删除图片的方法

php微信公众平台开发类实例

php实现递归抓取网页类实例

php生成随机密码的自定义函数

php输出全球各个时区列表的方法

php使用curl打开https网站的方法

php获取网页上所有链接的方法

如何在PHP中使用Oracle数据库(3)

一个php作的文本留言本的例子(三)

php使用substr()和strpos()联合查找字符串中某一特定字符的方法

精品推荐
分类导航