Использование cURL для получения всех ссылок на сайте (не только на странице) - PullRequest
4 голосов
/ 11 августа 2011

Я использую следующий скрипт PHP, чтобы получить все ссылки на данной странице, но я пытаюсь получить все ссылки на веб-сайте в целом.

<?php

    function urlLooper($url){

        $urlArray = array();

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($ch);

        $regex='|<a.*?href="(.*?)"|';
        preg_match_all($regex,$result,$parts);
        $links=$parts[1];
        foreach($links as $link){
            array_push($urlArray, $link);
        }
        curl_close($ch);

        foreach($urlArray as $value){
            echo $value . '<br />';
        }
    }

    $url = 'http://www.justfundraising.com/';
    urlLooper($url);

?>

Есть ли способ использовать cURL (или откровенно любой другой метод), чтобы получить все ссылки на веб-сайте?У меня есть доступ к серверу, если вам интересно.

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

Любая помощь будет оценена!

Ответы [ 3 ]

3 голосов
/ 13 августа 2011

Как упомянуто выше @mario, возможно, обратите внимание на использование phpQuery (http://code.google.com/p/phpquery/). После того, как вы скачали библиотеку и включили ее на своей странице, ниже приведен пример кода, показывающего, как вы можете получить массив, содержащий все ссылкииз строки, которую вы ей передаете (я только что жестко закодировал строку в функции newDocument в качестве примера):

<code>$links = phpQuery::newDocument('<a href="test1.html">Test 1</a><a href="test2.html">Test 2</a><a href="test3.html">Test 3</a>')->find('a');
$array_links = array();
foreach($links as $r) {
    $array_links[] = pq($r)->attr('href');
}
die("<pre>".print_r($array_links,true)."
");

Код выше вернет:

Array
(
    [0] => test1.html
    [1] => test2.html
    [2] => test3.html
)

Надеюсь, это поможет.

1 голос
/ 15 августа 2011

Я пытался сделать то же самое, используя simplehtmldom. но код рухнул через некоторое время. на самом деле я пытался использовать метод DFS здесь, который может переполнить стек в одной точке.

Вы можете проверить этот метод, используя cURL

вот мой код:

<?php
traverse($home,0);

function traverse($url,$depth)
{
if($depth>1)return;
$html = file_get_html($url);
foreach($html->find('a') as $element)
{
    $nurl = $element->href;
    echo $nurl."<br>";
    traverse($nurl,$depth+1);

}
}
?>
1 голос
/ 11 августа 2011

curl выбирает только то, что вы говорите. Он не будет анализировать контент для вас и не будет рекурсивно извлекать «внешние» ресурсы, на которые ссылается контент. Вы должны будете сами покопаться в возвращенном HTML, разобрать ссылки на изображения / сценарии и использовать дополнительные вызовы curl для их получения.

Другими словами, вам придется копировать wget, что сводится к следующему: просто используйте wget .

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