>  기사  >  PHP 프레임워크  >  simple_html_dom 크롤링을 사용하여 전체 소설을 laravel로 표시합니다.

simple_html_dom 크롤링을 사용하여 전체 소설을 laravel로 표시합니다.

L先生
L先生원래의
2020-05-07 14:14:382685검색

프로그래머도 광고가 있는 소설을 읽습니다에서 언급했듯이, 많은 소설 웹사이트에는 기본적으로 매우 짜증나는 광고가 있습니다. 전체 div에 링크를 추가하거나 실수로 터치하면 일부 웹사이트로 이동하거나 심지어 무한 루프가 발생합니다. . 일부 모바일 앱에는 광고가 많이 포함되어 있습니다. 이 기사에서는 이를 laravel 프레임워크에 먼저 적용한 후 직접 배포하는 것이 가장 좋습니다.

1. laravel에 타사 클래스 도입

1. 프로젝트 루트 디렉토리 아래 app 디렉토리에 새 폴더를 만들고 이름을 Lib(맞춤 이름)로 지정합니다

2. 라이브러리의 경우 Lib 아래에 몇 가지 디렉토리 카테고리를 더 만들 수 있습니다. 클래스가 하나만 도입되었으므로 여기에는 새 폴더가 없습니다. (가져온 클래스 수에 따라 직접 정의)

simple_html_dom.php를 Lib에 복사

3. 프로젝트 루트 디렉터리에서 작곡가.json 파일을 찾아 아래의 클래스맵에 타사 클래스의 경로를 씁니다. 자동 로드, 이렇게 자동으로 로드하려면

"autoload": {
"classmap": [
"database/seeds",
"database/factories",
"app/Lib/simple_html_dom.php"
]
},

4. cmd 콘솔에서 프로젝트 루트 디렉터리로 전환하고

composer dumpautoload

5 명령을 실행합니다. 컨트롤러에서 이 클래스를 사용하세요

use simple_html_dom;

$html = new simple_html_dom();

2. Route 생성

Route::get('/novel_list','index\Spnovel@index');

3. 컨트롤러 생성 Spnovel.php

