Maison > cadre php > Laravel > Utiliser simple_html_dom pour explorer et afficher l'intégralité du roman dans Laravel

Utiliser simple_html_dom pour explorer et afficher l'intégralité du roman dans Laravel

L先生
Libérer: 2020-05-07 14:51:57
original
2737 Les gens l'ont consulté

Comme mentionné dans Les programmeurs lisent également des romans avec des publicités, de nombreux nouveaux sites Web contiennent des publicités très ennuyeuses, soit ils ajoutent des liens vers le div global, et si vous les touchez accidentellement, ils accéderont à certains sites Web. Même dans une boucle infinie, certaines applications mobiles contiennent également de nombreuses publicités. Cet article l'appliquera au framework Laravel. Il est préférable de d'abord comprendre l'article précédent, puis de le déployer vous-même.

1. Introduisez des classes tierces dans Laravel

1 Créez un nouveau dossier dans le répertoire de l'application sous le répertoire racine du projet et nommez-le Lib (. nom personnalisé)

2. Si vous introduisez de nombreuses bibliothèques tierces, vous pouvez créer plusieurs nouvelles catégories de répertoires sous Lib. Puisqu'une seule classe est introduite, il n'y a pas de nouveau dossier ici. (Défini par vous-même en fonction du nombre de classes importées)

Copiez simple_html_dom.php dans Lib

3 Recherchez le fichier composer.json dans le répertoire racine du projet et écrivez le chemin du troisième. -party class Entrez le classmap sous autoload, afin que

puisse être chargé automatiquement "autoload": {
"classmap": [
"database/seeds",
. "database/factories" ,
"app/Lib/simple_html_dom.php"
]
},

4. Basculez vers le répertoire racine du projet dans la console cmd et exécutez la commande :

composer dumpautoload

5. Utilisez cette classe dans le contrôleur

use simple_html_dom;

$html = new simple_html_dom(); 🎜>

2. Créer un itinéraire

Route::get('/novel_list','index\Spnovel@index');
Copier après la connexion

3. Créer un contrôleur 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;
	}
}
Copier après la connexion

Explication de le code ci-dessus : Tout d'abord, vous devez comprendre le framework laravel et la classe php

Après avoir accédé à la route ci-dessus, la méthode d'index dans le contrôleur Spnovel.php est exécutée. un chapitre d'un certain roman. L'adresse de la liste, utilisez-la comme paramètre pour exécuter la méthode getcurl dans la classe personnalisée mySpClass et renvoyez la chaîne du document html de cette page. Exécutez la méthode getList dans cette classe, le paramètre est la chaîne HTML qui doit être analysée. Privatisez cette méthode, utilisez l'analyse simple_html_dom et configurez des règles régulières pour extraire l'adresse URL et le nom de chapitre de chaque chapitre. Et renvoyez ce tableau, via return view('index.spnovel.index',$data); ouvrira index/spnovel/index.blade.php, veuillez consulter index.blade.php

four , Créer une vue index.blade.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="Utiliser simple_html_dom pour explorer et afficher l'intégralité du roman dans 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>
Copier après la connexion

Explication du code ci-dessus : Le css est simplement écrit ici, et img est utilisé comme image de fond. Dans la boucle li dans ul, {{$item[1]}} est le paramètre d'adresse obtenu et {{$item[0]}} est le nom de chapitre obtenu. Jetez un œil au tableau et à l'effet final.

Utiliser simple_html_dom pour explorer et afficher lintégralité du roman dans Laravel

5. Courir

Utiliser simple_html_dom pour explorer et afficher lintégralité du roman dans Laravel

Ce qui suit est le contenu de chaque chapitre

Premier coup d'oeil à l'itinéraire :

Route::get(&#39;/novel_con/{a}/{b}/{c}&#39;,&#39;index\Spnovel@get_nContent&#39;);
Copier après la connexion

Cela correspond aux paramètres url de chaque chapitre. Par exemple, les paramètres d'un certain chapitre sont : roman_con/85/85445/27248645. .html

Écrire méthode 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;
	}
Copier après la connexion

Explication : $req->a, $ req- >b, $req->c, sont respectivement trois paramètres, puis les fusionnent en une adresse complète pour demander un certain chapitre, puis obtenez la chaîne html d'un certain chapitre via mySpClass :: getCurl. Utilisez ensuite getContent dans cette classe pour analyser cette page. Commencez par examiner la méthode d'analyse, analysez le titre et le contenu du chapitre avec l'article précédent, écrivez-le dans le tableau et supprimez la partie publicitaire textuelle redondante. $next est l'adresse du chapitre suivant stocké, qui est utilisée pour accéder à la page de détails du chapitre.

Voir 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="Utiliser simple_html_dom pour explorer et afficher l'intégralité du roman dans Laravel" >
	<h2>{{$artic[&#39;title&#39;]}}</h2>
	<a href="{{$artic[&#39;next&#39;]}}" class="next">下一章</a>
	<div>
		{!!$artic[&#39;content&#39;]!!}
	</div>
</body>
</html>
Copier après la connexion

Explication : Parce qu'il n'y a que l'article actuel, il n'y a pas besoin de boucler, { {$artic['title']}} est le titre et peut également être écrit dans le titre. La façon dont {!!$artic['content']!!} est écrit est qu'il n'est pas nécessaire d'échapper au contenu de l'article, sinon il y aura de nombreux autres caractères, tels que
, etc. L'adresse du bouton du chapitre suivant peut être transmise directement position:fixed fixe le bouton de positionnement, et vous pouvez passer au chapitre suivant à tout moment.

Exécuter  :

Utiliser simple_html_dom pour explorer et afficher lintégralité du roman dans Laravel

Résumé : La partie la plus importante de cet article est l'introduction de troisièmes- classes de fête qui peuvent être appliquées Lui, ainsi que les bases de Laravel, sont plus habitués à utiliser la vue contrôleur. Si vous utilisez le modèle, veuillez rédiger votre propre vérification.

C'est suffisant pour un roman. Bien sûr, nous pouvons l'étendre et rédiger la liste des romans de l'ensemble du site. Elle sera encore plus parfaite si nous continuons à passer les paramètres appropriés.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal