• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 4年前 (2022-01-25) 30次浏览 已收录 0个评论

正则表达式

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

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

\s*(.*)\s*<\/a>\s*<\/h1>/”;
}
else{
//丧尸爆发之全家求生路_第一章 丧尸爆发  为吾友爱乐儿更新~_磨铁
$ru=”/(.*)<\/title>/”;<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=”/</p> <div class="page-content">[\s\S]*</p> <pre class="note" id="html_content_\d*">[\s\S]*(.*)<\/pre>/ui";%20<BR>%20%20$url='http://www.motie.com/book/'.$aid;<BR>%20%20//正则表达式匹配</P><P>%20%20//设置选项,包括URL<BR>%20%20curl_setopt($ch,%20CURLOPT_URL,%20$url);<BR>%20%20curl_setopt($ch,%20CURLOPT_RETURNTRANSFER,%201);//不自动输出内容<BR>%20%20curl_setopt($ch,%20CURLOPT_HEADER,%200);//不返回头部信息<BR>%20%20curl_setopt($ch,%20CURLOPT_CONNECTTIMEOUT_MS,%200);%20<BR>%20%20//执行curl<BR>%20%20$output%20=%20curl_exec($ch);<BR>%20%20//错误提示<BR>%20%20if(curl_exec($ch)%20===%20false){<BR>%20%20%20die(curl_error($ch));<BR>%20%20}<BR>%20%20//%20检查是否有错误发生<BR>%20%20if(curl_errno($ch)){<BR>%20%20%20echo%20'Curl%20error:%20'%20.%20curl_error($ch);<BR>%20%20}<BR>%20%20$arr=array();<BR>%20%20$arr2=array();<BR>%20%20preg_match_all($ru,$output,$arr);<BR>%20%20curl_close($ch);<BR>%20%20#var_dump($arr);<BR>%20%20$s=$arr[0][0];<BR>%20%20$s=substr($s,180);<BR>%20%20$arr2=explode("%20%20return%20trim($arr2[0]);<BR>%20}</P><P>%20////////////////////////////////////////////////////////////////<b>6本文来源gao@dai!ma.com搞$代^码!网7</b><pre class="prettyprint">搞gaodaima代码</pre> <p>//////////////////////////////////////////%20<BR>%20/*静态方法%20@生成小说文件%20可以直接调用%20*/<BR>%20//////////////////////////////////////////////////////////////////////////////////////////////////////////<BR>%20%20%20%20%20public%20static%20function%20createBookById($id){</p><div><div class="_t33rkthes8f"></div><script type="text/javascript">(window.slotbydup = window.slotbydup || []).push({id: "u6795179",container: "_t33rkthes8f",async: true});</script></div> <p>%20%20if(!is_numeric($id)){</P><P>%20%20echo%20"<br />INIT%20BEGIN%20START%20WRITE!";<BR>%20%20$st=new%20self();<BR>%20%20$cons=$st->getBookContextById($id);<BR>%20%20$title=$st->getBookNameById($id);<BR>%20%20$cons=trim($cons);<BR>%20%20$t=explode("%20",$title);<BR>%20%20//构造目录<BR>%20%20$dir=array();<BR>%20%20$dir=explode("_",$t[0]);<BR>%20%20$wzdir=$dir[0];%20%20//书名称%20作为目录名称<BR>%20%20$wzchapter=$dir[1];%20//第几章<BR>%20%20//创建目录<BR>%20%20$wzdir2=iconv("UTF-8",%20"GBK",%20$wzdir);//目录编码%20注意这里保留对$wzdir字符串的引用,用来构造文件名,不能用此处,防止二次编码<BR>%20%20if(!file_exists($wzdir2)){<BR>%20%20%20mkdir($wzdir2);%20//创建目录<BR>%20%20}<BR>%20%20//构造文件名<BR>%20%20$wztitle="./".$wzdir."/"."$t[0]".".txt";<BR>%20%20//保证保存的文件名称不是乱码<BR>%20%20$wztitle=iconv("UTF-8",%20"GBK",%20$wztitle);<BR>%20%20$f=fopen($wztitle,"w+");<BR>%20%20fwrite($f,$cons);<BR>%20%20echo%20"<font>$wzdir%20</font>".$wzchapter."<font>写入成功</font>";<BR>%20%20fclose($f);%20</p> <p>%20%20}%20<BR>%20%20else{<BR>%20%20$ids=self::getBookIdsById($id);%20</p> <p>%20%20//这里服务器可能会掉线,所以最好用session记录循环<BR>%20%20#for($i=$_SESSION["$id"."_fid"];$i<=count($ids);$_SESSION["$id"."_fid"]++,$i++){</p> <p>%20%20%20#self::createBookById($id."_".$ids[$_SESSION["$id"."_fid"]++]);//构造id<BR>%20%20#}</p> <p>%20%20for($i=$_SESSION["$id"."_fid"];$i<=count($ids);$_SESSION["$id"."_fid"]++,$i++){</p> <p>%20%20%20self::createBookById($id."_".$ids[$i]);//构造id<BR>%20%20}</p> <p>%20%20#echo%20"</p> <hr /> <hr /></p> <h1>写入工作全部完成</h1> <p>";<BR>%20%20#echo%20$id."_".$ids[0]."<br />";%20<BR>%20%20#var_dump($ids);</p> <p>%20%20}</P><P><BR>%20}<BR>%20%20/*<BR>%20%20获取小说的所有ID<BR>%20%20@param%20$id%20文章ID<BR>%20%20@return%20array;<BR>%20%20*/<BR>%20%20public%20static%20function%20getBookIdsById($aid){%20<BR>%20%20$ch=%20curl_init();<BR>%20%20$url='http://www.motie.com/book/'.$aid."/chapter";<BR>%20%20//注意这里的?可以获取最少匹配项<BR>%20%20$ru='/[\s\S]*?</p> <li>[\s\S]*?.*?<\/a>.*?/u';//正则表达式匹配<BR>%20%20//设置选项,包括URL<BR>%20%20curl_setopt($ch,%20CURLOPT_URL,%20$url);<BR>%20%20curl_setopt($ch,%20CURLOPT_RETURNTRANSFER,%201);//不自动输出内容<BR>%20%20curl_setopt($ch,%20CURLOPT_HEADER,%200);//不返回头部信息<BR>%20%20curl_setopt($ch,%20CURLOPT_CONNECTTIMEOUT_MS,%200);%20<BR>%20%20//执行curl<BR>%20%20$output%20=%20curl_exec($ch);<BR>%20%20//%20检查是否有错误发生<BR>%20%20if(curl_errno($ch)){<BR>%20%20echo%20'Curl%20error:%20'%20.%20curl_error($ch);<BR>%20%20}<BR>%20%20//释放curl句柄<BR>%20%20curl_close($ch);<BR>%20%20$arr=array();<BR>%20%20preg_match_all($ru,$output,$arr,PREG_PATTERN_ORDER);<BR>%20%20return%20$arr[1];<BR>%20%20}<BR>}<BR>?><BR></P><P>getinfo.php<BR><U>复制代码</U>%20代码如下:<BR><?php<BR>%20session_start();<BR>require_once("SpiderTools.class.php");<BR>if($_REQUEST["bid"]){<BR>if(is_numeric($_REQUEST["bid"])){<BR>%20SpiderTools::createBookById(trim($_REQUEST["bid"]));<BR>%20}<BR>%20else{<BR>%20%20echo%20"<br />请输入正确的文章ID<br />";<BR>%20}<BR>}<BR>?><BR></P><P>index.html<BR><U>复制代码</U>%20代码如下:<BR><BR><meta%20charset="utf-8"/><BR><title>下载小说啦
<body>

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








<script%20language="javascript">
var%20xmlHttp;
function%20createbook()
{
xmlHttp=GetXmlHttpObject()
if%20(xmlHttp==null)
%20{
%20alert%20("浏览器不支持ajax")
%20return
%20}
var%20bookid=document.getElementById("myid").value
var%20url="getinfo.php"
url=url+"?bid="+bookid;
url=url+"&sid="+Math.random()
xmlHttp.onreadystatechange=stateChanged%20
xmlHttp.open("GET",url,true)
xmlHttp.send(null)
}

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

%20document.getElementById("info").innerHTML="正在准备工作,请耐心点哦~^_^~
";
}
if(xmlHttp.readyState==2){

document.getElementById("info").innerHTML="正在联系服务器,这可能需要一点时间啦^><^
";
}

if(xmlHttp.readyState==3){

document.getElementById("info").innerHTML="正在解析数据
";
}

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>


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:php使用curl和正则表达式抓取网页数据示例_PHP

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址