设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 手机 数据
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php程序员还看带广告的小说?

发布时间:2022-06-24 13:53 所属栏目:121 来源:互联网
导读:有人习惯看小说,偶尔会看几章,都是百度出来,但是基本都有特别烦人的广告,要么在整体div添加链接,误触就会跳转到一些网站甚至是死循环,某些手机app也是广告很多,所以无事在写一个小程序免除广告的烦扰。 本文将使用php curl采集页面simple_html_dom解
  有人习惯看小说,偶尔会看几章,都是百度出来,但是基本都有特别烦人的广告,要么在整体div添加链接,误触就会跳转到一些网站甚至是死循环,某些手机app也是广告很多,所以无事在写一个小程序免除广告的烦扰。
 
  本文将使用php curl采集页面simple_html_dom解析,实现真正的去除广告。
 
  随便找一个小说网站找一本书,不过这个站点在手机端是特别坑的,就有上述问题:
 
  程序员还看带广告的小说?
 
  就拿这本小说来开刀。(声明:绝对不是推广,侵删)
 
  一、了解curl的get方式
 
  curl是一个命令行工具,通过指定的URL来上传或下载数据,并将数据展示出来。curl中的c表示client,而URL,就是URL。
 
  PHP中使用cURL可以实现Get和Post请求的方法
 
  简单的抓取小说仅需要get方法即可。
 
  下面这个示例代码就是通过get请求获取第一章小说页面html的示例,只需要更改url参数即可。
 
  初始化、设置选项、证书验证、执行、关闭
 
  <?php
  
  header("Content-Type:text/html;charset=utf-8");
  
  $url="https://www.7kzw.com/85/85445/27248636.html";
  
  $ch = curl_init($url);   //初始化
  
  //设置选项
  
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//获取的信息以字符串返回,而不是直接输出(必须)  
  
  curl_setopt($ch,CURLOPT_TIMEOUT,10);//超时时间(必须)
  
  curl_setopt($ch, CURLOPT_HEADER,0);//   启用时会将头文件的信息作为数据流输出。  
  
  //参数为1表示输出信息头,为0表示不输出
  
  curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); //不验证证书
  
  // 3.执行
  
  $res = curl_exec($ch);
  
  // 4.关闭
  
  curl_close($ch);
  
  print_r($res);
  
  ?>
  注释就特别详细了,按照步骤,发送curl的get请求,如果是post请求则需要多加一条设置post选项的设置,并且传参,最后输出获得的信息,运行结果如下,是没有css渲染的。
 
  程序员还看带广告的小说?
 
  二、解析页面
 
  输出的页面有很多不需要的内容,需要在所有内容中提取出我们需要的内容,比如标题和每章的内容,这时需要解析页面。
 
  解析页面的方法也有很多,在这里使用的是simple_html_dom,需要下载引用simple_html_dom.php这个类,实例对象,并调用内部的方法。具体方法可以到官网查看,或者中文网其他文档。
 
  先分析这个小说页面的源代码,看这章的标题和内容对应的元素
 
  首先是标题:在类bookname下的h1下
 
  程序员还看带广告的小说?
 
  然后是内容:在id为content的div下
 
  程序员还看带广告的小说?
 
  simple_html_dom的可以使用find方法,类似jquery一样使用选择器查找定位元素。如:
 
  find('.bookname h1'); //查找类bookname 下的h1标题元素
 
  find('#content'); //查找id为content的章节内容
 
  代码在以上的基础上新增:
 
  include "simple_html_dom.php";
  
  $html = new simple_html_dom();
  
  @$html->load($res);
  
  $h1 = $html->find('.bookname h1');
  
  foreach ($h1 as $k=>$v) {
  
      $artic['title'] = $v->innertext;
  
  }
  
  // 查找小说的具体内容
  
  $divs = $html->find('#content');
  
  foreach ($divs as $k=>$v) {
  
      $content = $v->innertext;
  
  }
  
  // 正则替换去除多余部分
  
  $pattern = "/(<p>.*?<\/p>)|(<div .*?>.*?<\/div>)/";
  
  $artic['content'] = preg_replace($pattern,'',$content);
  
  echo $artic['title'].'<br>';
  
  echo $artic['content'];
  使用以上的解析方法获得的内容是数组,使用foreach来获得数组内容,使用了正则替换将正文文字广告去除,将标题和小说内容放到数组内。最简单的写法就写好了,运行结果如下:
 
  程序员还看带广告的小说?
 
  当然这种写法看着比较难受,可以自行封装函数类,如下就是我自己写好的代码示例了,当然肯定有不足的地方,但是可以作为参考扩展。
 
  <?php  
  
  include "simple_html_dom.php";
  
  include "mySpClass.php";
  
  header("Content-Type:text/html;charset=utf-8");
  
  $get_html = get_html($_GET['n']);
  
  $artic = getContent($get_html);
  
  echo $artic['title'].'<br>';
  
  echo $artic['content'];
  
  /**
  
  * 获取www.7kzw.com 获取每一章的页面html
  
  * @param type $num 第几章,从第一开始(int)
  
  * @return 返回字符串   
  
  */
  
  function get_html($num){
  
      $start = 27248636;
  
      $real_num = $num+$start-1;
  
      $url = 'https://www.7kzw.com/85/85445/'.$real_num.'.html';
  
      $header = [
  
      'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0'
  
      ];  
  
      return mySpClass()->getCurl($url,$header);
  
  }
  
  /**
  
  * 获取www.7kzw.com小说标题数组
  
  * @param type $get_html 得到的每一章的页面html
  
  * @return 返回$artic数组,['title'=>'','content'=>'']
  
  */
  
  function getContent($get_html){
  
      $html = new simple_html_dom();
  
      @$html->load($get_html);
  
      $h1 = $html->find('.bookname h1');
  
      foreach ($h1 as $k=>$v) {
  
          $artic['title'] = $v->innertext;
  
      }
  
      // 查找小说的具体内容
  
      $divs = $html->find('#content');
  
      foreach ($divs as $k=>$v) {
  
          $content = $v->innertext;
  
      }
  
      // 正则替换去除多余部分
  
      $pattern = "/(<p>.*?<\/p>)|(<div .*?>.*?<\/div>)/";
  
      $artic['content'] = preg_replace($pattern,'',$content);
  
      return $artic;
  
  }
  
  ?>
  
  
  <?php
  
  class mySpClass{
  
      //单例对象
  
      private static $ins = null;
  
      /**
  
       * 单例化对象
  
       */
  
      public static function exec()
  
      {
  
          if (self::$ins) {
  
              return self::$ins;
  
          }
  
          return self::$ins = new self();
  
      }
  
        
  
      /**
  
       * 禁止克隆对象
  
       */
  
      public function __clone()
  
      {
  
          throw new curlException('错误:不能克隆对象');
  
      }
  
      // 向服务器发送最简单的get请求
  
      public static function getCurl($url,$header){
  
          // 1.初始化
  
          $ch = curl_init($url);   //请求的地址
  
          // 2.设置选项
  
          curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//获取的信息以字符串返回,而不是直接输出(必须)  
  
          curl_setopt($ch,CURLOPT_TIMEOUT,10);//超时时间(必须)
  
          curl_setopt($ch, CURLOPT_HEADER,0);//   启用时会将头文件的信息作为数据流输出。  
  
          //参数为1表示输出信息头,为0表示不输出
  
          curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); //不验证证书
  
          curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); //不验证证书
  
          if(!emptyempty($header)){
  
              curl_setopt($ch,CURLOPT_HTTPHEADER,$header);//设置头信息
  
          }
  
          // 3.执行
  
          $res = curl_exec($ch);
  
          // 4.关闭
  
          curl_close($ch);
  
          return $res;
  
      }
  
  }
  
  //curl方法不存在就设置一个curl方法
  
  if (!function_exists('mySpClass')) {
  
      function mySpClass() {
  
          return mySpClass::exec();
  
      }
  
  }
  
  ?>
  以上示例代码的最终运行结果:第几章就输入数字几,通过$_GET['n']传参
 
  程序员还看带广告的小说?
 
  总结:
 
  知识点:curl(tips:curl模块采集任意网页php类),正则,解析工具simple_html_dom
 
  虽然写法已经初步完善,但是最好能过部署的自己的服务器才能有最好的效果,不然只能在电脑观看,也不见得多方便,可能更愿意忍忍广告了。
 
 

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读