ホームページ  >  記事  >  バックエンド開発  >  プログラマーは今でも広告付きの小説を読んでいますか?

プログラマーは今でも広告付きの小説を読んでいますか?

L先生
L先生オリジナル
2020-05-06 18:41:532915ブラウズ

小説を読むことに慣れている人もいて、時々数章読んでいます。それらはすべて Baidu によって公開されていますが、基本的に非常に迷惑な広告があります。div 全体へのリンクを追加するか、誤って触れてしまうと、一部の Web サイトにジャンプしたり、無限ループに陥ったりすることもあります。一部のモバイル アプリには大量の広告が表示されるため、広告の煩わしさを避けるために小さなプログラムを作成する以外に何もすることがありません。

この記事では を使用します。広告の真の削除を実現するために、phpcurl を使用してページ simple_html_dom parsing を収集します。

どんな小説 Web サイトでも本を探しますが、このサイトは上記の問題のため携帯電話では特に扱いにくいです:

プログラマーは今でも広告付きの小説を読んでいますか?

これを読んでくださいこの小説手術を行います。 (免責事項: これは決して宣伝、侵害、削除ではありません)

1.curl の get メソッドを理解する

curl は、次の方法でアップロードまたはダウンロードするコマンド ライン ツールです。指定したURLデータを取得して表示します。 curl の c はクライアントを意味し、URL は URL を意味します。

PHP で cURL を使用すると、Get および Post リクエスト メソッドを実装できます

小説の単純なクロールには get メソッドのみが必要です。

次のサンプルコードは、get リクエストで小説の第 1 章ページの 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レンダリングはありません。

プログラマーは今でも広告付きの小説を読んでいますか?

2. ページを解析します

出力ページには不要なコンテンツが多く含まれているため、次から抽出する必要があります。すべてのコンテンツ タイトルや各章の内容など、必要なコンテンツを取得するには、ページを解析する必要があります。

ページを解析するにはさまざまな方法があります。ここでは Simple_html_dom が使用されています。simple_html_dom.php クラス、インスタンス オブジェクトをダウンロードして参照し、内部メソッドを呼び出す必要があります。具体的な方法については、公式サイトや中国サイトのドキュメントなどを確認してください。

まず、この小説ページのソース コードを分析し、この章のタイトルと内容に対応する要素を確認します。

最初のタイトルは、クラスのブック名の h1 の下です。

プログラマーは今でも広告付きの小説を読んでいますか?

次にコンテンツ: コンテンツの ID を持つ div の下で、

プログラマーは今でも広告付きの小説を読んでいますか?

simple_html_dom はjquery に似た find メソッド。セレクターは、位置決めされた要素を見つけます。例:

find('.bookname h1'); //クラス bookname で h1 title 要素を検索します

find('#content'); //コンテンツ ID を持つ章のコンテンツを検索します。

コードは上記に基づいて追加されます:

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 (ヒント: curl モジュールはあらゆる Web ページの php クラスを収集します)、通常の解析ツール simple_html_dom

書き込み方法は当初改良されましたが、最良の結果を得るには独自のサーバーを展開するのが最善です。そうでない場合は、コンピューターでしか視聴できないため、あまり便利ではありません。広告を許容する方がよいかもしれません。

上記は、phpcurl を使用してページを収集し、simple_html_dom を使用してそれらを解析する方法の詳細です。詳細については、php 中国語 Web サイトの他の関連記事に注目してください。

以上がプログラマーは今でも広告付きの小説を読んでいますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。