Snoopy无疑是我使用过的最强大的采集类,本博也做过一些简单的入门介绍。
近日,我完成了数个基于Snoopy的程序,如批量下载百度文档附件、论坛附件下载、本地文件批量上传,已经能比较熟练的使用此类。加上本博主要是做采集程序研究的,那么,有必要将Snoopy的一些高级功能拿出来晒晒,照顾下新人。那今天要演示的一个功能是,Snoopy模拟用户登陆论坛并下载附件,并上传到网盘的一个实例。
通过本例,我们要取得附件上传到网盘以后,返回附件在网盘的下载链接。这个功能,可以和火车采集器无缝结合,实现火车采集器文章、Snoopy下载附件并按自定义目录保存、附件同步上传的效果。
首先讲一下模拟用户登陆需要使用到的几个重要数据。
- 模拟一个浏览器,如Firefox 3.5,即User-agent;
- 登陆论坛的Cookie值;
- 一个referer,即来源页地址;
这些数据可以通过抓包工具获取,如何使用抓包工具,请看一下这里:http://www.4wei.cn/?p=1000446。
需要注意的是,这里的User-agent和Cookie要同步,即同时通过抓包工具获取的;这里的referer也很重要,一般的防盗链措施均是通过referer来判断的。但如果对方网站不是很变态,一般只需要一个对方的网站域名就够了。
下面开始今天的代码。
require_once ‘Snoopy.class.php‘; $snoopy = new Snoopy(); $snoopy->referer = ‘http://www.4wei.cn‘; $snoopy->strcookies = $COOKIE; $snoopy->agent = $agent; $snoopy->fetch($URI);
以上的代码建立了一个基本的采集过程,如果你的cookie和user-agent填写正确的话,那么基本上可以确定,你已经成功登陆论坛了,你可以通过以下方式查看到采集到的数据。
echo $snoopy->results; //或者 print_r($snoopy);
突然觉得此文必火,那在这里插入一段版权链接,转摘着勿删。欢迎大家收看使用Snoopy下载论坛附件,并上传到网盘的实例。下面继续将我们获取的数据。
如果我们刚才成功采集了一条附件下载链接,那么我们可以在返回的数据中找到附件的名称。
//读取转向的附件地址 echo $snoopy->lastredirectaddr; //或者从头文件中读取中文件名称 print_r(join("\n", $snoopy->headers));
发现附件以后,我们把文件保存起来,这个过程比较简单,一句话代过。
//将内容保存为一个本地文件 $savefile = SaveFile(basename($snoopy->lastredirectaddr), $snoopy->results);
这里就算已经完成了附件的下载操作。接下来做文件上传的演示,代码注释十分清楚。
//重新初始化 $snoopy = new Snoopy(); //设置模拟提交的类型为 ‘multipart/form-data‘,知道为什么不。 $snoopy->set_submit_multipart(); //或者手工指定发布类型 //$snoopy->_submit_method = ‘multipart/form-data‘; //要提交的程序路径,即Form的action地址,决对路径 $URI = ‘http://www.rmdown.com/upload.php‘; //模拟提交时的一些参数,多个参数可以用数据保存 $formvars[‘upload‘] = ‘php‘; //将要上传的文件加入队列中,多个文件可以使用数组保存,这里的file是文件上传表单的name $formfiles[‘file‘] = ‘./uploads/xxoo.rar‘; //执行模拟提交 $snoopy->submit($URI, $formvars, $formfiles);
如果成功上传附件,则会返回一个带参数的下载地址,那我们通过正则匹配出新的网盘下载地址即可。