ホームページ >バックエンド開発 >PHPチュートリアル >PHP は、curl と正規表現を使用して Web ページ データをクロールします。 example_PHP チュートリアル

PHP は、curl と正規表現を使用して Web ページ データをクロールします。 example_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:32:49878ブラウズ

curl と正規表現を使用して、Motie 中国語 Web サイトの非 VIP 章用の小説グラバーを構築します。小説をダウンロードするための小説 ID の入力をサポートしています。
依存関係:curl
Curl、正規表現、Ajax などのテクノロジーが使用されており、初心者に適しています。ローカルでテストする場合は、インターネットに接続していることを確認し、PHP がcurl モードをオンにしていることを確認する必要があります

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*<\/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="/<div class=\"page-content\">[\s\S]*<pre ondragstart=\"return false\" oncopy=\"return false;\" oncut=\"return false;\" oncontextmenu=\"return false\" class=\"note\" id=\"html_content_\d*\">[\s\S]*(.*)<img src=\"\/ajax\/chapter\/$titleId\/$aticleId\" class=\"hidden\" \/><\/pre>/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",$s);<BR> 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> //ここではサーバーがオフラインの可能性があるため、セッション記録ループを使用するのが最善です<br> # for($i=$_SESSION["$id"."_fid"];$i<=count($ids);$_SESSION["$id"."_fid"]++,$i++){<br> <br> # self::createBookById($id."_".$ids[$_SESSION["$id"."_fid"]++]);//id を構築します<BR> #}<br><br> for($i=$ _SESSION[" $id"."_fid"];$i<=count($ids);$_SESSION["$id"."_fid"]++,$i++){<br><br> self::createBookById($id) ."_ ".$ids[$i]);//Construct id<BR> }<br><br> #echo "<hr/><hr/><br/><h1>書き込み作業は完了< /h1>";<br> #echo $id."_".$ids[0]."<br/>"; <BR> #var_dump($ids);<br><br> }</P> <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='/[sS]*?< li class= "" createdate="d{4}-d{2}-d{2} d{2}:d{2}:d{2}">[sS]*?<a href=" /book/ '.$aid.'_(d*?)"s{1}>.*?</a>.*?/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 エラー: ' 。 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> </div> <p>getinfo.php<br></p> <div class="codetitle"> <span style="CURSOR: pointer" onclick="doCopy('code20928')"><u>コードをコピーします</u></span> コードは次のとおりです:</div> <div class="code" id="code20928"> <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> </div> <p>index.html<br></p> <div class="codetitle"> <span style="CURSOR: pointer" onclick="doCopy('code98901')"><u>コードをコピーします</u></span> コードは次のとおりです:</div> <div class="code" id="code98901"> <br><html><br><head><meta charset="utf-8"/></head><br><title>小説をダウンロード

; Motie 中国語 Web サイトで見たい小説の ID 番号を入力して小説をダウンロードします