如在《程序员还看带广告的小说》中所述,很多小说网站基本都有特殊烦人的广告,要么在整体div添加链接,误触就会跳转到一些网站乃至是去世循环,某些手机app也是广告很多,本文就将其运用到laravel框架,最好先理解上一篇,随后自行支配就可以了。

一、在laravel引入第三方类

1.在项目根目录下app目录中新建一个文件夹命名为Lib(自定义名称)

php中文网在laravel中应用simplehtmldom爬取显示整本小说 Vue.js

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','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-&gt;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;

}

}

以上代码的阐明:首先要对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">

<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;

}

阐明:$req->a,$req->b,$req->c,分别是三个参数,然后将其合并为一个完全的要求某一章的地址,然后还是通过mySpClass::getCurl得到某一章的html字符串。

然后利用本类中的getContent解析这个页面,先看解析方法,和上篇文章一章解析出章节的标题和内容,写到数组中,并且去掉了多余的笔墨广告部分。

$next则是存放的下一章的地址,用于在章节详情页面跳转。

视图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">

<h2>{{$artic['title']}}</h2>

<a href="{{$artic['next']}}" class="next">下一章</a>

<div>

{!!$artic['content']!!}

</div>

</body>

</html>

阐明:由于只有当前一篇以是不须要循环,{{$artic['title']}}便是标题,也可以写到title中。
{!!$artic['content']!!}的写法便是不须要转义文章的内容,否则就会有很多其他字符了,如<br>等。

下一章的按钮的地址直接就用通报过来的即可,position:fixed固定定位按钮,随时可以下一章。

运行:

总结:本文最主要的环节便是引入第三方类,能够运用他,还有便是laravel的根本,比较习气利用掌握器视图这种办法,带模型的办法还请自行编写验证。

就对一本小说来说这就足够了,当然我们可以扩充,将整站的小说列表写出来,连续传得当的参数就更加完美了。

(声明:该示例小说是随便找的,绝对不是推广,侵删)