创建一个PHP文件,从某个站点下载所有链接

时间:2009-03-18 18:49:40

标签: php download stream

我最近在我的firefox中安装了附加的“DownThemAll”,当我看到它下载了大量的pk3文件(开源第一人称射击游戏的地图文件)时,我想知道我是否可以用PHP做同样的事情。

这就是我的想法:

foreach(glob("http://www.someaddress.ext/path/*.pk3") as $link) {
  //do something to download...
}

是的,就我所知道的那样。我想知道只是通过一个流开始下载...我真的不知道我的方式,这不是我通常用PHP做的,但它引起了我的兴趣。

那么有谁知道如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

我会把你推向正确的方向。

cURL用于下载和正则表达式以获取链接中的所有路径。

请注意,网站上的链接可以是相对链接。所以你需要检查一下。

答案 1 :(得分:1)

这样做(或至少帮助):

$pageRaw = fread_url('www.example.com');

//link extraction regex        
preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
                "(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/",
                $pageRaw, &$matches);

$matches = $matches[1];

foreach($matches as $link)
{    
    echo $link. '<br />';
}

//falls back to fopen if curl is not there
function fread_url($url,$ref="")
{
    if(function_exists("curl_init")){
        $ch = curl_init();
        $user_agent = "Mozilla/4.0 (compatible; MSIE 5.01; ".
                      "Windows NT 5.0)";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
        curl_setopt( $ch, CURLOPT_HTTPGET, 1 );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
        curl_setopt( $ch, CURLOPT_FOLLOWLOCATION , 1 );
        curl_setopt( $ch, CURLOPT_FOLLOWLOCATION , 1 );
        curl_setopt( $ch, CURLOPT_URL, $url );
        curl_setopt( $ch, CURLOPT_REFERER, $ref );
        curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
        $html = curl_exec($ch);
        curl_close($ch);
    }
    else{
        $hfile = fopen($url,"r");
        if($hfile){
            while(!feof($hfile)){
                $html.=fgets($hfile,1024);
            }
        }
    }
    return $html;
}

答案 2 :(得分:0)

这不是一个小问题。但是,如果您可以访问“system”命令,则可以使用wget来完成此任务。它提供递归下载功能,以跟踪整个页面中的链接,您可以控制它应该跟随链接的深度等等。它还支持身份验证和几种协议,包括http和ftp。

答案 3 :(得分:0)

来自php fread docs:

// For PHP 5 and up
$handle = fopen("http://www.example.com/", "rb");
$contents = stream_get_contents($handle);
fclose($handle);

或者您可以使用:

$aaa = file_get_contents('http://www.example.com/');

所以:

  1. 下载包含链接列表的页面
  2. 解析链接列表(using regex
  3. 下载并写入(fwrite)每个链接的内容到HDD。
  4. 提示:检查每个函数的php文档,有很多很好的例子。