2010-07-12 5 views
6

Pour ceux qui connaissent wget, il a une option --spider, qui permet de vérifier si un lien est cassé ou non, sans réellement télécharger la page web. Je voudrais faire la même chose en Python. Mon problème est que j'ai une liste de 100'000 liens que je veux vérifier, au plus une fois par jour, et au moins une fois par semaine. En tout cas, cela va générer beaucoup de trafic inutile.Vérifier si un lien est mort ou ne pas utiliser Python sans télécharger la page web

Pour autant que je comprends du urllib2.urlopen() documentation, il ne télécharge pas la page mais seulement la méta-information. Est-ce correct? Ou y a-t-il un autre moyen de le faire d'une manière agréable?

Best,
Troels

Répondre

9

vous devez utiliser le HEAD Request pour cela, il demande au serveur Web pour les en-têtes sans corps . Voir How do you send a HEAD HTTP request in Python 2?

+0

À droite, HEAD vous obtiendra les en-têtes (y compris le statut HTTP) sans télécharger le corps du message. Certains sites sont (mal) configurés pour envoyer des pages "non trouvées"/404 avec un statut de 200, donc, il serait difficile de détecter ces situations. – JAL

+0

Pour autant que je sache, c'est ce que fait wget --spider. –

+0

Merci beaucoup pour la solution ainsi que pour les réflexions sur les sites mal configurés (ça vaut le coup de se souvenir!) - c'est exactement ce dont j'ai besoin :) – Troels

-1

Je ne sais pas comment faire cela en python, mais en général, vous pouvez vérifier « Réponse en-tête » et cocher « code d'état » pour le code 200. à ce moment-là, vous pouvez arrêter de lire la page et continuer avec votre lien suivant cette façon, vous ne devez pas télécharger la page entière juste la « tête de réponse » Liste des Status Codes

+0

Pourquoi cela a-t-il été rejeté, veuillez expliquer votre raisonnement? Je sais que cela n'utilise pas la demande de tête mais il a accompli la même chose. – Greg

+0

301 est une redirection et est une bonne réponse. En fait, tout 2 ** est OK, 3 ** nécessite un traitement supplémentaire (redirection), etc. La vérification uniquement pour 200 est insuffisante. – kgadek

Questions connexes