用php写ftp爬虫

10 篇文章 0 订阅

今年选修了《英语电影赏析》,老师超级认真负责,课下作业简直******平均每天都要我们看一部电影,而且大部分都是那种狠文艺的7,80年前的,根本看不下去不说,网上还找不到。还好学习有个电影的ftp服务器,资源不少,就是分类比较乱,一个一个文件架找很麻烦,所以写了个小爬虫把资源全都弄下来,包括路径和文件名,以后就方便多了。

php有专门的ftp操做类,网上一搜一大把。基本的写在注释上面

记录下我这次遇到的几个问题:

1,获取目录名

之前都是用ftp_nlist()函数,但是目前的php改了,ftp_nlist()函数只列出文件,不列文件架名字。只能用ftp_rawlist(),这个就很详细,就像ls -al命令。所以用正则表达式把无关信息去掉,只留名字。这个不能判断文件名中有空格,空格前还是纯数字这种奇葩,o(︶︿︶)o 唉,也就我们学校能出现这种命名了。

preg_replace("/.+:*\\d+\\s/", "", $filename);
2,校内网匿名访问

用户名Anonymous,密码空。如果连不上可能需要该链接方式。


3,测试过程中可能指定文件路径,中文可能找不到,这时试试utf-8,  gbk,  ansi编码

4,在虚拟机xp上搭建ftp服务器测试,ip地址别写错了,囧~

5,php运行时间,我们学校服务器东西还真不少,各种乱七八糟的视频,默认30秒根本不够用,临时改变php执行时间,set_time_limit(0);//不限时


最后跑出来443kb的文本,汗~

贴代码:

</pre><span style="white-space:pre">	</span><pre name="code" class="php">	<?php
      set_time_limit(0);//默认30秒根本不够用好吗,让他不限时随便跑。
    $con = ftp_connect("192.168.56.11");<span style="white-space:pre">		</span>//建立ftp连接,tcp三次握手
    $login = ftp_login($con, "duola", "你的密码");<span style="white-space:pre">	</span>//帐号密码登录
    $myfile=fopen("result.txt","w");<span style="white-space:pre">		</span>//存放结果的txt

    $queue = array("/");     //存放目录的队列<span style="white-space:pre">	</span>//开始的根目录

    while(!empty($queue)){    <span style="white-space:pre">			</span>//还有未遍历目录
        $list_now = array_shift($queue);<span style="white-space:pre">	</span>//从队列里拿到本次循环要处理的目录
        ftp_chdir($con, $list_now);<span style="white-space:pre">		</span>//改变当前目录
        $filelist = ftp_rawlist($con, $list_now);<span style="white-space:pre">	</span>//拿到本目录的内容

        $name = preg_replace("/.+:*\\d+\\s/", "", $filelist[2]);<span style="white-space:pre">	</span>//第一个文件或目录名字
        if(count($filelist) == 3 && ftp_size($con, $name) != -1){
            //只有一个电影,目录名字即为电影名<span style="white-space:pre">		</span>//这里是因为我们学校的电影大都是放到电影名的文件架下,而电影名是一堆乱码,所以这时记录目录名字
            fwrite($myfile, $list_now."\r\n");   
        }else{
            foreach($filelist as $file)<span style="white-space:pre">			</span>//合集文件架,下面好多电影,这时正常记录文件名
            {
                $filename = preg_replace("/.+:*\\d+\\s/", "", $file);
                   if(ftp_size($con, $filename) == -1){
                       <span style="white-space:pre">						</span>//发现目录 ,存到队列里,以后继续遍历,但不能使.(当前目录)  ..(父目录)
                       if($filename != "." && $filename != ".."){
                           array_push($queue, $list_now."/".$filename);
                           //echo "<br>\ndocument:".$list_now."/".$filename;
                       }
                   }
                else{ //合集里的电影
                       fwrite($myfile, $list_now."/".$filename."\r\n");
                   }
            }
        }

    }
    fclose($myfile);
    ftp_close($con);

?>

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值