用php实现一个简单的爬虫,抓取电影网站的视频下载地址

  • 1,716

昨天没什么事,先看一下电影,就用php写了一个爬虫在视频网站上进行视频下载地址的抓取,半个多小时,大约抓取了3万多条ftp地址数据,效果还是可以的。这里总结一下抓取过程中遇到的问题。

用php实现一个简单的爬虫,抓取电影网站的视频下载地址

1:通过访问浏览器来执行php脚本这种访问方式其实并不适合用来爬网页,因为要受到php的连接时间,内存等的限制,当然了这里是可以修改php.ini的配置文件,但是还是不推荐使用,

php做长周期的任务的时候推荐使用php-cli(命令行)的方式进行,这样效率相比web访问的效率要高得多的多

2:在爬取页面的时候,一开始使用的是file_get_contents()的方式,结果执行一段时间以后php就会报错(failed to open stream: No error ),后来查了一下,有人说curl()函数不会出现上述问题,就采用了curl的方式去采集数据,没有问题

3:在进行采集之前,最好修改一下php.ini中的参数 user_agent(具体请百度)

下面是抓取的代码:

  1. <?php
  2. header( "Content-type:text/html;Charset=utf-8" );
  3. class Get_info{
  4.      //没有爬过的url
  5.      private $url_arr_no = [ ];
  6.      //已经爬过的url
  7.      private $url_arr_over = [ ];
  8.      //获取url的正则表达式
  9.      private $url_reg ="/<a href=['\"](.*?)['\"].*?>(.*?)<\/a>/i";
  10.      //获取ftp地址的正则表达式
  11.      private $ftp_reg = "/<td[\d\D]*?><a href=\"([\d\D]*?)\">[\d\D]*?<\/a><\/td>/i";
  12.      //url前缀
  13.      private $prefix_url = null;
  14.      //查找到的数据
  15.      public $ftp_result = [ ];
  16.      public function __construct( $url = "" ){
  17.             ifemptyempty$url ) ){
  18.                     echo "url不能为空";
  19.                     return false;
  20.             }
  21.             $this ->url_arr_no[ ] = $url;
  22.             $this ->prefix_url = $url;
  23.      }
  24.      //开始执行
  25.      public function start( ){
  26.         echo "查找开始<br/>";
  27.              $ch = curl_init( );
  28.              curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 );
  29.              curl_setopt ( $ch , CURLOPT_CONNECTTIMEOUT ,10 );
  30.         while( ! emptyempty$this ->url_arr_no ) ){
  31.               //foreach ( $this->url_arr_no as $key => $value ) {  
  32.                      $value = array_shift$this->url_arr_no );
  33.                           ifsubstr$value, 0,8 )  == "/webPlay"){
  34.                                       continue;
  35.                           }
  36.                  if( ! in_array( $value , $this->url_arr_over ) ){ //如果需要查找的url没有爬过,就开始爬
  37.                                      curl_setopt ($ch, CURLOPT_URL, $value );
  38.                                      $content = curl_exec($ch);
  39.                                       //利用正则进行解析页面内容
  40.                                       preg_match_all( $this->url_reg, $content , $url_match );
  41.                                       preg_match_all( $this->ftp_reg, $content , $ftp_match );
  42.                              //如果新查到的url已经在待查询或者已经查询的数组中存在,就不添加
  43.                              if( ! emptyempty$url_match[1] ) ){
  44.                                       foreach$url_match[1] as $url ){
  45.                                                    if( ! in_array( $url$this->url_arr_no ) && ! in_array( $url,$this->url_arr_over )){
  46.                                                           $this ->url_arr_no[ ] = $this ->prefix_url.$url;
  47.                                           }
  48.                                       }
  49.                              }
  50.                               //如果ftp地址已经存在,就不进行存储
  51.                               if( ! emptyempty$ftp_match[1] ) ){
  52.                                     foreach$ftp_match[1] as $ftp ){
  53.                                           if( ! in_array( $ftp$this->ftp_result ) ){
  54.                                                  $this ->ftp_result[ ] = $ftp;
  55.                                                  file_put_contents("result.txt" , $ftp."\r\n" , FILE_APPEND);
  56.                                           }
  57.                                     }
  58.                               }
  59.                              $this ->url_arr_over[ ] = $value;
  60.                              $key_arr = array_keys$this->url_arr_no,$value );
  61.                              if( ! emptyempty$key_arr ) ){
  62.                                      foreach$key_arr as $k => $v ){
  63.                                         unset( $this->url_arr_no[ $v ] );
  64.                                      }
  65.                              }
  66.                  }
  67.           //}
  68.         }
  69.              echo "查找完毕";
  70.      }
  71. }
  72. $url = "";
  73. $class = new Get_info( $url );
  74. $class -> start( );
  75.  ?>

 

weinxin
我的微信
这是我的微信扫一扫
开拓者博主
  • 本文由 发表于 2016年11月17日08:23:08
  • 转载请务必保留本文链接:https://www.150643.com/408.html
匿名

发表评论

匿名网友 填写信息

评论:5   其中:访客  5   博主  0
    • 天下彩 天下彩 1

      谢谢分享,学习了

        • 开拓者博主 开拓者博主

          @ 天下彩 谢谢来访!

        • 天下彩 天下彩 1

          谢谢分享哦,学习了

          • 乐赚168 乐赚168 3

            感谢分享

              • 开拓者博主 开拓者博主

                @ 乐赚168 感谢来访!