如在程式設計師還看帶廣告的小說中所述,很多小說網站基本上都有特別煩人的廣告,要么在整體div添加鏈接,誤觸就會跳到一些網站甚至是死循環,某些手機app也是廣告很多,本文就將其應用到laravel框架,最好先了解上一篇,隨後自行部署就可以了。
一、在laravel引入第三方類別
#1.在專案根目錄下app目錄中新建一個資料夾命名為Lib(自訂名稱)
2.如果引入第三方庫多的話可以在Lib下再新建幾個目錄分類,由於只引入了一個類,這裡沒有新建資料夾。 (根據引入類別的多少自己定義)
將simple_html_dom.php複製到Lib下
3.找到專案根目錄下的composer.json文件,將第三方類別的路勁寫入autoload下的classmap中,這樣才能自動載入
4.在cm中執行指令##composer dumpautoload5.在控制器中use這個類別即可use simple_html_dom;$html = new simple_html_dom(); 使用"autoload": {
"classmap": [
"data ,
"app/Lib/simple_html_dom.php"
]
},
二、建立路由
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['List'] = self::getList($list_html);
return view('index.spnovel.index',$data);
}
private static function getList($list_html){
$html = new simple_html_dom();
@$html->load($list_html);
$list = $html->find('#list dd a');
foreach ($list as $k=>$v) {
$arr1=$arr2=[];
$p1 = '/<a .*?>(.*?)<\/a>/i';
$p2 = '/<a .*? href="(.*?)">.*?<\/a>/i';
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 = [
'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;
}
}
#以上程式碼的解釋
訪問了以上路由,運行的是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]}}是獲得的章節名稱。看一下數組和最後的效果。
五、運行
#接下來就是每一章節的內容了
先看路由
:Route::get('/novel_con/{a}/{b}/{c}','index\Spnovel@get_nContent');這與每一章的url參數相對應,例如某一章的參數為:novel_con/85/85445/27248645.html
寫入
get_nContent方法:public function get_nContent(Request $req){
$url1 = $req->a.'/'.$req->b.'/'.$req->c;
$url = "https://www.7kzw.com/".$url1;
$res = mySpClass::getCurl($url);//获得
// 开始解析
$data['artic']= self::getContent($res);
$next = (int)$req->c;
$next = $next+1;
$data['artic']['next']="/novel_con/".$req->a.'/'.$req->b.'/'.$next.'.html';
return view('index.spnovel.ncontent',$data);
}
private static function getContent($get_html){
$html = new simple_html_dom();
@$html->load($get_html);
$h1 = $html->find('.bookname h1');
foreach ($h1 as $k=>$v) {
$artic['title'] = $v->innertext;
}
// 查找小说的具体内容
$divs = $html->find('#content');
foreach ($divs as $k=>$v) {
$content = $v->innertext;
}
// 正则替换去除多余部分
$pattern = "/(<p>.*?<\/p>)|(<div .*?>.*?<\/div>)/";
$artic['content'] = preg_replace($pattern,'',$content);
return $artic;
}
解釋:
視圖ncontent.blade.php
<!DOCTYPE html>
<html>
<head>
<title>{{$artic['title']}}</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['title']}}</h2>
<a href="{{$artic['next']}}" class="next">下一章</a>
<div>
{!!$artic['content']!!}
</div>
</body>
</html>
解釋
運行
:
#總結:
本文最重要的環節就是引入第三方類,能夠應用他,還有就是laravel的基礎,比較習慣使用控制器視圖這種方式,帶模型的方式還請自行寫驗證。就對一本小說來說這就足夠了,當然我們可以擴充,將整站的小說列表寫出來,繼續傳合適的參數就更加完美了。
以上是在laravel使用simple_html_dom爬取顯示整本小說的詳細內容。更多資訊請關注PHP中文網其他相關文章!