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

发布时间 - 2026-01-10 21:54:36    点击率:

前言

这篇文章主要介绍的是,如何利用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抓取源码  # PHP网页抓取之抓取百度贴吧邮箱数据代码分享  # php下通过curl抓取yahoo boss 搜索结果的实现代码  # PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例  # PHP统计nginx访问日志中的搜索引擎抓取404链接页面路径  # PHP实现采集抓取淘宝网单个商品信息  # PHP的cURL库功能简介 抓取网页、POST数据及其他  # PHP实现抓取百度搜索结果页面【相关搜索词】并存储到txt文件示例  # 的是  # 这篇文章  # 递归  # 源代码  # 都是  # 是一个  # 都有  # 有个  # 第一个  # 而来  # 有一定  # 树状  # 第二个  # 但也  # 再来  # 可以直接  # 正常使用  # 有两种  # 多说  # 看看吧 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  PHP 500报错的快速解决方法  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  零基础网站服务器架设实战:轻量应用与域名解析配置指南  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  Bootstrap CSS布局之列表  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  如何登录建站主机?访问步骤全解析  Laravel如何生成API文档?(Swagger/OpenAPI教程)  网站建设整体流程解析,建站其实很容易!  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  JavaScript如何实现类型判断_typeof和instanceof有什么区别  香港服务器选型指南:免备案配置与高效建站方案解析  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  如何彻底删除建站之星生成的Banner?  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  油猴 教程,油猴搜脚本为什么会网页无法显示?  如何在阿里云通过域名搭建网站?  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  大连网站制作公司哪家好一点,大连买房网站哪个好?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  如何在搬瓦工VPS快速搭建网站?  Linux系统命令中tree命令详解  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  js实现点击每个li节点,都弹出其文本值及修改  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  如何在Windows服务器上快速搭建网站?  清除minerd进程的简单方法  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  如何快速完成中国万网建站详细流程?  php485函数参数是什么意思_php485各参数详细说明【介绍】  三星网站视频制作教程下载,三星w23网页如何全屏?  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  如何在阿里云ECS服务器部署织梦CMS网站?  JavaScript Ajax实现异步通信