>백엔드 개발 >PHP 튜토리얼 >프로그래머들은 아직도 광고가 나오는 소설을 읽는다?

프로그래머들은 아직도 광고가 나오는 소설을 읽는다?

L先生
L先生원래의
2020-05-06 18:41:532942검색

어떤 사람들은 소설을 읽는 데 익숙하고 가끔 몇 장을 읽습니다. 모두 Baidu에서 출판한 것이지만 기본적으로 매우 짜증나는 광고가 있거나 전체 div에 링크가 추가되어 있으면 바로 이동합니다. 일부 웹사이트나 무한 루프도 있습니다. 일부 휴대폰 앱에도 광고가 많아서 광고의 귀찮음을 피하기 위해 작은 프로그램을 작성하는 것 외에는 할 일이 없습니다

이 기사에서는 php 컬을 사용하여 simple_html_dom 페이지를 수집합니다. 그리고 그것을 분석하여 광고를 완전히 제거하세요.

노벨 웹사이트에서 책을 찾아보세요. 하지만 이 사이트는 휴대폰에서 특히 까다롭고 위와 같은 문제가 있습니다.

프로그래머들은 아직도 광고가 나오는 소설을 읽는다?

이 소설을 이용하여 수술을 합시다. (면책조항: 이는 절대 홍보, 침해 또는 삭제가 아닙니다.)

1. 컬의 get 메소드 이해

curl은 지정된 URL을 통해 데이터를 업로드 또는 다운로드하고 해당 데이터를 표시하는 명령줄 도구입니다. 컬의 c는 클라이언트를 의미하고 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);
?>

댓글은 특히 컬 가져오기 요청 보내기 단계에 따라 설정해야 합니다. post 옵션을 지정하고 매개변수를 전달하고 최종적으로 얻은 정보를 CSS 렌더링 없이 출력합니다.

프로그래머들은 아직도 광고가 나오는 소설을 읽는다?

2. 페이지 구문 분석

출력 페이지에는 각 장의 제목과 내용 등 모든 내용에서 불필요한 내용이 많이 포함되어 있습니다. 이 경우 페이지를 구문 분석해야 합니다.

페이지를 구문 분석하는 방법은 다양합니다. 여기서는 simple_html_dom.php 클래스, 인스턴스 객체를 다운로드하고 참조하고 내부 메서드를 호출해야 합니다. 구체적인 방법은 공식 홈페이지나 중국 홈페이지의 기타 문서를 확인하실 수 있습니다.

먼저 이 소설 페이지의 소스 코드를 분석하고 이 장의 제목과 내용에 해당하는 요소를 살펴보세요

첫 번째 제목은 클래스 책 이름 아래 h1입니다

프로그래머들은 아직도 광고가 나오는 소설을 읽는다?

그 다음 내용은 다음과 같습니다. 콘텐츠 ID 아래 div

프로그래머들은 아직도 광고가 나오는 소설을 읽는다?

simple_html_dom 아래에서 jquery와 유사한 찾기 메서드를 사용할 수 있으며 선택기를 사용하여 위치가 지정된 요소를 찾을 수 있습니다. 예:

find('.bookname h1'); //bookname 클래스 아래에서 h1 제목 요소를 찾습니다.

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 모듈 웹페이지 PHP 클래스 수집

), 일반, 파싱 도구 simple_html_dom작성 방법은 처음에는 완벽했지만, 최고의 효과를 얻으려면 자체 서버를 배포하는 것이 가장 좋습니다. 그렇지 않으면 컴퓨터에서만 볼 수 있습니다. , 이는 그다지 편리하지 않습니다. , 광고를 더 기꺼이 용납할 수 있습니다.

위 내용은 php 컬을 사용하여 페이지를 수집하고 simple_html_dom을 사용하여 파싱하는 내용입니다. 자세한 내용은 php 중국어 사이트의 다른 관련 글을 참고해주세요!

위 내용은 프로그래머들은 아직도 광고가 나오는 소설을 읽는다?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.