程序员还看带广告的小说?

互联网 20-5-6
有人习惯看小说,偶尔会看几章,都是百度出来,但是基本都有特别烦人的广告,要么在整体div添加链接,误触就会跳转到一些网站甚至是死循环,某些手机app也是广告很多,所以无事在写一个小程序免除广告的烦扰

本文将使用php curl采集页面simple_html_dom解析,实现真正的去除广告。

随便找一个小说网站找一本书,不过这个站点在手机端是特别坑的,就有上述问题:

就拿这本小说来开刀。(声明:绝对不是推广,侵删)

一、了解curl的get方式

curl是一个命令行工具,通过指定的URL来上传或下载数据,并将数据展示出来。curl中的c表示client,而URL,就是URL。

PHP中使用cURL可以实现Get和Post请求的方法

简单的抓取小说仅需要get方法即可。

下面这个示例代码就是通过get请求获取第一章小说页面html的示例,只需要更改url参数即可。

初始化、设置选项、证书验证、执行、关闭

<?php header("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); ?>

二、解析页面

输出的页面有很多不需要的内容,需要在所有内容中提取出我们需要的内容,比如标题和每章的内容,这时需要解析页面。

解析页面的方法也有很多,在这里使用的是simple_html_dom,需要下载引用simple_html_dom.php这个类,实例对象,并调用内部的方法。具体方法可以到官网查看,或者中文网其他文档。

然后是内容:在id为content的div下

simple_html_dom的可以使用find方法,类似jquery一样使用选择器查找定位元素。如:

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; } ?>
<?php class 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

虽然写法已经初步完善,但是最好能过部署的自己的服务器才能有最好的效果,不然只能在电脑观看,也不见得多方便,可能更愿意忍忍广告了。

以上就是使用php curl采集页面并使用simple_html_dom解析的详细内容,更多内容请关注技术你好其它相关文章!

以上就是程序员还看带广告的小说?的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 程序员
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:php时间戳转换成时间的方法

相关资讯