Exemple d'utilisation de PHP pour explorer Baidu Reading

黄舟
Libérer: 2023-03-05 22:40:02
original
1894 Les gens l'ont consulté

Avant-propos

Cet article présente principalement comment utiliser PHP pour capturer Baidu Reading. Pas grand chose à dire ci-dessous, jetons un coup d'œil.

La méthode d'exploration est la suivante

Ouvrez d'abord la page de lecture dans le navigateur, vérifiez le code source et constatez que le contenu du roman n'est pas écrit directement sur la page, c'est-à-dire On dit que le contenu du roman est chargé de manière asynchrone.

J'ai donc basculé les outils de développement de Chrome vers la colonne réseau, actualisé la page de lecture et me suis concentré sur les deux catégories XHR et script.

Après enquête, il a été constaté qu'il y avait une requête jsonp dans la catégorie script qui ressemblait davantage au contenu d'un roman. L'adresse demandée était
http://www.php.cn/ <.>La réponse était une chaîne

jsonp
Copier après la connexion
, puis j'ai découvert que si je supprimais le

callback=wenku7
Copier après la connexion
dans l'adresse, ce qui est renvoyé est un

json
Copier après la connexion
Copier après la connexion
chaîne, donc une fois analysée, elle est très pratique et peut être convertie directement en tableau en php.


Analysons la structure des données renvoyées. La chaîne

json
Copier après la connexion
Copier après la connexion
renvoyée est suivie d'une structure arborescente. Chaque nœud a un attribut t et un attribut c est To. spécifiez l'étiquette de ce nœud, comme h2 p, etc., l'attribut c est le contenu, mais il y a deux possibilités, l'une est une chaîne, l'autre est un tableau et chaque élément du tableau est un nœud.


Ce type de structure est le meilleur à analyser, et cela peut être fait avec une seule récursion


Le code final est le suivant :

<?php
class BaiduYuedu {
 protected $bookId;
 protected $bookToken;
 protected $cookie;
 protected $result;
 public function __construct($bookId, $bookToken, $cookie){
  $this->bookId = $bookId;
  $this->bookToken = $bookToken;
  $this->cookie = $cookie;
 }
 public static function parseNode($node){
  $str = &#39;&#39;;
  if(is_string($node[&#39;c&#39;])){
   $str .= $node[&#39;c&#39;];
  }else if(is_array($node[&#39;c&#39;])){
   foreach($node[&#39;c&#39;] as $d){
    $str .= self::parseNode($d);
   }
  }
  switch($node[&#39;t&#39;]){
   case &#39;h2&#39;:
    $str .= "\n\n";
    break;
   case &#39;br&#39;:
   case &#39;p&#39;:
   case &#39;p&#39;:
    $str .= "\n";
    break;
   case &#39;img&#39;:
   case &#39;span&#39;:
    break;
   case &#39;obj&#39;:
    $tmp = &#39;(&#39; . self::parseNode($node[&#39;data&#39;][0]) . &#39;)&#39;;
    $str .= str_replace("\n", &#39;&#39;, $tmp);
    break;
   default:
    trigger_error(&#39;Unkown type:&#39;.$node[&#39;t&#39;], E_USER_WARNING);
    break;
  }
  return $str;
 }
 public function get($page = 1){
  echo "getting page {$page}...\n";
  $ch = curl_init();
  $url = sprintf(&#39;http://wenku.baidu.com/content/%s/?m=%s&type=json&cn=%d&#39;, $this->bookId, $this->token, $page);
  curl_setopt_array($ch, array(
   CURLOPT_URL   => $url,
   CURLOPT_RETURNTRANSFER => 1,
   CURLOPT_HEADER   => 0,
   CURLOPT_HTTPHEADER  => array(&#39;Cookie: &#39;. $this->cookie)
  ));
  $ret = json_decode(curl_exec($ch), true);
  curl_close($ch);
  $str = &#39;&#39;;
  if(!empty($ret)){
   $str .= self::parseNode($ret);
   $str .= $this->get($page + 1);
  }
  return $str;
 }
 public function start(){
  $this->result = $this->get();
 }
 public function getResult(){
  return $this->result;
 }
 public function saveTo($path){
  if(empty($this->result)){
   trigger_error(&#39;Result is empty&#39;, E_USER_ERROR);
   return;
  }
  file_put_contents($path, $this->result);
  echo "save to {$path}\n";
 }
}
//使用示例
$yuedu = new BaiduYuedu(&#39;49422a3769eae009581becba&#39;, &#39;8ed1dedb240b11bf0731336eff95093f&#39;, &#39;你的百度域cookie&#39;);
$yuedu->start();
$yuedu->saveTo(&#39;result.txt&#39;);
Copier après la connexion


Les deux premiers paramètres de cette classe peuvent être obtenus à partir de la page d'introduction du roman. Le premier paramètre

bookId
Copier après la connexion
est

<🎜. >

li
url
Copier après la connexion

La chaîne suivie de

, le deuxième paramètre
ebook
Copier après la connexion

est recherché dans le code source de la page pour
bookToken
Copier après la connexion

, le un après le paramètre
bdjsonUrl
Copier après la connexion

Les chaînes sont.
m
Copier après la connexion


Remarque :
Si Baidu

n'est pas transmis ou si Baidu
cookie
Copier après la connexion
Copier après la connexion
Copier après la connexion

n'est pas valide, seule la partie lecture gratuite sera capturé. Pour capturer le contenu complet, vous devez vous assurer que
cookie
Copier après la connexion
Copier après la connexion
Copier après la connexion

peut être utilisé normalement.
cookie
Copier après la connexion
Copier après la connexion
Copier après la connexion


Résumé


Ce qui précède est un exemple de la façon d'utiliser PHP pour capturer Baidu Reading. Pour plus de contenu connexe, veuillez prêter attention au. Site Web chinois PHP (www .php.cn) !


Exemple d'utilisation de PHP pour explorer Baidu Reading
É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