2013-04-07 2 views
0

Я построил простой веб-гусеничный элемент, который содержит содержимое страницы после <body>. Это прекрасно, единственная проблема заключается в том, что он не следует ссылкам на странице, чтобы перейти на другие страницы, которые он рекурсивно сканирует.Web Crawler не соответствует ссылкам на странице

На выходе я вижу только содержимое страницы, которое было вручную указано для запуска искателя, и никаких признаков того, что он следит за ссылками.

Как я могу заставить его следить за ссылками, сканировать эти страницы и эхом их содержание?

Вот код:

<?php 
error_reporting(E_ERROR); 

define("CRAWL_LIMIT_PER_DOMAIN", 50); 

$domains = array(); 

$urls = array(); 

function crawl($url) 
{ 
    global $domains, $urls; 
    $parse = parse_url($url); 
    $domains[ $parse['host'] ]++; 
    $urls[] = $url; 

    $content = file_get_contents($url); 
    if ($content === FALSE){ 
     return; 
    } 

    $content = stristr($content, "<body>"); 
    preg_match_all('/http:\/\/[^ "\']+/', $content, $matches); 

    // do something with content. 
    echo strip_tags($content); 

    foreach($matches[0] as $crawled_url) { 
     $parse = parse_url($crawled_url); 
     if (count($domains[ $parse['host'] ]) < CRAWL_LIMIT_PER_DOMAIN && !in_array( $crawled_url, $urls)) { 
      sleep(1); 
      crawl($crawled_url); 
     } 
    } 
} 

crawl('http://the-irf.com/hello/hello6.html'); 
?> 

Update: Я предполагаю, что есть что-то не так с регулярным выражением (/ HTTP: // [^ «\ '] + /). Как я могу осуществлять регулярное выражение, которое следует все HREF ими всех якорей начинаются ли они с

http:// 
http:/www. 
www. 
https:// 
https://www. 

или что-нибудь еще (например, как абсолютный путь файла-как index.html)? или есть лучший способ сделать это, что регулярное выражение ?

+0

Значит, ваше регулярное выражение не работает? – kero

+1

Даже не сказал, что регулярное выражение слишком далеко, однако ссылки не должны начинаться с 'http:' вообще. Вы знаете, что такое базовый URI в HTML? – hakre

+1

Использование: http://simplehtmldom.sourceforge.net/ – user956584

ответ

1

Вы должны (как ususal) прежде всего составить себе решение, что вы на самом деле делаете.

Как вы начертите в своем вопросе, вы выполняете текстовый поиск шаблонов URL-адресов протокола HTTP. Обычным регулярное выражение обычно включает в себя схему https: URI, а также:

~https?://\S*~ 

Это все до первого whitepspace. это обычно выполняет работу по обнаружению URL-адресов HTTP более широкого диапазона внутри строки. Если вам нужно что-то более продвинутое увидеть Stackover Q & А о том, чтобы ссылки текстов Clickable:

Это еще не решит всех ваших проблем колесным. По двум причинам:

  1. Кодировка символов. Если вы хотите правильно это сделать, вам необходимо знать правильную кодировку символов для строки и сделать для нее регулярное выражение.
  2. То есть текст. Веб-сайты не только состоят из текста, но и HTML, который имеет свою собственную семантику.

Так что на самом деле сделать только текстовый анализ недостаточно. Вам также нужно проанализировать HTML. Это означает, что вам нужно взять базовый URI и разрешить друг другу URI внутри документа против него, чтобы получить список всех абсолютных ссылок в этом документе.

Вы найдете это описано в следующем техническом документе:

Для PHP две наиболее стабильные компоненты для работы с этого являются:

  1. DOMDocument - A Расширение PHP для анализа XML и HTML-документов. Здесь вы, естественно, ищете парсинг HTML-документов.
  2. Net_Url2 - Расширение PEAR для обработки URL-адресов, включая RFC3986, с соответствующим эталонным разрешением (отличия от предыдущей версии, которую вы можете спокойно игнорировать, стандарт довольно стабилен, как и библиотека PHP, две незначительные ошибки в очень узких и конкретных случаях все еще открыты, но имеют патчи).
+0

Итак, давайте посмотрим, правильно ли вы правильно поняли: '~ https?: // \ S * ~' недостаточно хорош, поскольку он работает только для ссылок https: //, а не тех, которые начинаются с http: // или www или абсолютные пути к файлам, такие как index.html. Затем '! (https?: // [^ \ s] +)!' не работает либо потому, что отсутствует кодировка содержимого и из-за семантики HTML. Что нужно сделать, так это разобрать html, один из способов - с DOMDocument. – IMUXIxD

+0

Я исправлю до сих пор? Тогда, мой вопрос: как я могу использовать DOMDocument для получения значения всех атрибутов href всех якорей на странице? – IMUXIxD

+0

Медленно. 's?' - см. http://www.regular-expressions.info/optional.html - так что не правильно только о https. Тем не менее, уверены, что www и относительные пути не будут захвачены. Посмотрите первый список ссылок, если хотите, чтобы текстовый анализ до уровня, где он начинает болеть. Для относительных ссылок лучше взять HTML-парсер, как указано во второй части ответа. – hakre

Смежные вопросы