在laravel中使用simple_html_dom爬取顯示整本小說

如在程序員還看帶廣告的小說中所述,很多小說網站基本都有特別煩人的廣告,要么在整體div添加鏈接,誤觸就會跳轉到一些網站甚至是死循環,某些手機app也是廣告很多,本文就將其應用到laravel框架,最好先了解上一篇,隨后自行部署就可以了。

一、在laravel引入第三方類

1.在項目根目錄下app目錄中新建一個文件夾命名為Lib(自定義名稱)

2.如果引入第三方庫多的話可以在Lib下再新建幾個目錄分類,由于只引入了一個類,這里沒有新建文件夾。(根據引入類的多少自己定義)

將simple_html_dom.php復制到Lib下

立即學習前端免費學習筆記(深入)”;

3.找到項目根目錄下的composer.json文件,將第三方類的路勁寫入autoload下的classmap中,這樣才能自動加載

“autoload”: {? ? ? ?“classmap”: [? ? ? ? ? ?“database/seeds”,? ? ? ? ? ?“database/factories”,? ? ? ? ? ?“app/Lib/simple_html_dom.php”? ? ? ?]? ?},

4.在cmd控制臺中切換到項目根目錄,執行命令:

composer dumpautoload

5.在控制器中use這個類即可

use simple_html_dom;

$html = new simple_html_dom();?使用

二、創建路由

Route::get('/novel_list','indexSpnovel@index');

三、創建控制器Spnovel.php

