首頁  >  文章  >  php框架  >  在laravel使用simple_html_dom爬取顯示整本小說

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

L先生
L先生原創
2020-05-07 14:14:382682瀏覽

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

一、在laravel引入第三方類別

#1.在專案根目錄下app目錄中新建一個資料夾命名為Lib(自訂名稱)

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

將simple_html_dom.php複製到Lib下

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

"autoload": {
       "classmap": [
           "data ,
           "app/Lib/simple_html_dom.php"
       ]
   },

4.在cm中執行指令##composer dumpautoload

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

use simple_html_dom;

$html = new simple_html_dom(); 使用

二、建立路由

Route::get('/novel_list','index\Spnovel@index');
三、建立控制器Spnovel.php

<?php
namespace App\Http\Controllers\index;
use simple_html_dom;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
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->find(&#39;#list dd a&#39;);
		foreach ($list as $k=>$v) {
			$arr1=$arr2=[];
			$p1 = &#39;/<a .*?>(.*?)<\/a>/i&#39;;
			$p2 = &#39;/<a .*? href="(.*?)">.*?<\/a>/i&#39;;
			preg_match($p1,$v->outertext,$arr1);
			preg_match($p2,$v->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 = [
			&#39;User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0&#39;
			]; 
			curl_setopt($ch,CURLOPT_HTTPHEADER,$_head);
		}
		// 3.执行
		$res = curl_exec($ch);
		// 4.关闭
		curl_close($ch);
		return $res;
	}
}

#以上程式碼的解釋

:首先要對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

<!DOCTYPE html>
<html>
<head>
	<title>爬取的小说列表</title>
	<style type="text/css">
	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>
</head>
<body>
	<img  src="/static/img/index/novelbg.jpg" alt="在laravel使用simple_html_dom爬取顯示整本小說" >
	<div id="lists">
		<ul>
			@foreach($List as $item)
			<li>
			<a href="/novel_con{{$item[1]}}">{{$item[0]}}</a>
			</li>
			@endforeach
		</ul>		
	</div>
</body>
</html>
以上程式碼的解釋

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

在laravel使用simple_html_dom爬取顯示整本小說五、運行

#接下來就是每一章節的內容了在laravel使用simple_html_dom爬取顯示整本小說

先看路由

Route::get(&#39;/novel_con/{a}/{b}/{c}&#39;,&#39;index\Spnovel@get_nContent&#39;);
這與每一章的url參數相對應,例如某一章的參數為:novel_con/85/85445/27248645.html

寫入

get_nContent方法

public function get_nContent(Request $req){
		$url1 = $req->a.&#39;/&#39;.$req->b.&#39;/&#39;.$req->c;
		$url = "https://www.7kzw.com/".$url1;
		$res = mySpClass::getCurl($url);//获得
		// 开始解析
		$data[&#39;artic&#39;]= self::getContent($res);
		$next = (int)$req->c;
		$next = $next+1;
		$data[&#39;artic&#39;][&#39;next&#39;]="/novel_con/".$req->a.&#39;/&#39;.$req->b.&#39;/&#39;.$next.&#39;.html&#39;;
		return view(&#39;index.spnovel.ncontent&#39;,$data);
	}
private static function getContent($get_html){
		$html = new simple_html_dom();
		@$html->load($get_html);
		$h1 = $html->find(&#39;.bookname h1&#39;);
		foreach ($h1 as $k=>$v) {
			$artic[&#39;title&#39;] = $v->innertext;
		}
		// 查找小说的具体内容
		$divs = $html->find(&#39;#content&#39;);
		foreach ($divs as $k=>$v) {
			$content = $v->innertext;
		}
		// 正则替换去除多余部分
		$pattern = "/(<p>.*?<\/p>)|(<div .*?>.*?<\/div>)/";
		$artic[&#39;content&#39;] = preg_replace($pattern,&#39;&#39;,$content);
		return $artic;
	}

解釋:

$req->a,$req- >b,$req->c,分別是三個參數,然後將其合併為一個完整的請求某一章的位址,然後還是透過mySpClass::getCurl取得某一章的html字串。然後使用本類別中的getContent解析這個頁面,先看解析方法,和上篇文章一章解析出章節的標題和內容,寫到數組中,並且去掉了多餘的文字廣告部分。 $next則是存放的下一章的地址,用於在章節詳情頁面跳轉。


視圖ncontent.blade.php

<!DOCTYPE html>
<html>
<head>
	<title>{{$artic[&#39;title&#39;]}}</title>
	<style type="text/css">
	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>
</head>
<body>
	<img  src="/static/img/index/novelbg.jpg" alt="在laravel使用simple_html_dom爬取顯示整本小說" >
	<h2>{{$artic[&#39;title&#39;]}}</h2>
	<a href="{{$artic[&#39;next&#39;]}}" class="next">下一章</a>
	<div>
		{!!$artic[&#39;content&#39;]!!}
	</div>
</body>
</html>

解釋

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

運行

在laravel使用simple_html_dom爬取顯示整本小說#總結:

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

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

以上是在laravel使用simple_html_dom爬取顯示整本小說的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn