重大发现,可防火车头采集的神奇网页【请官方回复】
本帖最后由 hiqq 于 2009-6-20 07:07 编辑一朋友让我测试了一宿,始终没能找到采集到内容的办法,无奈,先将测试网页地址发布,寻求高人切磋:
http://www.jianshe23.cn/test.htm
(非伪静态网址,失效时间为2009年6月30日)
测试要求,将<body></body>之间的内容完整提取出来。<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>火车头信息采集测试</title></head><body> 火车头信息采集测试内容</body></html>代码很简单,肉眼看不出问题,请务必用我提供的地址测试,你可能会感觉是件很容易的事情,那你错了,用火车头采集器采集试试!
不要认为我吹牛,一般人搞不定。如果你发现了其中的奥秘,那对于防火车头采集又会有新的认识。
恳请火车头采集器官方作出回应。 搞定~~~~~~ 2# luring
真的么,怎么做的? 本帖最后由 hiqq 于 2009-6-20 07:12 编辑
采用php程序将网页源代码采集过来,截取body里的数据,并查看每个字符的asii编码。
$str =@file_get_contents('http://www.jianshe23.cn/test.htm');
$str&&preg_match_all('/<body>([\s\S]*?)<\/body>/i',$str$m);
$str = $m;
$n = $tn = $n1 = 0;
echo $str.'<br>';
echo '字符|编码<br>';
while($n < strlen($str))
{
$t = ord($str[$n]);
$n1 = $n ;
if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
$tn = 1; $n++; $noc++;
} elseif(194 <= $t && $t <= 223) {
$tn = 2; $n += 2;
} elseif(224 <= $t && $t <= 239) {
$tn = 3; $n += 3;
} elseif(240 <= $t && $t <= 247) {
$tn = 4; $n += 4;
} elseif(248 <= $t && $t <= 251) {
$tn = 5; $n += 5;
} elseif($t == 252 || $t == 253) {
$tn = 6; $n += 6;
} else {
$n++;
}
$tstr = '';
for($i=$n1;$i<$n;$i++){
$tstr .='\\'.ord($str[$i]);
}
echo substr($str, $n1, $tn).'|'.$tstr.'<br>';
}
===输出结果===
火车头信息采集测试内容
字符|编码
|\0
火|\231\129\171
车|\232\189\166
头|\229\164\180
信|\228\191\161
息|\230\129\175
采|\233\135\135
集|\233\155\134
测|\230\181\139
试|\232\175\149
内|\229\134\133
容|\229\174\185
==========
终于找到了一点眉目,内容中藏有null字符,即ascii码值为0的。
但是即使使用正则表达式:<body>(?<content>[\s\S]*?)</body>也还是采集不了!大家都来想想办法吧! 该页面可以采集。
这个功能是提供给收费版用户的.免费版暂时不支持. 收费版是怎么实现的,能说说原理么?
是不是在免费版本里刻意屏蔽了对null字符的采集? 自己写采集程序做中转,可以实现了 写采集程序做中转,好像很复杂啊 楼上的正解 做一个proxy就可以了
页:
[1]