利用curl和Regex做的一個針對磨鐵中文網非vip章節的小說抓取器,支援輸入小說ID下載小說。 依賴項:curl 可以簡單的看下,裡面用到了curl ,Regex,ajax等技術,適合新手看看。在本地測試,必須保證連網並且確保php開啟curl的mode.
- 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)){
- //Regex匹配
- $ru="/\s*(.*)\s*<\/a>\s*<\/h1>/";
- }
- else{
- //喪屍爆發之全家求生路_第一章 喪屍爆發 為吾友愛樂兒更新~_磨鐵
- $ru="/(.*)<\/title>/";<li>}<li>//設定選項,包括URL<li>curl_setopt($ch, CURLOPT_URL, $url);<li>curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自動輸出內容<li>curl_setopt($ch, CURLOPT_HEADER, 0);//不返回頭部資訊<li>curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0); <li>//執行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: ' . curl_error($ch);<li>}<li>//釋放curl控制代碼<li>curl_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=trim($ids[0]);<li>$aticleId=trim($ids[1]);<li>$ch= curl_init();<li>$ru="/[\s\S]*<pre ondragstart=\"return false\" oncopy=\"return false;\" oncut=\"return false;\" oncontextmenu=\"return false\" class=\"note\" id=\"html_content_\d*\">[\s\S]*(.*)<\/pre>/ui";<li>$url='http://www.motie.com/book/'.$aid;<li>//Regex匹配<li><li>//設定選項,包括URL<li>curl_setopt($ch, CURLOPT_URL, $url);<li>curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自動輸出內容<li>curl_setopt($ch, CURLOPT_HEADER, 0);//不返回頭部資訊<li>curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0); <li>//執行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: ' . curl_error($ch);<li>}<li>$arr=array();<li>$arr2=array();<li>preg_match_all($ru,$output,$arr);<li>curl_close($ch);<li>#var_dump($arr);<li>$s=$arr[0][0];<li>$s=substr($s,180);<li>$arr2=explode("return trim($arr2[0]);<li>}<li><li>//////////////////////////////////////////////////////////////////////////////////////////////////////////<li>/*靜態方法 @產生小說檔案 可以直接調用 */<li>//////////////////////////////////////////////////////////////////////////////////////////////////////////<li> public static function createBookById($id){<li><li>if(!is_numeric($id)){<li><li>echo "<br/>INIT BEGIN START WRITE!";<li>$st=new self();<li>$cons=$st->getBookContextById($id);<li>$title=$st->getBookNameById($id);<li>$cons=trim($cons);<li>$t=explode(" ",$title);<li>//構造目錄<li>$dir=array();<li>$dir=explode("_",$t[0]);<li>$wzdir=$dir[0];//書名稱 作為目錄名稱<li>$wzchapter=$dir[1]; //第幾章<li>//建立目錄<li>$wzdir2=iconv("UTF-8", "GBK", $wzdir);//目錄編碼 注意這裡保留對$wzdir字串的引用,用來構造檔案名稱,不能用此處,防止二次編碼<li>if(!file_exists($wzdir2)){<li>mkdir($wzdir2); //建立目錄<li>}<li>//構造檔案名稱<li>$wztitle="./".$wzdir."/"."$t[0]".".txt";<li>//保證儲存的檔案名稱不是亂碼<li>$wztitle=iconv("UTF-8", "GBK", $wztitle);<li>$f=fopen($wztitle,"w+");<li>fwrite($f,$cons);<li>echo "$wzdir ".$wzchapter."寫入成功";<li>fclose($f);<li><li>}<li>else{<li>$ids=self::getBookIdsById($id);<li><li>//這裡伺服器可能會掉線,所以最好用session記錄迴圈<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>#var_dump($ids);<li><li>}<li><li>}<li>/*<li>擷取小說的所有ID<li>@param $id 文章ID<li>@return array;<li>*/<li>public static function getBookIdsById($aid){<li>$ch= curl_init();<li>$url='http://www.motie.com/book/'.$aid."/chapter";<li>//注意這裡的?可以擷取最少匹配項<li>$ru='/[\s\S]*?<li class=\"\" createdate=\"\d{4}\-\d{2}\-\d{2} \d{2}:\d{2}:\d{2}\">[\s\S]*?.*?<\/a>.*?/u';//Regex匹配<li>//設定選項,包括URL<li>curl_setopt($ch, CURLOPT_URL, $url);<li>curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不自動輸出內容<li>curl_setopt($ch, CURLOPT_HEADER, 0);//不返回頭部資訊<li>curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 0); <li>//執行curl<li>$output = curl_exec($ch);<li>// 檢查是否有錯誤發生<li>if(curl_errno($ch)){<li>echo 'Curl error: ' . curl_error($ch);<li>}<li>//釋放curl控制代碼<li>curl_close($ch);<li>$arr=array();<li>preg_match_all($ru,$output,$arr,PREG_PATTERN_ORDER);<li>return $arr[1];<li>}<li>}<li><li><li><li><li><li><li><li><li>?></ol><em onclick="copycode($('code_Sfk'));">複製代碼</em> <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></ol><em onclick="copycode($('code_Zt6'));">複製代碼</em> <ol><li><html><li><head><meta charset="utf-8"/></head><li><title>下載小說啦
輸入磨鐵中文網你想看到的小說ID號就可以下載小說啦
複製代碼 |