首頁 >後端開發 >php教程 >程式設計師還看有廣告的小說?

程式設計師還看有廣告的小說?

L先生
L先生原創
2020-05-06 18:41:532928瀏覽

有人習慣看小說,偶爾會看幾章,都是百度出來,但是基本都有特別煩人的廣告,要么在整體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);
?>
        註解就特別詳細了,依照步驟,發送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(&#39;.bookname h1&#39;);
foreach ($h1 as $k=>$v) {
	$artic[&#39;title&#39;] = $v->innertext;
}
// 查找小说的具体内容
$divs = $html->find(&#39;#content&#39;);
foreach ($divs as $k=>$v) {
	$content = $v->innertext;
}
// 正则替换去除多余部分
$pattern = "/(<p>.*?<\/p>)|(<div .*?>.*?<\/div>)/";
$artic[&#39;content&#39;] = preg_replace($pattern,&#39;&#39;,$content);
echo $artic[&#39;title&#39;].&#39;<br>&#39;;
echo $artic[&#39;content&#39;];

        使用以上的解析方法所獲得的內容為數組,並使用foreach來獲得數組內容,使用了正規替換將正文文字廣告去除,將標題和小說內容放到數組內。最簡單的寫法就寫好了。運行結果如下:

程式設計師還看有廣告的小說?

當然這種寫法看著比較難受,可以自行封裝函數類別。如下就是我自己寫好的程式碼範例了,當然肯定有不足的地方,但是可以作為參考擴充功能。

<?php 
include "simple_html_dom.php";
include "mySpClass.php";
header("Content-Type:text/html;charset=utf-8");
$get_html = get_html($_GET[&#39;n&#39;]);
$artic = getContent($get_html);
echo $artic[&#39;title&#39;].&#39;<br>&#39;;
echo $artic[&#39;content&#39;];
/**
* 获取www.7kzw.com 获取每一章的页面html
* @param type $num 第几章,从第一开始(int)
* @return 返回字符串  
*/
function get_html($num){
	$start = 27248636;
	$real_num = $num+$start-1;
	$url = &#39;https://www.7kzw.com/85/85445/&#39;.$real_num.&#39;.html&#39;;
	$header = [
	&#39;User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0&#39;
	]; 
	return mySpClass()->getCurl($url,$header);
}
/**
* 获取www.7kzw.com小说标题数组
* @param type $get_html 得到的每一章的页面html
* @return 返回$artic数组,[&#39;title&#39;=>&#39;&#39;,&#39;content&#39;=>&#39;&#39;]
*/
function getContent($get_html){
	$html = new simple_html_dom();
	@$html->load($get_html);
	$h1 = $html->find(&#39;.bookname h1&#39;);
	foreach ($h1 as $k=>$v) {
		$artic[&#39;title&#39;] = $v->innertext;
	}
	// 查找小说的具体内容
	$divs = $html->find(&#39;#content&#39;);
	foreach ($divs as $k=>$v) {
		$content = $v->innertext;
	}
	// 正则替换去除多余部分
	$pattern = "/(<p>.*?<\/p>)|(<div .*?>.*?<\/div>)/";
	$artic[&#39;content&#39;] = preg_replace($pattern,&#39;&#39;,$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(&#39;错误:不能克隆对象&#39;);
    }
	// 向服务器发送最简单的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(&#39;mySpClass&#39;)) {
    function mySpClass() {
        return mySpClass::exec();
    }
}
?>

以上範例程式碼的最終運行結果:第幾章就輸入數字幾,透過$_GET['n']傳參

程式設計師還看有廣告的小說?

總結:

知識點:curl(tips:

curl模組採集任意網頁php類別),正則,解析工具simple_html_dom

雖然寫法已經初步完善,但是最好能過部署的自己的伺服器才能有最好的效果,不然只能在電腦觀看,也不見得多方便,可能更願意忍忍廣告了。

以上就是使用php curl採集頁面並使用simple_html_dom解析的詳細內容,更多請關注php中文網其它相關文章!

以上是程式設計師還看有廣告的小說?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn