Maison > Article > développement back-end > Exemple d'utilisation de PHP pour explorer Baidu Reading
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=wenku7dans l'adresse, ce qui est renvoyé est un
jsonchaî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
jsonrenvoyé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 = ''; if(is_string($node['c'])){ $str .= $node['c']; }else if(is_array($node['c'])){ foreach($node['c'] as $d){ $str .= self::parseNode($d); } } switch($node['t']){ case 'h2': $str .= "\n\n"; break; case 'br': case 'p': case 'p': $str .= "\n"; break; case 'img': case 'span': break; case 'obj': $tmp = '(' . self::parseNode($node['data'][0]) . ')'; $str .= str_replace("\n", '', $tmp); break; default: trigger_error('Unkown type:'.$node['t'], E_USER_WARNING); break; } return $str; } public function get($page = 1){ echo "getting page {$page}...\n"; $ch = curl_init(); $url = sprintf('http://wenku.baidu.com/content/%s/?m=%s&type=json&cn=%d', $this->bookId, $this->token, $page); curl_setopt_array($ch, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => 1, CURLOPT_HEADER => 0, CURLOPT_HTTPHEADER => array('Cookie: '. $this->cookie) )); $ret = json_decode(curl_exec($ch), true); curl_close($ch); $str = ''; 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('Result is empty', E_USER_ERROR); return; } file_put_contents($path, $this->result); echo "save to {$path}\n"; } } //使用示例 $yuedu = new BaiduYuedu('49422a3769eae009581becba', '8ed1dedb240b11bf0731336eff95093f', '你的百度域cookie'); $yuedu->start(); $yuedu->saveTo('result.txt');
Les deux premiers paramètres de cette classe peuvent être obtenus à partir de la page d'introduction du roman. Le premier paramètre
bookIdest li
url
La chaîne suivie de
, le deuxième paramètreebookest recherché dans le code source de la page pour
bookToken, le un après le paramètre
bdjsonUrlLes chaînes sont.
m
Remarque :
Si Baidu
cookien'est pas valide, seule la partie lecture gratuite sera capturé. Pour capturer le contenu complet, vous devez vous assurer que
cookiepeut ê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) !