如在程式設計師還看帶廣告的小說中所述,很多小說網站基本上都有特別煩人的廣告,要么在整體div添加鏈接,誤觸就會跳到一些網站甚至是死循環,某些手機app也是廣告很多,本文就將其應用到laravel框架,最好先了解上一篇,隨後自行部署就可以了。
一、在laravel引入第三方類別
#1.在專案根目錄下app目錄中新建一個資料夾命名為Lib(自訂名稱)
2.如果引入第三方庫多的話可以在Lib下再新建幾個目錄分類,由於只引入了一個類,這裡沒有新建資料夾。 (根據引入類別的多少自己定義)
將simple_html_dom.php複製到Lib下
3.找到專案根目錄下的composer.json文件,將第三方類別的路勁寫入autoload下的classmap中,這樣才能自動載入
4.在cm中執行指令##composer dumpautoload 5.在控制器中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');
load($list_html); $list = $html->find('#list dd a'); foreach ($list as $k=>$v) { $arr1=$arr2=[]; $p1 = '/(.*?)<\/a>/i'; $p2 = '/.*?<\/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
爬取的小说列表 @foreach($List as $item)
- {{$item[0]}}
@endforeach
五、運行
#接下來就是每一章節的內容了
先看路由
:Route::get('/novel_con/{a}/{b}/{c}','index\Spnovel@get_nContent');
寫入
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>)|(
.*?<\/div>)/"; $artic['content'] = preg_replace($pattern,'',$content); return $artic; }登入後複製
解釋: $req->a,$req- >b,$req->c,分別是三個參數,然後將其合併為一個完整的請求某一章的位址,然後還是透過mySpClass::getCurl取得某一章的html字串。然後使用本類別中的getContent解析這個頁面,先看解析方法,和上篇文章一章解析出章節的標題和內容,寫到數組中,並且去掉了多餘的文字廣告部分。 $next則是存放的下一章的地址,用於在章節詳情頁面跳轉。
視圖ncontent.blade.php
{{$artic['title']}} {{$artic['title']}}
下一章{!!$artic['content']!!}登入後複製
解釋:因為只有目前一篇所以不需要循環,{ {$artic['title']}}就是標題,也可以寫到title中。 {!!$artic['content']!!}的寫法就是不需要轉義文章的內容,否則就會有很多其他字元了,如
等。下一章的按鈕的位址直接就用傳遞過來的即可,position:fixed固定定位按鈕,隨時可以下一章。運行
:#總結:
本文最重要的環節就是引入第三方類,能夠應用他,還有就是laravel的基礎,比較習慣使用控制器視圖這種方式,帶模型的方式還請自行寫驗證。就對一本小說來說這就足夠了,當然我們可以擴充,將整站的小說列表寫出來,繼續傳合適的參數就更加完美了。
以上是在laravel使用simple_html_dom爬取顯示整本小說的詳細內容。更多資訊請關注PHP中文網其他相關文章!