国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

利用PHP抓取百度閱讀的方法示例

2024-05-04 23:53:48
字體:
來源:轉載
供稿:網友

前言

這篇文章主要介紹的是,如何利用PHP抓取百度閱讀的方法,下面話不多說,來一起看看吧。

抓取方法如下

首先在瀏覽器里打開閱讀頁面,查看源代碼后發現小說的內容并不是直接寫在頁面里的,也就是說小說的內容是通過異步加載而來的。

于是將chrome的開發者工具切到network一欄,刷新閱讀頁面,主要關注的是XHR和script兩個分類下。

經過排查,發現在script分類下有個jsonp請求比較像是小說內容,請求的地址是

http://wenku.baidu.com/content/49422a3769eae009581becba?m=8ed1dedb240b11bf0731336eff95093f&type=json&cn=1&_=1&t=1423309200&callback=wenku7

返回的是一個jsonp字符串,然后我發現,如果把地址里面的callback=wenku7去掉,返回的就是一個json字符串,這樣解析起來就方便不少,可以直接在php里面轉換成數組。

再來分析一下返回數據的結構,返回的json字符串之后是一個樹狀的結構,每個節點都有一個t屬性和c屬性,t屬性用來指明這個節點的標簽,比如h2 div等等,c屬性就是內容了,但也有兩種可能,一個是字符串,另一個是數組,數組的每個元素都是一個節點。

這種結構最好解析了,用一個遞歸就搞定

最終代碼如下:

<?phpclass 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 'div':   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');

這個類前兩個參數可以從小說的介紹頁面獲得,第一個參數bookId就是urlebook后面跟著的字符串,第二個參數bookToken在頁面源代碼搜索bdjsonUrlm參數后面的那個字符串就是。

注:如果不傳入百度cookie或者百度cookie無效,則只能抓取免費閱讀部分,要抓完整的內容必須保證cookie可以正常使用。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家學習或者使用PHP能有一定的幫助,如果有疑問大家可以留言交流。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 舟曲县| 安泽县| 通化市| 临泽县| 辽宁省| 南乐县| 开远市| 怀来县| 六盘水市| 海城市| 斗六市| 芜湖县| 忻城县| 马公市| 崇左市| 响水县| 张家口市| 广河县| 澄迈县| 会泽县| 定安县| 怀安县| 新乡县| 鄂温| 扎鲁特旗| 新津县| 三河市| 浦东新区| 宿松县| 长泰县| 邻水| 台东市| 图木舒克市| 丹阳市| 门头沟区| 射阳县| 东莞市| 铜山县| 苍梧县| 曲阳县| 平和县|