侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

在laravel中使用simple_html_dom爬取显示整本小说

Laravel  /  管理员 发布于 8年前   530

如在程序员还看带广告的小说中所述,很多小说网站基本都有特别烦人的广告,要么在整体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','index\Spnovel@index');

三、创建控制器Spnovel.php

<?phpnamespace 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;}}

以上代码的解释:首先要对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]}}是获得的章节名称。看一下数组和最后的效果。

QQ截图20200507121544.png

五、运行

QQ截图20200507121443.png

接下来就是每一章节的内容了

先看路由:

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固定定位按钮,随时可以下一章。

运行:

QQ截图20200507123249.png

总结:本文最重要的环节就是引入第三方类,能够应用他,还有就是laravel的基础,比较习惯使用控制器视图这种方式,带模型的方式还请自行编写验证。

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

以上就是在laravel中使用simple_html_dom爬取显示整本小说的详细内容,更多请关注其它相关文章!


  • 上一条:
    如何大型 Laravel 项目中组织路由
    下一条:
    Laravel 7 扩展开发教程
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • Laravel 11.14版本发布 - 新的字符串助手和ServeCommand改进(0个评论)
    • Laravel 11.12版本发布 - Artisan的`make`命令自动剪切`.php `扩展(0个评论)
    • Laravel的轻量型购物车扩展包:binafy/laravel-cart(0个评论)
    • Laravel 11.11版本发布 - 查看模型中的第三方关系:show(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-01
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客