<?php
namespace App\Http\Controllers\index;
use simple_html_dom;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class Spnovel extends Controller
{
	public function index(){
		$url = "https://www.7kzw.com/85/85445/";
		$list_html = mySpClass::getCurl($url);
		$data[&#39;List&#39;] = self::getList($list_html);
		return view(&#39;index.spnovel.index&#39;,$data);
	}
	private static function getList($list_html){
		$html = new simple_html_dom();
		@$html->load($list_html);
		$list = $html->find(&#39;#list dd a&#39;);
		foreach ($list as $k=>$v) {
			$arr1=$arr2=[];
			$p1 = &#39;/<a .*?>(.*?)<\/a>/i&#39;;
			$p2 = &#39;/<a .*? href="(.*?)">.*?<\/a>/i&#39;;
			preg_match($p1,$v->outertext,$arr1);
			preg_match($p2,$v->outertext,$arr2);
			$content[$k][0]=$arr1[1];
			$content[$k][1]=$arr2[1];
		}
		array_splice($content,0,12); 
		return $content;
	}
}
class mySpClass{
	// 向服务器发送最简单的get请求
	public static function getCurl($url,$header=null){
		// 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);//设置头信息
		}else{
			$_head = [
			&#39;User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0&#39;
			]; 
			curl_setopt($ch,CURLOPT_HTTPHEADER,$_head);
		}
		// 3.执行
		$res = curl_exec($ch);
		// 4.关闭
		curl_close($ch);
		return $res;
	}
}

위 코드 설명 우선, laravel 프레임워크를 이해하고 PHP 클래스

위 경로에 접속한 후 실행되는 것은 Spnovel.php 컨트롤러의 index 메소드입니다. $url은 특정 소설의 챕터 목록 주소를 매개변수로 사용하여 getcurl 메소드를 실행합니다. 사용자 정의 클래스 mySpClass를 사용하고 이 페이지의 HTML 문서 문자열을 반환합니다. 이 클래스에서 getList 메소드를 실행하십시오. 매개변수는 구문 분석해야 하는 html 문자열입니다. 이 방법을 사유화하고, simple_html_dom 구문 분석을 사용하고, 각 장의 URL 주소와 장 이름을 추출하도록 일반 규칙을 구성합니다. 그리고 이 배열을 반환하면 return view('index.spnovel.index',$data);를 통해 index/spnovel/index.blade.php가 열립니다. index.blade.php

를 참조하세요. 4. 뷰 인덱스를 만듭니다. 블레이드 .php

<!DOCTYPE html>
<html>
<head>
	<title>爬取的小说列表</title>
	<style type="text/css">
	body{padding:0px;margin:0px;}
	#lists{width:100%;padding:30px 50px;box-sizing:border-box;}
	ul{margin:0;padding: 0;overflow:hidden;}
	ul li{list-style:none;display:inline-block;float:left;width:25%;color:#444;}
	ul li:hover{color:#777;cursor: pointer;}
	img {z-index:-1;width:100%;height:100%;position:fixed;}
	</style>
</head>
<body>
	<img  src="/static/img/index/novelbg.jpg" alt="simple_html_dom 크롤링을 사용하여 전체 소설을 laravel로 표시합니다." >
	<div id="lists">
		<ul>
			@foreach($List as $item)
			<li>
			<a href="/novel_con{{$item[1]}}">{{$item[0]}}</a>
			</li>
			@endforeach
		</ul>		
	</div>
</body>
</html>

위 코드 설명: 여기서는 CSS를 간단하게 작성하고, img를 배경 이미지로 사용합니다. ul의 루프 li에서 {{$item[1]}}은 얻은 주소 매개변수이고, {{$item[0]}}은 얻은 장 이름입니다. 배열과 최종 효과를 살펴보세요.

simple_html_dom 크롤링을 사용하여 전체 소설을 laravel로 표시합니다.

5. 실행

simple_html_dom 크롤링을 사용하여 전체 소설을 laravel로 표시합니다.

다음은 각 장의 내용입니다

경로를 먼저 살펴보세요:

Route::get(&#39;/novel_con/{a}/{b}/{c}&#39;,&#39;index\Spnovel@get_nContent&#39;);

이것은 특정 장의 URL 매개변수에 해당합니다. 해당 장의 매개변수는 다음과 같습니다: Novel_con/85/85445/27248645.html

get_nContent 메소드 작성:

public function get_nContent(Request $req){
		$url1 = $req->a.&#39;/&#39;.$req->b.&#39;/&#39;.$req->c;
		$url = "https://www.7kzw.com/".$url1;
		$res = mySpClass::getCurl($url);//获得
		// 开始解析
		$data[&#39;artic&#39;]= self::getContent($res);
		$next = (int)$req->c;
		$next = $next+1;
		$data[&#39;artic&#39;][&#39;next&#39;]="/novel_con/".$req->a.&#39;/&#39;.$req->b.&#39;/&#39;.$next.&#39;.html&#39;;
		return view(&#39;index.spnovel.ncontent&#39;,$data);
	}
private static 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;
	}

설명: $req->a, $req->b, $ req->c는 각각 세 개의 매개변수이며 이를 특정 장의 주소에 대한 완전한 요청으로 병합한 다음 mySpClass::getCurl을 통해 특정 장의 html 문자열을 얻습니다. 그런 다음 이 클래스의 getContent를 사용하여 이 페이지를 구문 분석합니다. 먼저 구문 분석 방법을 살펴보고 이전 기사가 포함된 장의 제목과 내용을 구문 분석하여 배열에 쓰고 중복된 텍스트 광고 부분을 제거합니다. $next는 저장된 다음 챕터의 주소로, 챕터 세부정보 페이지로 이동하는 데 사용됩니다.

ncontent.blade.php

<!DOCTYPE html>
<html>
<head>
	<title>{{$artic[&#39;title&#39;]}}</title>
	<style type="text/css">
	h2{text-align:center;padding-top:30px;}
	div{margin:20px 50px;font-size:20px;}
	img {z-index:-1;width:100%;height:100%;position:fixed;}
	.next {position:fixed;right:10px;bottom:20px;background:coral;border-radius:3px;padding:4px;}
	.next:hover{color:#fff;}
	</style>
</head>
<body>
	<img  src="/static/img/index/novelbg.jpg" alt="simple_html_dom 크롤링을 사용하여 전체 소설을 laravel로 표시합니다." >
	<h2>{{$artic[&#39;title&#39;]}}</h2>
	<a href="{{$artic[&#39;next&#39;]}}" class="next">下一章</a>
	<div>
		{!!$artic[&#39;content&#39;]!!}
	</div>
</body>
</html>

Explanation: 현재 글만 있으므로 반복할 필요는 없습니다. 제목은 {{$artic['title']}} 이고, 제목에도 쓸 수 있습니다. {!!$artic['content']!!}가 작성되는 방식은 기사의 내용을 벗어날 필요가 없다는 것입니다. 그렇지 않으면
등과 같은 다른 문자가 많이 있을 것입니다. 다음 장의 버튼 주소를 직접 전달할 수 있습니다. position:fixed 는 위치 지정 버튼을 수정하고 언제든지 다음 장으로 이동할 수 있습니다.

Run:

simple_html_dom 크롤링을 사용하여 전체 소설을 laravel로 표시합니다.

요약: 이 글의 가장 중요한 부분은 타사 클래스를 소개하고 이를 적용할 수 있다는 점, 그리고 laravel의 기본 사항을 컨트롤러 사용에 더 익숙하게 만든 것입니다. 모델과 함께 조회수를 확인하세요.

이것은 소설에 충분합니다. 물론 이를 확장하여 전체 사이트의 소설 목록을 작성할 수 있습니다. 계속해서 적절한 매개변수를 전달하면 더욱 완벽해질 것입니다.

위 내용은 simple_html_dom 크롤링을 사용하여 전체 소설을 laravel로 표시합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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