2008-12-11 9 views
1

J'écris un crawler de base qui met simplement en cache des pages avec PHP.Web crawler liens/page logique en PHP

Tout ce qu'il fait est d'utiliser get_file_contents pour obtenir le contenu d'une page Web et regex pour obtenir tous les liens sur <a href="URL">DESCRIPTION</a> - au moment où il retourne:

Array { 
[url] => URL 
[desc] => DESCRIPTION 
} 

Le problème que je vais avoir est de trouver la logique derrière déterminer si le lien de la page est local ou se demander s'il peut être dans un répertoire local complètement différent.

Il peut s'agir de n'importe quel nombre de combinaisons: c'est-à-dire href="../folder/folder2/blah/page.html" ou href="google.com" ou href="page.html" - les possibilités sont infinies.

Quel serait l'algorithme correct pour aborder cela? Je ne veux pas perdre de données qui pourraient être importantes.

Répondre

3

Tout d'abord, regex et HTML ne se mélangent pas. Utilisation:

foreach(DOMDocument::loadHTML($source)->getElementsByTagName('a') as $a) 
{ 
    $a->getAttribute('href'); 
} 

Les liens qui peuvent aller à l'extérieur de votre site commencent par protocole ou //, à savoir

http://example.com 
//example.com/ 

href="google.com" est lien vers un fichier local.

Mais si vous voulez créer une copie statique d'un site, pourquoi ne pas simplement utiliser wget?

0

Vous devez rechercher http: // dans le fichier href. Sinon, vous pouvez déterminer si elle commence par ./ ​​ou une combinaison de "./". Si vous ne trouvez pas de "/" alors vous devrez supposer que c'est un fichier. Voulez-vous un script pour cela?

+0

que ce serait une aide précieuse! :) – atomicharri

1

Considérons d'abord les propriétés des liens locaux.

Ceux-ci seront être:

  • relatif sans système et pas hôte, ou
  • absolue avec un système de 'http' ou 'https' et un hôte que correspond à la machine à partir de laquelle le script est en cours d'exécution

C'est toute la logique que vous devez identifier si un lien est local.

Utilisez le parse_url fonction pour séparer les différents composants d'une URL pour identifier le système et hôte.

+0

soyez prudent avec parse_url il échoue vraiment facilement: P –