<?php namespace AppHttpControllersindex; use simple_html_dom; use IlluminateHttpRequest; use AppHttpControllersController; class Spnovel extends Controller { 	public function index(){ 		$url = "https://www.7kzw.com/85/85445/"; 		$list_html = mySpClass::getCurl($url); 		$data[&#39;List&#39;] = self::getList($list_html); 		return view(&#39;index.spnovel.index&#39;,$data); 	} 	private static function getList($list_html){ 		$html = new simple_html_dom(); 		@$html->load($list_html); 		$list?=?$html-&gt;find('#list?dd?a'); 		foreach?($list?as?$k=&gt;$v)?{ 			$arr1=$arr2=[]; 			$p1?=?'/<a>(.*?)/i'; 			$p2?=?'/</a><a>.*?/i'; 			preg_match($p1,$v-&gt;outertext,$arr1); 			preg_match($p2,$v-&gt;outertext,$arr2); 			$content[$k][0]=$arr1[1]; 			$content[$k][1]=$arr2[1]; 		} 		array_splice($content,0,12);? 		return?$content; 	} } class?mySpClass{ 	//?向服務器發送最簡單的get請求 	public?static?function?getCurl($url,$header=null){ 		//?1.初始化 		$ch?=?curl_init($url);???//請求的地址 		//?2.設置選項 		curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//獲取的信息以字符串返回,而不是直接輸出(必須)? 		curl_setopt($ch,CURLOPT_TIMEOUT,10);//超時時間(必須) 		curl_setopt($ch,?CURLOPT_HEADER,0);//?	啟用時會將頭文件的信息作為數據流輸出。? 		//參數為1表示輸出信息頭,為0表示不輸出 		curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);?//不驗證證書 		curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);?//不驗證證書 		if(!empty($header)){ 			curl_setopt($ch,CURLOPT_HTTPHEADER,$header);//設置頭信息 		}else{ 			$_head?=?[ 			'User-Agent:Mozilla/5.0?(Windows?NT?10.0;?Win64;?x64;?rv:70.0)?Gecko/20100101?Firefox/70.0' 			];? 			curl_setopt($ch,CURLOPT_HTTPHEADER,$_head); 		} 		//?3.執行 		$res?=?curl_exec($ch); 		//?4.關閉 		curl_close($ch); 		return?$res; 	} }</a>

以上代碼的解釋:首先要對laravel框架了解,對php類要有所了解

訪問了以上路由,運行的是Spnovel.php控制器中的index方法,$url是某一本小說的章節列表的地址,將其作為參數運行自定義類mySpClass中的getcurl方法,返回這個頁面的html文檔字符串。運行此類中的getList方法,參數是需要解析的html字符串。將這個方法私有化,使用simple_html_dom解析,配置正則提取出每章的url地址和章節名稱。并返回這個數組,通過return view(‘index.spnovel.index’,$data);將打開index/spnovel/index.blade.php,請看index.blade.php

四、創建視圖index.blade.php

nbsp;html&gt;   	<title>爬取的小說列表</title><style> 	body{padding:0px;margin:0px;} 	#lists{width:100%;padding:30px 50px;box-sizing:border-box;} 	ul{margin:0;padding: 0;overflow:hidden;} 	ul li{list-style:none;display:inline-block;float:left;width:25%;color:#444;} 	ul li:hover{color:#777;cursor: pointer;} 	img {z-index:-1;width:100%;height:100%;position:fixed;} 	</style> 	@@##@@ 	<div> 		<ul> 			@foreach($List?as?$item) 			<li> 			<a>{{$item[0]}}</a> 			</li> 			@endforeach 		</ul> </div>  

以上代碼的解釋:css就簡單的寫到這里,img是作為背景圖片的。ul里面循環li,{{$item[1]}}是獲得的地址參數,{{$item[0]}}是獲得的章節名稱。看一下數組和最后的效果。

在laravel中使用simple_html_dom爬取顯示整本小說

五、運行

在laravel中使用simple_html_dom爬取顯示整本小說

接下來就是每一章節的內容了

先看路由

Route::get('/novel_con/{a}/{b}/{c}','indexSpnovel@get_nContent');

這與每一章的url參數相對應,比如某一章的參數為:novel_con/85/85445/27248645.html

get_nContent方法

public?function?get_nContent(Request?$req){ 		$url1?=?$req-&gt;a.'/'.$req-&gt;b.'/'.$req-&gt;c; 		$url?=?"https://www.7kzw.com/".$url1; 		$res?=?mySpClass::getCurl($url);//獲得 		//?開始解析 		$data['artic']=?self::getContent($res); 		$next?=?(int)$req-&gt;c; 		$next?=?$next+1; 		$data['artic']['next']="/novel_con/".$req-&gt;a.'/'.$req-&gt;b.'/'.$next.'.html'; 		return?view('index.spnovel.ncontent',$data); 	} private?static?function?getContent($get_html){ 		$html?=?new?simple_html_dom(); 		@$html-&gt;load($get_html); 		$h1?=?$html-&gt;find('.bookname?h1'); 		foreach?($h1?as?$k=&gt;$v)?{ 			$artic['title']?=?$v-&gt;innertext; 		} 		//?查找小說的具體內容 		$divs?=?$html-&gt;find('#content'); 		foreach?($divs?as?$k=&gt;$v)?{ 			$content?=?$v-&gt;innertext; 		} 		//?正則替換去除多余部分 		$pattern?=?"/(<p>.*?)|(</p><div>.*?)/"; 		$artic['content']?=?preg_replace($pattern,'',$content); 		return?$artic; 	}<p><strong>解釋:</strong>$req-&gt;a,$req-&gt;b,$req-&gt;c,分別是三個參數,然后將其合并為一個完整的請求某一章的地址,然后還是通過mySpClass::getCurl獲得某一章的html字符串。然后使用本類中的getContent解析這個頁面,先看解析方法,和上篇文章一章解析出章節的標題和內容,寫到數組中,并且去掉了多余的文字廣告部分。$next則是存放的下一章的地址,用于在章節詳情頁面跳轉。<br></p> <p><strong>視圖ncontent.blade.php</strong><br></p> <pre class="brush:php;toolbar:false">nbsp;html&gt;   	<title>{{$artic['title']}}</title><style> 	h2{text-align:center;padding-top:30px;} 	div{margin:20px 50px;font-size:20px;} 	img {z-index:-1;width:100%;height:100%;position:fixed;} 	.next {position:fixed;right:10px;bottom:20px;background:coral;border-radius:3px;padding:4px;} 	.next:hover{color:#fff;} 	</style> 	@@##@@ 	<h2>{{$artic['title']}}</h2> 	<a>下一章</a> 	<div> 		{!!$artic['content']!!} 	</div>  

解釋:因為只有當前一篇所以不需要循環,{{$artic[‘title’]}}就是標題,也可以寫到title中。{!!$artic[‘content’]!!}的寫法就是不需要轉義文章的內容,否則就會有很多其他字符了,如
等。下一章的按鈕的地址直接就用傳遞過來的即可,position:fixed固定定位按鈕,隨時可以下一章。

運行

在laravel中使用simple_html_dom爬取顯示整本小說

總結:本文最重要的環節就是引入第三方類,能夠應用他,還有就是laravel的基礎,比較習慣使用控制器視圖這種方式,帶模型的方式還請自行編寫驗證。

就對一本小說來說這就足夠了,當然我們可以擴充,將整站的小說列表寫出來,繼續傳合適的參數就更加完美了。

在laravel中使用simple_html_dom爬取顯示整本小說在laravel中使用simple_html_dom爬取顯示整本小說

以上就是在

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享