Создание файла PHP, который загружает все ссылки с определенного сайта - PullRequest
0 голосов
/ 18 марта 2009

Я недавно установил надстройку «DownThemAll» в свой Firefox и, наблюдая, как он загружает огромное количество файлов pk3 (файлов карт для Shooter от первого лица с открытым исходным кодом), я подумал, можно ли сделать то же самое с PHP.

Вот что я думаю:

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

Да, это примерно, насколько я получил. Мне интересно, стоит ли просто начать загрузку, чтобы сделать это через поток ... Я не очень разбираюсь в этом материале, это не то, что я обычно делаю с PHP, но это вызвало мой интерес.

Так есть кто-нибудь, кто знает, как решить эту проблему?

Ответы [ 4 ]

3 голосов
/ 18 марта 2009

Я брошу вас в правильном направлении.

cURL для загрузки и регулярное выражение для получения всех путей в ссылке.

Осторожно, ссылка на сайт может быть относительной ссылкой. Так что вам нужно проверить это.

1 голос
/ 19 марта 2009

Это сделает это (или поможет хотя бы):

$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;
}
0 голосов
/ 18 марта 2009

Из 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. Анализ этого списка для ссылок ( с использованием регулярного выражения )
  3. Загрузка и запись (fwrite) содержимого каждой ссылки на жесткий диск.

Совет: проверьте документацию php для каждой из этих функций, есть много хороших примеров.

0 голосов
/ 18 марта 2009

Это не тривиальная проблема. Но если у вас есть доступ к команде «system», вы можете использовать wget для выполнения этой задачи. Он предлагает рекурсивные функции загрузки для перехода по ссылкам на всех страницах, и вы можете контролировать глубину, по которой следует переходить по ссылкам, и многое другое. Он также поддерживает аутентификацию и несколько протоколов, включая http и ftp.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...