Maison  >  Article  >  développement back-end  >  Exemple d'utilisation de PHP pour explorer Baidu Reading

Exemple d'utilisation de PHP pour explorer Baidu Reading

黄舟
黄舟original
2017-02-23 09:27:211878parcourir

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
, puis j'ai découvert que si je supprimais le

callback=wenku7
dans l'adresse, ce qui est renvoyé est un

json
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
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;);


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

bookId
est

li
url

La chaîne suivie de

, le deuxième paramètre
ebook

est recherché dans le code source de la page pour
bookToken

, le un après le paramètre
bdjsonUrl

Les chaînes sont.
m


Remarque :
Si Baidu

n'est pas transmis ou si Baidu
cookie

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

peut être utilisé normalement.
cookie


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
Déclaration:
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