遇到的案例是这样的,在http://www.xxx.com/index.html 上有多个pdf的下载连接,不定时会有新的pdf增加(下载链接有变化),现在需要监控网页变化,并下载新增加的文件。
直接使用火车采集器没法完美(至少我还没试出来)完成任务。
1,使用缺省设置,起始网址是 http://www.xxx.com/index.html ,使用“自动获取地址链接”,可以得到pdf文件的链接地址。在第2步“内容采集”的步骤中,会将pdf文件当为常规的html网页进行读取,但无法下载文件。
2,将起始网址作为内容页网址,也就是多级列表为空。这种情况下可以下载文件,但带来一个问题,下载一次后,由于起始网址是固定的,以后再运行这个任务,会被当作重复网址而忽略。如果在第4步“4、其他设置”的“发布相关”中,开启“清空该任务网址库”,可以多次运行本任务了,但同时带来一个更麻烦的问题,已更新的文件也被反复下载,火车采集器中并没有记录下载文件链接地址作为去重的依据。如果下载文件的命名规则使用[原文件名],重复下载的会被覆盖,不考虑流量、时间的情况下,第二种方法已勉强可接受。但下载文件会存在同名的情况(/1/abc.pdf 和 /2/abc.pdf),所以本案例中不适用。
现在想到的解决方案如下,使用手动设置规则获取链接地址,配合http请求、响应修改插件进行处理。
主要步骤如下 :
一、“1,网址采集规则 ”中,“获取内容网址”采用常规模式,获取方式改为“手动设置规则获取”。提取规则 :
<a(*)href="[参数]"(*)>[参数]</a>
拼接地址:
http://www.xxx.com/index.html?xsplit=[参数1]
这样处理的作用是将下载链接接转化为不同的,唯一的“内容网址 ”,下载后会被系统记录,不会重复采集下载。
二、利用插件,生成内容页的内容,并将下载链接包含在其中,这样处理后,在“2、内容采集规则”中可以进行下载。
将插件内容保存到软件安装目录中的plugins中,如p1.php这样。
在“4、其他设置”-“插件”-“http请求、响应修改插件”中选择保存的php程序,如p1.php。
插件代码如下:
<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
/*
*外部编程接口处理标签内容示范文件
*该文件内自动系统的三个参数$LabelArray ,$LabelUrl
*对任意采集的标签都适用请对标签内容处理后直接将该数组serialize($LabelArray)输出,
*采集器内部即可接收到该标签的内容,对比以前的接口规则,新规则可以实现标签之间的数据调用和处理
*参数说明:
*$LabelArray - 标签名及标签内容集合 结构如:Array('栏目id' => 2,'出处'=> '新浪微博','内容'=>'<center><b>暴笑短信') ##
*$LabelUrl - 当前采集的页面的Url地址
*$LabelCookie - 当前采集页面,服务器返回的Cookie信息。
* 特别注意:如果是处理列表页,默认页,多页时会有以下两个标签
$LabelArray['Html'] 网页的源代码,没有经过采集器处理的,直接下载后的数据.修改这里的数据,请将新值赋予$LabelArray['Html']
$LabelArray['PageType'] 值可能为 List, Content ,Pages, Save 分别代表处理列表页,默认页,多页,保存时
*以上语句建议不更改,以下为用户操作区域 该区域只限对数组值进行操作,不得有打印输出产生,不得直接增加或删除相应标签名
*/
if ($LabelArray['PageType'] == "List") {
//空
} else if ($LabelArray['PageType'] == "Content") {
$arr = explode("xsplit=", $LabelUrl);
$url = $arr[1];
$LabelArray["Html"] = "<html><head><title>file download</title></head><body><a href={$url}>fileDownload</a></body></html>";
} else if ($LabelArray['PageType'] == "Save") {
//空
}
//#############以上为用户操作区域#############################################################################################################################
//#############以下语句必须保留,建议不更改###################################################################################################################
//ob_clean();
echo serialize($LabelArray);
?>