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


Posted in PHP onDecember 18, 2016

前言

这篇文章主要介绍的是,如何利用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
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 '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 相关文章推荐
详解PHP显示MySQL数据的三种方法
Jun 05 PHP
Mysql数据库操作类( 1127版,提供源码下载 )
Dec 02 PHP
php中取得URL的根域名的代码
Mar 23 PHP
PHP中将数组转成XML格式的实现代码
Aug 08 PHP
php中计算中文字符串长度、截取中文字符串的函数代码
Aug 09 PHP
PHP实现通用alert函数的方法
Mar 11 PHP
简单解决新浪SAE无法上传文件的问题
May 13 PHP
既简单又安全的PHP验证码 附调用方法
Jun 02 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
实例讲解PHP表单验证功能
Feb 15 PHP
PHP写API输出的时用echo的原因详解
Apr 28 PHP
PHP 超级全局变量相关总结
Jun 30 PHP
详解PHP数据压缩、加解密(pack, unpack)
Dec 17 #PHP
Yii2中datetime类的使用
Dec 17 #PHP
php生成二维码图片方法汇总
Dec 17 #PHP
PHP二维数组去重算法
Dec 17 #PHP
php格式化时间戳
Dec 17 #PHP
PHP生成唯一ID之SnowFlake算法
Dec 17 #PHP
简单解决微信文章图片防盗链问题
Dec 17 #PHP
You might like
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
使用php判断网页是否gzip压缩
2013/06/25 PHP
php使用正则过滤js脚本代码实例
2014/05/10 PHP
PHP利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
PHP下载文件的函数实例代码
2016/05/18 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
小议Function.apply()之二------利用Apply的参数数组化来提高 JavaScript程序性能
2006/11/30 Javascript
动态调用css文件——jquery的应用
2007/02/20 Javascript
比较详细的javascript对象的property和prototype是什么一种关系
2007/08/06 Javascript
firefo xml 读写实现js代码
2009/06/11 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
2016/08/08 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
JS数组返回去重后数据的方法解析
2017/01/03 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
详解vue后台系统登录态管理
2019/04/02 Javascript
Vue组件基础用法详解
2020/02/05 Javascript
javascript实现支付宝滑块验证码效果
2020/07/24 Javascript
python数据封装json格式数据
2018/03/04 Python
python dataframe astype 字段类型转换方法
2018/04/11 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
2020/11/02 Python
Lou & Grey美国官网:主打舒适性面料服饰
2017/12/21 全球购物
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
Bravofly德国:预订廉价航班和酒店
2019/09/22 全球购物
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
《学会待客》教学反思
2014/02/22 职场文书
平面设计专业求职信
2014/08/09 职场文书
入党申请书怎么写?
2019/06/11 职场文书