本文將使用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('.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解析的詳細內容,更多請關注TW511.COM其它相關文章!
以上就是程式設計師還看帶廣告的小說?的詳細內容,更多請關注TW511.COM其它相關文章!