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
callback=wenku7
json
Analysons la structure des données renvoyées. La chaîne
json
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
bookId
<🎜. >
liurl
La chaîne suivie de
, le deuxième paramètreebook
bookToken
bdjsonUrl
m
Remarque :
Si Baidu
cookie
cookie
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) !