keyWord=$keyWord;
$this->saveFile=$saveFile;
$this->minSize=$minSize;
$this->page=$pageRange[0];
$this->maxPage=$pageRange[1];
}
public function run(){
while($this->flag && $this->maxPage>$this->page){
$this->timestamp=$this->microtimeFloat();
$this->_execute();
$this->page++;
$this->_notice();
}
}
/**
* 执行
*/
protected function _execute(){
$this->_getUrl();
$this->_getHtmlPage();
$this->_parseHtml();
if($this->_currentMagnetCount){//当有磁力链接时保存
$this->_save();
}
}
public function microtimeFloat(){
list($usec, $sec) = explode(" ", microtime());
return sprintf('%01.2f',(float)$usec + (float)$sec);
}
/**
* 通知
*/
protected function _notice(){
$currentTime = $this->microtimeFloat();
$useTime =sprintf('%01.2f', $currentTime-$this->timestamp);
$this->timestamp = $currentTime;
echo '第'.$this->page.'页存储了'.$this->_currentMagnetCount.'个磁力链接,耗时'.$useTime."秒\r\n";
if(!($this->flag && $this->maxPage>$this->page)){
echo '总共存储了'.$this->_magnetCount.'个磁力链接'."\r\n";
}
}
/**
* 设置url
*/
protected function _getUrl(){
$this->_url = $this->host.'search?q='.rawurlencode($this->keyWord).'&p='.$this->page;
}
/**
* 获得html文件内容
*/
protected function _getHtmlPage(){
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_TIMEOUT,$this->timeout);
curl_setopt($ch, CURLOPT_URL, $this->_url);
curl_setopt($ch, CURLOPT_SSLVERSION,3);
$result = curl_exec($ch);
if($result === false){
//echo 'Curl error: '. curl_errno($ch) .' : '. curl_error($ch);
$opts = array(
'https'=>array(
'method'=>"GET",
'timeout'=>$this->timeout,//单位秒
)
);
$context = stream_context_create($opts);
$this->_html = @file_get_contents($this->_url,false,$context);
}else{
$this->_html = $result;
}
curl_close($ch);
}
/**
* 抓取磁力链接
*/
protected function _parseHtml(){
preg_match_all('/href="(magnet\:\?xt=urn\:btih\:.+?)"/',$this->_html,$magnet);
preg_match_all('/attr_val">(\d+?\.?\d*? [G|M|K]B)/',$this->_html,$size);
if(empty($size[1])){
$this->flag=false;//当获取磁力链接时不到时,停止翻页
}
foreach($size[1] as $key=>$val){
if($this->_compareSize($val)){
$this->_magnet[]=$magnet[1][$key];
}
}
$this->_currentMagnetCount = count($this->_magnet);
$this->_magnetCount += count($this->_magnet);
}
/**
* 比较磁力链接文件的大小
*/
protected function _compareSize($size){
$number = substr($size,0,strpos($size,' '));
$unit = substr($size,strpos($size,' ')+6);
$n='';
switch($unit){
case 'GB':
$n=1;
break;
case 'MB':
$n=1024;
break;
case 'KB':
$n=1048576;
break;
default :
$n=false;
}
if($n===false){
try {
throw new Exception("文件大小单位识别失败\n");
} catch (Exception $e) {
echo $e->getMessage();
return false;
}
}
return ( $this->minSize < ($number/$n) );
}
/**
* 把磁力链接保存到文件中
*/
protected function _save(){
$data = '';
foreach($this->_magnet as $val){
$data .= $val."\n";
$this->magnetNum++;
if(0==$this->magnetNum%15)
$data.="\n\n";
}
file_put_contents($this->saveFile,$data,FILE_APPEND);
$this->_magnet=array();
}
}
//示例
$s = new Magnet('LOL','',2,array(0,10));
$s->run();