>백엔드 개발 >PHP 튜토리얼 >컬과 정규 표현식을 사용하여 웹 데이터 크롤링

컬과 정규 표현식을 사용하여 웹 데이터 크롤링

WBOY
WBOY원래의
2016-07-25 08:48:281487검색
Motie Chinese 웹사이트의 비VIP 챕터에 대해 컬과 정규식을 사용하여 만든 소설 그래버입니다. 소설을 다운로드하려면 소설 ID를 입력하는 것을 지원합니다.
종속성: 컬
Curl, 정규 표현식, Ajax 및 기타 기술이 사용되어 초보자에게 적합합니다.로컬에서 테스트할 때는 인터넷에 연결되어 있는지 확인하고 PHP가 컬 모드를 켜는지 확인해야 합니다.
  1. session_start();
  2. //자동으로 크롤링되는 기사를 활성화하려면 클래스로 캡슐화하세요
  3. #header("Refresh:30;http : //www.test.com:8080");
  4. class SpiderTools{
  5. //////////////////////////// /////////////////////////////////////////////// ///// ///////////////////////////
  6. /*들어오는 기사 ID는 기사 제목을 구문 분석합니다*/
  7. ///// /////////////////////////////////////////// ///////// //////////////////////////////////////// //////////// /
  8. 공용 함수 getBookNameById($aid){
  9. //curl 초기화
  10. $ch= cur_init();
  11. //url
  12. $url='http://www.motie.com/book/'.$aid;
  13. if(is_numeric($aid)){
  14. //정규식 일치
  15. $ru="/< ;h1sclass="p-title">s *(.*)s*s*/";
  16. }
  17. else{
  18. //< title>Zombie Outbreak: The Family's Way to Survive_Chapter One: Zombie Outbreak Update for My Friend~_Sharp Iron
  19. $ru="/ (.*)</title> ;/";<li> }<li> //URL을 포함한 옵션 설정<li> 컬_setopt($ch, CURLOPT_URL, $url);<li> 컬_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//자동 출력 없음 Content<li> cur_setopt($ch, CURLOPT_HEADER, 0); //헤더 정보를 반환하지 않습니다.<li> cur_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0); //curl 실행<li> $output = curl_exec($ ch);<li> //오류 메시지<li> if(curl_exec($ch) === false){<li> die(curl_error($ch));<li> } <li> // 오류가 발생했는지 확인<li> if(curl_errno($ch)){<li> echo '컬 오류: ' .curl_error($ch);<li> }<li> //해제 컬 핸들<li> 컬_close($ch) ;<li> $arr=array();<li> preg_match_all($ru,$output,$arr);<li> return $arr[1][0];<li> }<li> //// /////////////////////////////////////// ///////////// //////////////////////////////////// //////////////// // <li> /*기사 내용을 파싱하기 위해 기사 ID를 입력하세요*/<li> ///////////// /////////////////// ////////////////////////////// ///////////////////// /////////////////////////<li> public function getBookContextById($aid){<li> //기사 구문 분석 시작<li> $ids= array();<li> $ids=explode("_",$aid);<li> $titleId= 트림($ids[0]);<li> $aticleId=trim($ids[1]) <li> $ch= 컬_init();<li> $ru="/<div class="page- content">[sS]*<pre ondragstart="return false" oncopy="return false;" oncut="return false;" oncontextmenu="return false" class="note" id="html_content_d*"> [sS]*(.*)<img src="/ajax/chapter/$titleId/$aticleId " class="hidden" /></pre>/ui"; </li> <li> $url='http ://www.motie.com/book/'.$aid;</li> <li> //정규식 일치</li> <li> <li> //URL을 포함한 옵션 설정</li> <li> 컬_setopt($ch, CURLOPT_URL, $url) ; //curl 실행</li> <li> $output =curl_exec($ch);</li> <li> //오류 메시지</li> <li> if(curl_exec($ch) === false){</li> <li> die (curl_error($ch));</li> <li> }</li> <li> // 오류 발생 여부 확인</li> <li> if(curl_errno($ch)){</li> <li> echo '컬 오류: ' . </li> <li> }</li> <li> $arr=array();</li> <li> $arr2=array() </li> <li> preg_match_all($ru,$output,$arr);</li> <li>curl_close($ch);</li> <li> #var_dump($arr);</li> <li> $s=$arr[0][0];</li> <li> $s=substr($s,180);</li> <li> $arr2=explode("<img" ,$s);<li> return Trim($arr2[0]);<li> }<li><li> /////////////////////// ///////////////////////////////////////////////// //////////////////////////// ////////// <li> /*정적 메소드 @생성 소설 파일을 직접 호출할 수 있습니다*/<li> ///////////////////// ////////////////// ///////////////////////////////////////////////// //////////////////////<li> 공개 정적 함수 createBookById($id){<li> <li> if(!is_numeric($id)){ <li><li> echo "<br/>INIT BEGIN START WRITE!";</li> <li> $st=new self();</li> <li> $cons =$st->getBookContextById($id);</li> <li> $title=$st->getBookNameById($id);</li> <li> $cons=trim($cons);</li> <li> $t=explode(" ",$title);</li> <li> //디렉토리 구성 </li> <li> $dir=array();</li> <li> $dir=explode("_",$t[0]);</li> <li> $wzdir=$dir [0] //책 이름을 디렉터리 이름으로</li> <li> $wzchapter=$dir[1]; //</li> <li> //디렉토리 생성</li> <li> $wzdir2=iconv("UTF-8", " GBK", $wzdir);//디렉터리 인코딩에 유의하세요. $wzdir 문자열에 대한 참조는 파일 이름을 구성하기 위해 여기에 유지됩니다. 2차 인코딩을 방지하기 위해 여기에서 사용할 수 없습니다.</li> <li> if(!file_exists($wzdir2)){ </li> <li> mkdir($wzdir2); </li> <li> }</li> <li> //파일 이름 구성</li> <li> $wztitle="./".$wzdir."/"."$t[0]".".txt";</li> <li> //저장된 파일 이름이 맞는지 확인 잘못된 문자가 아닙니다</li> <li> $wztitle=iconv("UTF-8", "GBK", $wztitle);</li> <li> $f=fopen($wztitle,"w ");</li> <li> fwrite($f, $cons) ;</li> <li> echo "<font color='green'>$wzdir </font>".$wzchapter."<font color='red'>쓰기 성공</font>"; </li> <li> fclose($f); </li> <li> </li> <li> } </li> <li> else{</li> <li> $ids=self::getBookIdsById($id) </li> <li> </li> <li> //여기 서버는 오프라인일 수 있습니다. , 따라서 세션 기록 루프를 사용하는 것이 가장 좋습니다</li> <li> #for($i=$_SESSION["$id"."_fid"];$i<=count($ids);$_SESSION["$id"." _fid" ] ,$i ){<li> <li> #self::createBookById($id."_".$ids[$_SESSION["$id"."_fid"] ]);//구성 ID<li> #}<li> <li> for($i=$_SESSION["$id"."_fid"];$i<=count($ids);$_SESSION["$id"."_fid"] ,$ i ){<li> <li> self::createBookById($id."_".$ids[$i]);//ID 생성<li> }<li> <li> #echo "< hr/ ><hr/><br/><h1>작성 작업이 완료되었습니다</h1>";<li> #echo $id."_".$ids[0]." < ;br/>"; </li> <li> #var_dump($ids);</li> <li> </li> <li> }</li> <li> <li> }</li> <li> /*</li> <li> 소설의 모든 ID 가져오기</li> <li> @ param $ id 기사 ID</li> <li> @return array;</li> <li> */</li> <li> public static function getBookIdsById($aid){ </li> <li> $ch=curl_init();</li> <li> $url='http:// www.motie.com/book/'.$aid."/chapter";</li> <li> //최소 일치 항목을 얻으려면 여기에서 ?에 주의하세요</li> <li> $ru='/[sS]*?< li class="" createate="d{4}-d{2}-d{2} d{2}:d{2}:d{2}">[sS]*?<a href=" /book/'.$aid.'_(d*?)"s Programmer Joke>.*?</a>.*?/u';//정규식 일치</li> <li> //URL을 포함한 옵션 설정 </li> <li>curl_setopt($ch, CURLOPT_URL, $url);</li> <li>curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//내용을 자동으로 출력하지 않음</li> <li>curl_setopt($ch, CURLOPT_HEADER, 0);// 헤더를 반환하지 않음 Information</li> <li> cur_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0) </li> <li> //curl 실행</li> <li> $output = cur_exec($ch);</li> <li> // 오류 발생 여부 확인</li> <li> if(curl_errno( $ch)){</li> <li> echo '컬 오류: ' . 컬_error($ch);</li> <li> }</li> <li> //컬 핸들 해제</li> <li> 컬_close($ch);</li> <li> $arr=array( );</li> <li> preg_match_all($ru,$output,$arr,PREG_PATTERN_ORDER);</li> <li> return $arr[1];</li> <li> }</li> <li> }</li> <li> <li> <li> </li> <li> </li> <li> </li> <li> </li> <li> </li> <li> </li> <li>?></li> </ol></div> <em onclick="copycode($('code_Sfk'));">코드 복사</em> </div> <div class="blockcode"> <div id="code_Zt6"><ol> <li><?php<li> session_start();<li>require_once("SpiderTools.class.php");<li>if($_REQUEST["bid"]) {<li>if(is_numeric($_REQUEST["bid"])){<li> SpiderTools::createBookById(trim($_REQUEST["bid"]));<li> }<li> else{<li> echo "<br/>올바른 기사 ID를 입력하세요<br/>";</li> <li> }</li> <li>}</li> <li>?></li> <li> </ol></div> <em onclick="copycode($('code_Zt6'));">코드 복사</em> </div> <div class="blockcode"> <div id="code_i6J"><ol> <li><html></li> <li><head><meta charset="utf-8"/></head></li> <li><title>소설 다운로드 La</li> <li> <li><h1>Motie 중국어 홈페이지에서 보고 싶은 소설의 ID번호를 입력하시면 소설을 다운로드 받으실 수 있습니다</h1></li> <li><양식 방법 ="get" action="getinfo.php"></li> <li><input type="text" id="myid" name="myid" value=""/></li> <li><input type=" 버튼" value="소설 생성" onclick="createbook();"/></li> <li></form></li> <li><div id="info" style="배경:black;height:500px;width :1067px;overflow:scroll;color:white"></li> <li></div></li> <li> <li><!-----AJAX------></li> <li><script 언어="javascript"></li> <li>var xmlHttp;</li> <li>function createbook()</li> <li>{</li> <li>xmlHttp=GetXmlHttpObject()</li> <li>if (xmlHttp==null)</li> <li> {</li> <li> 경고 ("브라우저가 ajax를 지원하지 않습니다.")</li> <li> return</li> <li> }</li> <li>var bookid=document.getElementById("myid").value</li> <li>var url="getinfo.php"</li> <li>url= url "?bid=" bookid;</li> <li>url=url "&sid=" Math.random()</li> <li>xmlHttp.onreadystatechange=stateChanged </li> <li>xmlHttp.open("GET",url,true)</li> <li>xmlHttp . send(null)</li> <li>}</li> <li> <li>function stateChanged() </li> <li>{ </li> <li>if(xmlHttp.readyState==1){</li> <li> <li> document.getElementById("info") . innerHTML="준비 중입니다. 조금만 기다려주세요~^_^~<img src="img/1.gif" /><br/>" </li> <li>} </li> <li>if(xmlHttp .readyState==2){</li> <li> <li> document.getElementById("info").innerHTML="서버에 연결하는 데 시간이 걸릴 수 있습니다^><img src="img/2.gif" / ><^<br/>"; </li> <li>} </li> <li> <li>if(xmlHttp.readyState==3){</li> <li> <li> document.getElementById("info").innerHTML= "데이터 구문 분석<img src="img/3.gif" /><br/>" </li> <li>} </li> <li> <li>if (xmlHttp.readyState==4 || xmlHttp.readyState == "완료")</li> <li> { </li> <li> </li> <li> document.getElementById("info").innerHTML=xmlHttp.responseText; </li> <li> //xmlHttp.abort();</li> <li> <li> </li> <li> <li> } </li> <li> <li> <li>}</li> <li> <li>function GetXmlHttpObject()</li> <li>{</li> <li>var xmlHttp=null;</li> <li>try</li> <li> {</li> <li> // Firefox, Opera 8.0, Safari</li> <li> xmlHttp=new XMLHttpRequest();</li> <li> }</li> <li>catch(e)</li> <li> {</li> <li> //Internet Explorer</li> <li> try</li> <li> {</li> <li> xmlHttp =new ActiveXObject("Msxml2.XMLHTTP");</li> <li> }</li> <li> catch(e)</li> <li> {</li> <li> xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");</li> <li> }</li> <li> }</li> <li> return xmlHttp;</li> <li>}</li> <li></script></li> <li></body></li> <li></html> </li> <li> </li> <li> </li> <li> </li> <li> </li> <li> </li> <li> </ol></div> <em onclick="copycode($('code_i6J'));">코드 복사</em> </div> </td></tr></table> <div id="comment_52093" class="cm"> </div> <div id="post_rate_div_52093"></div> <br><br></div><div class="nphpQianMsg"><div class="clear"></div></div><div class="nphpQianSheng"><span>성명:</span><div>본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.</div></div></div><div class="nphpSytBox"><span>이전 기사:<a class="dBlack" title="Jquery를 기반으로 한 폭포수 흐름" href="https://m.php.cn/ko/faq/314273.html">Jquery를 기반으로 한 폭포수 흐름</a></span><span>다음 기사:<a class="dBlack" title="Jquery를 기반으로 한 폭포수 흐름" href="https://m.php.cn/ko/faq/314276.html">Jquery를 기반으로 한 폭포수 흐름</a></span></div><div class="nphpSytBox2"><div class="nphpZbktTitle"><h2>관련 기사</h2><em><a href="https://m.php.cn/ko/article.html" class="bBlack"><i>더보기</i><b></b></a></em><div class="clear"></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="fluid" data-ad-layout-key="-6t+ed+2i-1n-4w" data-ad-client="ca-pub-5902227090019525" data-ad-slot="8966999616"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><ul class="nphpXgwzList"><li><b></b><a href="https://m.php.cn/ko/faq/1.html" title="cURL을 사용하여 PHP에서 Get 및 Post 요청을 구현하는 방법" class="aBlack">cURL을 사용하여 PHP에서 Get 및 Post 요청을 구현하는 방법</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/1.html" title="cURL을 사용하여 PHP에서 Get 및 Post 요청을 구현하는 방법" class="aBlack">cURL을 사용하여 PHP에서 Get 및 Post 요청을 구현하는 방법</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/1.html" title="cURL을 사용하여 PHP에서 Get 및 Post 요청을 구현하는 방법" class="aBlack">cURL을 사용하여 PHP에서 Get 및 Post 요청을 구현하는 방법</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/1.html" title="cURL을 사용하여 PHP에서 Get 및 Post 요청을 구현하는 방법" class="aBlack">cURL을 사용하여 PHP에서 Get 및 Post 요청을 구현하는 방법</a><div class="clear"></div></li><li><b></b><a href="https://m.php.cn/ko/faq/2.html" title="정규식의 모든 표현식 기호(요약)" class="aBlack">정규식의 모든 표현식 기호(요약)</a><div class="clear"></div></li></ul></div></div><ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-5902227090019525" data-ad-slot="5027754603"></ins><script> (adsbygoogle = window.adsbygoogle || []).push({}); </script><footer><div class="footer"><div class="footertop"><img src="/static/imghwm/logo.png" alt=""><p>공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!</p></div><div class="footermid"><a href="https://m.php.cn/ko/about/us.html">회사 소개</a><a href="https://m.php.cn/ko/about/disclaimer.html">부인 성명</a><a href="https://m.php.cn/ko/update/article_0_1.html">Sitemap</a></div><div class="footerbottom"><p> © php.cn All rights reserved </p></div></div></footer><script>isLogin = 0;</script><script type="text/javascript" src="/static/layui/layui.js"></script><script type="text/javascript" src="/static/js/global.js?4.9.47"></script></div><script src="https://vdse.bdstatic.com//search-video.v1.min.js"></script><link rel='stylesheet' id='_main-css' href='/static/css/viewer.min.css' type='text/css' media='all'/><script type='text/javascript' src='/static/js/viewer.min.js?1'></script><script type='text/javascript' src='/static/js/jquery-viewer.min.js'></script><script>jQuery.fn.wait = function (func, times, interval) { var _times = times || -1, //100次 _interval = interval || 20, //20毫秒每次 _self = this, _selector = this.selector, //选择器 _iIntervalID; //定时器id if( this.length ){ //如果已经获取到了,就直接执行函数 func && func.call(this); } else { _iIntervalID = setInterval(function() { if(!_times) { //是0就退出 clearInterval(_iIntervalID); } _times <= 0 || _times--; //如果是正数就 -- _self = $(_selector); //再次选择 if( _self.length ) { //判断是否取到 func && func.call(_self); clearInterval(_iIntervalID); } }, _interval); } return this; } $("table.syntaxhighlighter").wait(function() { $('table.syntaxhighlighter').append("<p class='cnblogs_code_footer'><span class='cnblogs_code_footer_icon'></span></p>"); }); $(document).on("click", ".cnblogs_code_footer",function(){ $(this).parents('table.syntaxhighlighter').css('display','inline-table');$(this).hide(); }); $('.nphpQianCont').viewer({navbar:true,title:false,toolbar:false,movable:false,viewed:function(){$('img').click(function(){$('.viewer-close').trigger('click');});}}); </script></body></html>