Есть ли способ использовать PHP для сканирования ссылок? - PullRequest
0 голосов
/ 17 сентября 2009

Я хотел бы использовать PHP для сканирования имеющегося у нас документа, содержащего около 6 или 7 тысяч ссылок href. Нам нужно то, что находится на другой стороне ссылки, а это означает, что PHP должен будет переходить по каждой ссылке и захватывать содержимое ссылки. Можно ли это сделать?

Спасибо

Ответы [ 6 ]

1 голос
/ 17 сентября 2009

Конечно, просто возьмите содержимое вашего начального URL с помощью функции наподобие file_get_contents (http://nl.php.net/file_get_contents), Найдите URL-адреса в содержимом этой страницы с помощью регулярного выражения, возьмите содержимое этих URL-адресов и т.д.

Regexp будет выглядеть примерно так:

$regexUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
0 голосов
/ 30 августа 2012

Вы можете попробовать следующее. См. эту тему для более подробной информации

<?php
//set_time_limit (0);
function crawl_page($url, $depth = 5){
$seen = array();
if(($depth == 0) or (in_array($url, $seen))){
    return;
}   
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
$result = curl_exec ($ch);
curl_close ($ch);
if( $result ){
    $stripped_file = strip_tags($result, "<a>");
    preg_match_all("/<a[\s]+[^>]*?href[\s]?=[\s\"\']+"."(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/", $stripped_file, $matches, PREG_SET_ORDER ); 
    foreach($matches as $match){
        $href = $match[1];
            if (0 !== strpos($href, 'http')) {
                $path = '/' . ltrim($href, '/');
                if (extension_loaded('http')) {
                    $href = http_build_url($url, array('path' => $path));
                } else {
                    $parts = parse_url($url);
                    $href = $parts['scheme'] . '://';
                    if (isset($parts['user']) && isset($parts['pass'])) {
                        $href .= $parts['user'] . ':' . $parts['pass'] . '@';
                    }
                    $href .= $parts['host'];
                    if (isset($parts['port'])) {
                        $href .= ':' . $parts['port'];
                    }
                    $href .= $path;
                }
            }
            crawl_page($href, $depth - 1);
        }
}   
echo "Crawled {$href}";
}   
crawl_page("http://www.sitename.com/",3);
?>
0 голосов
/ 17 сентября 2009

В библиотеке PHP Snoopy есть множество встроенных функций, позволяющих выполнить именно то, что вы ищете.

http://sourceforge.net/projects/snoopy/

Вы можете загрузить саму страницу с помощью Snoopy, затем она имеет другую функцию для извлечения всех URL-адресов на этой странице. Он даже исправит ссылки на полноценные URI (т. Е. Они не просто относятся к домену / каталогу, на котором находится страница).

0 голосов
/ 17 сентября 2009

Я предлагаю вам взять HTML-документ с 6000 URL-адресов, разобрать их и просмотреть список, который у вас есть. В вашем цикле получите содержимое текущего URL с помощью file_get_contents (для этого вам не нужен cURL, когда file_get_contents включен на вашем сервере), снова проанализируйте содержащиеся URL и т. Д.

будет выглядеть примерно так:

<?php
function getUrls($url) {
    $doc = file_get_contents($url);
    $pattern = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
    preg_match_all($pattern, $doc, $urls);
    return $urls;
}

$urls = getUrls("your_6k_file.html"); 
foreach($urls as $url) {
    $moreUrls = getUrls($url); 
    //do something with moreUrls
}
?>
0 голосов
/ 17 сентября 2009

После того, как вы соберете ссылки, вы можете использовать curl или file_get_contents (хотя в безопасной среде file_get_contents не должен позволять проходить по протоколу http)

0 голосов
/ 17 сентября 2009

У меня просто есть таблица SQL всех ссылок, которые я нашел, и были ли они проанализированы или нет.

Затем я использую Простой HTML DOM для анализа самой старой добавленной страницы, хотя, поскольку она имеет тенденцию исчерпывать память большими страницами (500 КБ + HTML), я использую регулярное выражение для некоторых из них *. Для каждой ссылки, которую я нахожу, я добавляю ее в базу данных SQL как нуждающуюся в анализе и в то время, когда я ее нашел.

База данных SQL предотвращает потерю данных при ошибке, и, поскольку у меня более 100 000 ссылок для анализа, я делаю это в течение длительного периода времени.

Я не уверен, но вы проверили useragent для file_get_contents ()? Если это не ваши страницы, и вы делаете тысячи запросов, вы можете изменить пользовательский агент, либо написав свой собственный HTTP-загрузчик, либо используя один из библиотеки (я использую один в Zend Framework), но cURL и т. Д. отлично работает Если вы используете пользовательский пользовательский агент, он позволяет администратору просматривать журналы, чтобы увидеть информацию о вашем боте. (Я склонен указывать причину, по которой я ползаю, и контакт в моем).

* Регулярное выражение, которое я использую:

'/<a[^>]+href="([^"]+)"[^"]*>/is'

Лучшее решение (от Гамбо) может быть:

'/<a\s+(?:[^"'>]+|"[^"]*"|'[^']*')*href=("[^"]+"|'[^']+'|[^<>\s]+)/i'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...