怎么利用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属性就是内容了,但也有两种可能,一个是字符串,另一个是数组,数组的每个元素都是一个节点。

这种结构最好解析了,用一个递归就搞定

最终代码如下:


<?php

classBaiduYuedu {

 protected$bookId;

 protected$bookToken;

 protected$cookie;

 protected$result;

 publicfunction__construct($bookId,$bookToken,$cookie){

  $this->bookId =$bookId;

  $this->bookToken =$bookToken;

  $this->cookie =$cookie;

 }

 publicstaticfunctionparseNode($node){

  $str=''

  if(is_string($node['c'])){

   $str.=$node['c'];

  }elseif(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;

 }

 publicfunctionget($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;

 }

 publicfunctionstart(){

  $this->result =$this->get();

 }

 publicfunctiongetResult(){

  return$this->result;

 }

 publicfunctionsaveTo($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=newBaiduYuedu(�a3769eae009581becba',Ǝed1dedb240b11bf0731336eff95093f','你的百度域cookie');

$yuedu->start();

$yuedu->saveTo('result.txt');

这个类前两个参数可以从小说的介绍页面获得,第一个参数bookId就是url里ebook后面跟着的字符串,第二个参数bookToken在页面源代码搜索bdjsonUrl,m参数后面的那个字符串就是。

注:如果不传入百度cookie或者百度cookie无效,则只能抓取免费阅读部分,要抓完整的内容必须保证cookie可以正常使用。

总结:

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用PHP能有一定的帮助,如果有疑问大家可以留言交流。

时间: 2025-01-24 00:21:07

怎么利用PHP抓取百度阅读的相关文章

利用PHP抓取百度阅读的方法示例_php技巧

前言 这篇文章主要介绍的是,如何利用PHP抓取百度阅读的方法,下面话不多说,来一起看看吧. 抓取方法如下 首先在浏览器里打开阅读页面,查看源代码后发现小说的内容并不是直接写在页面里的,也就是说小说的内容是通过异步加载而来的. 于是将chrome的开发者工具切到network一栏,刷新阅读页面,主要关注的是XHR和script两个分类下. 经过排查,发现在script分类下有个jsonp请求比较像是小说内容,请求的地址是 http://wenku.baidu.com/content/49422a3

零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版_python

百度贴吧的爬虫制作和糗百的爬虫制作原理基本相同,都是通过查看源码扣出关键数据,然后将其存储到本地txt文件. 项目内容: 用Python写的百度贴吧的网络爬虫. 使用方法: 新建一个BugBaidu.py文件,然后将代码复制到里面后,双击运行. 程序功能: 将贴吧中楼主发布的内容打包txt存储到本地. 原理解释: 首先,先浏览一下某一条贴吧,点击只看楼主并点击第二页之后url发生了一点变化,变成了: http://tieba.baidu.com/p/2296712428?see_lz=1&pn=

php抓取百度快照、百度收录、百度热词程序代码

 代码如下 复制代码 <? /* 抓取百度收录代码 */ function baidu($s){   $baidu="http://www.baidu.com/s?wd=site%3A".$s;   $site=file_get_contents($baidu);   //$site=iconv("gb2312", "UTF-8", $site);   ereg("找到相关网页(.*)篇,", $site,$count)

利用curl抓取远程页面内容的示例代码

利用curl抓取远程页面内容的一个小示例,需要的朋友可以过来参考下   最基本的操作如下 复制代码 代码如下: $curlPost = 'a=1&b=2';//模拟POST数据 $ch = curl_init(); curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-FORWARDED-FOR:0.0.0.0', 'CLIENT-IP:0.0.0.0'));  //构造IP curl_setopt($ch, CURLOPT_REFERER, "ht

python抓取百度首页的方法

  本文实例讲述了python抓取百度首页的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import urllib def downURL(url,filename): try: fp=urllib.urlopen(url) except: print('download error') return 0 op=open(filename,'wb') while 1: s=fp.read() if not

版权局:360搜索抓取百度网页快照属侵权

腾讯科技讯 在日前举行的"剑网行动"发布会上,针对百度与360之间的"3B大战",国家版权局首次进行了表态--360此举不适用"避风港原则",360要通过网页快照抓取,必须要取得百度公司的授权. 在今年8月29日发生的"3B"大战,曾在业界引起轩然大波.事件起因360综合搜索上线之后,迅速取得10%市场份额,且直接抓取百度网页快照.这引发百度采取反制措施,即用户通过360综合搜索访问百度知道等服务时,将会强行跳转至百度首页.

工具-【在线等/SEO】抓取百度排名快照的功能?

问题描述 [在线等/SEO]抓取百度排名快照的功能? 实在找不到好的思路去**优化抓取百度排名快照**的功能了, 只有在这里发帖了. 有没有哪位朋友做过这样的功能.或者有没有什么 API 可以接入的. 急,感激不尽.(小弟C币不多,有机会给发红包) PS:现在我通过程序能够抓取到排名的快照数据,但是太慢了.有没有其他方式能够更快的获取到排名的数据. 解决方案 // 我的问题没有描述清楚吗? // 为什么没有人来呢. 解决方案二: // 人呢? 我准备发红包了.

国家版权局裁定360抓取百度内容属侵权

"剑网行动"新闻通气会现场. 12月29日,国家版权局在打击网络侵权盗版专项治理"剑网行动"新闻通气会上指出:360综合搜索提供百度网页快照不适用"避风港原则",对于百度拥有权利的作品,360要通过网页快照抓取,必须要取得百度公司的授权,未经授权随意抓取百度拥有版权的作品属侵权行为. 据了解,国家版权局已经要求360综合搜索进行整改,同时将视360的整改情况再采取进一步的管理措施.这也是自360违规抓取百度内容而引发3B大战以来,国家有关部委的首

版权局首表态:360搜索抓取百度内容须获授权

BiaNews消息12月29日,http://www.aliyun.com/zixun/aggregation/2164.html">国家 版权局等4部门昨日联合展示了2012年"剑网行动"的工作成果和视频网站主动监管工作情况.本次"剑网行动"中,国家版权局共接到 各地版权 行政执法部门报送查办的网络侵权盗版案件282件,关闭违法网站183家. 国家版权局还同时通报了对"3B大战"的最新表态,称360搜索要抓取百度内容需要获得百度