概述程序员还看带广告的小说? 有人习惯看小说,偶尔会看几章,都是百度出来,但是基本都有特别烦人的广告,要么在整体div添加链接,误触就会跳转到一些网站甚至是死循环,某些手机app也是广告很多,所以无事在写一个小程序免除广告的烦扰
本文将使用PHP curl采集页面simple_HTML_dom解析,实现真正的去除广告。
随便找一个小说网站找一本书,不过这个站点在手机端是特别坑的,就有上述问题:
就拿这本小说来开刀。(声明:绝对不是推广,侵删)
一、了解curl的get方式
curl是一个命令行工具,通过指定的URL来上传或下载数据,并将数据展示出来。curl中的c表示clIEnt,而URL,就是URL。
PHP中使用cURL可以实现Get和Post请求的方法
简单的抓取小说仅需要get方法即可。
下面这个示例代码就是通过get请求获取第一章小说页面HTML的示例,只需要更改url参数即可。
初始化、设置选项、证书验证、执行、关闭
<?PHPheader("Content-Type:text/HTML;charset=utf-8");$url="https://www.7kzw.com/85/85445/27248636.HTML";$ch = curl_init($url); //初始化//设置选项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); //不验证证书// 3.执行$res = curl_exec($ch);// 4.关闭curl_close($ch);print_r($res);?>
注释就特别详细了,按照步骤,发送curl的get请求,如果是post请求则需要多加一条设置post选项的设置,并且传参,最后输出获得的信息,运行结果如下,是没有CSS渲染的。
二、解析页面
输出的页面有很多不需要的内容,需要在所有内容中提取出我们需要的内容,比如标题和每章的内容,这时需要解析页面。
解析页面的方法也有很多,在这里使用的是simple_HTML_dom,需要下载引用simple_HTML_dom.PHP这个类,实例对象,并调用内部的方法。具体方法可以到官网查看,或者中文网其他文档。
先分析这个小说页面的源代码,看这章的标题和内容对应的元素
首先是标题:在类bookname下的h1下
然后是内容:在ID为content的div下
simple_HTML_dom的可以使用find方法,类似jquery一样使用选择器查找定位元素。如:
find('.bookname h1'); //查找类bookname 下的h1标题元素
find('#content'); //查找ID为content的章节内容
代码在以上的基础上新增:
include "simple_HTML_dom.PHP";$HTML = new simple_HTML_dom();@$HTML->load($res);$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);echo $artic['Title'].'<br>';echo $artic['content'];
使用以上的解析方法获得的内容是数组,使用foreach来获得数组内容,使用了正则替换将正文文字广告去除,将标题和小说内容放到数组内。最简单的写法就写好了。运行结果如下:
当然这种写法看着比较难受,可以自行封装函数类。如下就是我自己写好的代码示例了,当然肯定有不足的地方,但是可以作为参考扩展。
<?PHP include "simple_HTML_dom.PHP";include "mySpClass.PHP";header("Content-Type:text/HTML;charset=utf-8");$get_HTML = get_HTML($_GET['n']);$artic = getContent($get_HTML);echo $artic['Title'].'<br>';echo $artic['content'];/*** 获取www.7kzw.com 获取每一章的页面HTML* @param type $num 第几章,从第一开始(int)* @return 返回字符串 */function get_HTML($num){ $start = 27248636; $real_num = $num+$start-1; $url = 'https://www.7kzw.com/85/85445/'.$real_num.'.HTML'; $header = [ 'User-Agent:Mozilla/5.0 (windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 firefox/70.0' ]; return mySpClass()->getCurl($url,$header);}/*** 获取www.7kzw.com小说标题数组* @param type $get_HTML 得到的每一章的页面HTML* @return 返回$artic数组,['Title'=>'','content'=>'']*/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;}?>
<?PHPclass mySpClass{ //单例对象 private static $ins = null; /** * 单例化对象 */ public static function exec() { if (self::$ins) { return self::$ins; } return self::$ins = new self(); } /** * 禁止克隆对象 */ public function __clone() { throw new curlException('错误:不能克隆对象'); } // 向服务器发送最简单的get请求 public static function getCurl($url,$header){ // 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);//设置头信息 } // 3.执行 $res = curl_exec($ch); // 4.关闭 curl_close($ch); return $res; }}//curl方法不存在就设置一个curl方法if (!function_exists('mySpClass')) { function mySpClass() { return mySpClass::exec(); }}?>
以上示例代码的最终运行结果:第几章就输入数字几,通过$_GET['n']传参
总结:
知识点:curl(tips:curl模块采集任意网页php类),正则,解析工具simple_HTML_dom
虽然写法已经初步完善,但是最好能过部署的自己的服务器才能有最好的效果,不然只能在电脑观看,也不见得多方便,可能更愿意忍忍广告了。
总结
以上是内存溢出为你收集整理的程序员还看带广告的小说?全部内容,希望文章能够帮你解决程序员还看带广告的小说?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容