继续顶起来
http://bbs.phpchina.com/viewthre ... %3D2&sid=JAlyyi
PHP代码:
/*
* 作用:采集思路。
* 目标:优酷视讯.
* date:2008-12-28
* autor:Yuan
* charset:UTF-8
*/
HEADER("CONTENT-TYPE:TEXT/HTML; CHARSET=UTF-8");
set_time_limit(0);
//实现有效连接
function get_url_content($Url,$Method = 'c') {
//引入需要的语言编码.如果没有, 就会默认为utf-8,不必担心.
global $Charset;
$Urlarr = parse_url($Url);
//如果检测不出域名,就返回.
if (!isset($Urlarr['host'])) {
return false;
}
//我们用智能方式定义header头倍信息.
foreach (@getallheaders() as $key => $val){
$key==='Host' && $val = $Urlarr['host'];
$key==='Referer' && $val ='http://'.$Urlarr['host'];
$str .= "'$key
val', \n";
}
//虚拟来路.
!eregi('Referer',$str) && $str .="'Referer:http://{$Urlarr['host']}', \n";
//经过修正, 基本上, 来路也是那个站, 主机也是Url站点.
$Header = array(trim($str));
//下面仅仅是选择用哪个程序来采集.
if($Method === 'f'&&function_exists('file_get_contents')) {
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>$Header,
)
);
$cxContext = stream_context_create($opts);
$file_contents = @file_get_contents($Url, false, $cxContext);
} elseif ($Method === 'c'&&function_exists('curl_init')) {
$Ch = curl_init();
$Timeout = 5;
curl_setopt($Ch,CURLOPT_HTTPHEADER,$Header);
curl_setopt ($Ch, CURLOPT_URL, $Url);
curl_setopt ($Ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt ($Ch, CURLOPT_CONNECTTIMEOUT, $Timeout);
$file_contents = curl_exec($Ch);
curl_close($Ch);
}
//为了让样式显示得漂亮,我们给它加一句目标引向.
$file_contents = str_replace('',"\n",$file_contents);
//处理最常见的几种编码, 如果目标网站没有编码, 就默认为GBK
!preg_match('/charset=([^<>"]*)"/isU',$file_contents,$lang) && $lang[1]='GBK';
function_exists('mb_convert_encoding') && $file_contents = mb_convert_encoding($file_contents,empty($Charset)?'UTF-8'
Charset,$lang[1]);
//注销部分代码;
unset($Url,$lang,$Timeout,$Urlarr,$Charset);
return $file_contents;
}
//清除部分无用的内容.
function clert($mess)
{
if($mess == '')
return false;
$mess = preg_replace(array('//isU','//isU','//isU','//isU'),'',$mess);
$mess = preg_replace(array('/&.*;/iU','/
$mess = str_replace('该会员更多专辑','<>',$mess);
return $mess;
}
// 不要被上面的函数吓怕, sonny有着20多个文件呢, 相比之下,这个简约多了.
// 现在我们开始吧.
/* 分晰一下它的专辑播放.
fo.addVariable("VideoIDS",10332116); //如果是专辑就有专辑ID
fo.addVariable("Version","/v1.0.0375"); //播放器的版本,基本可以无视.
fo.addVariable("isAutoPlay",true); //是否连续播放,即全部播放
fo.addVariable("Type","Folder"); //类型
fo.addVariable("Fid","2072974"); //单视屏ID 有可能是介绍.
fo.addVariable("
t","0"); //专辑的第几个,顺序上扬.
fo.addVariable("Ob","1"); //这个应该是自动播放.
"/v/playlistsummary/vid/"+vid+"/f/"+fid+"/o/"+ob+"/p/"+pt //往这里面一靠.
http://player.youku.com/player.p ... XMzc3ODMyNDA=/v.swf //也可以带成这样..
*/
//我们测试一个专辑页:
$url = 'http://www.youku.com/playlist_show/id_2812055_ascending_1_page_1.html';
$file = get_url_content($url);
//清除掉JS, 防止它自动报错.
$file = clert($file);
//让meta信息抓出来. $str数组将装载所有内容.
$str = get_meta_tags($url);
//抓取标题
preg_match('/
([^-<>]+) - 专辑 - 优酷视频/isU',$file,$t);$str['title'] = $t[1];
//部分人士需要类别的.我们也抓出来
preg_match('/charset="[0-9]{3}-[0-9]{3}-[0-9]{3}">([^<>]*)/isU',$file,$s);
$str['fl'] = $s[1];
//视频个数
preg_match('/([0-9]+)/isU',$file,$n);
$str['num'] = $n[1];
//视频总播放时间.
preg_match('/([0-9]+:[0-9]+:[0-9]+)/isU',$file,$n2);
$str['time'] = $n2[1];
//获得重要内容.这是一个很有意思的思维组.
preg_match('/
$mess = preg_replace('/
/*
$str['num']记录着一个专辑的所有个数, 它的一页是显示20,所以我们来一句ceil($str['num']/20)结果是3;
为了快速,我们就把第一页给放弃,直接从2开始.循环到结束.
操作的内容就比较少了, 清除及抓取有内的位置即可, 全部合并起来,组成新的内容体.
少过20页,php都会完美执行.不用担心超时.
*/
for ($a=2;$a<=ceil($str['num']/20);$a++)
{
$url = preg_replace('/_[0-9]+.html/isU',"_$a.html",$url);
$file = clert(get_url_content($url));
preg_match('/
$mess .= preg_replace('/
unset($file,$l);
}
//测试, 印出所有内容 echo $mess;
$file = $mess;
//抓取所有图片
preg_match_all('/src="(http:\/\/vimg[0-9]{1,2}.youku.com\/[a-z-0-9]+)"/isU',$file,$img);unset($img[0]);
$str['img']=$img[1];
preg_match_all('/charset="[0-9]+-[0-9]+-[0-9]+-[0-9]+">([^<>]+)/isU',$file,$title);unset($title[0]);
$str['tite']=$title[1];
//抓取所有视频播放信息
preg_match_all('/
.*v_playlist\/([0-9a-z]+).html/isU',$file,$vtie);unset($vtie[0]);
$str['vtie']=$vtie[1];
//如果单独播放,用这个.
//preg_match_all('/id="
layListFlag_([^<>"]+)"/isU',$file,$vtie);unset($vtie[0]);
//跑到最后, 就产生一个完美而且强大的数组.
print_r($str);
?>
一步一步教你采集..如果你认真, 会发for是有问题..URL将专辑ID定死了.循环起来肯定是采集不全,或者不正确.
为此我们改用正则来替换.
复制PHP内容到剪贴板
PHP代码:
for ($a=2;$a<=ceil($str['num']/20);$a++)
{
$url = preg_replace('/_[0-9]+.html/isU',"_$a.html",$url);
$file = clert(get_url_content($url));
preg_match('/
$mess .= preg_replace('/
unset($file,$l);
}
还有一个要注意: set_time_limit(0); 这一句, 无论如何,建议你加上..