Erreurs URL
Lorsque l’on développe une application utilisant des ressources Web il est
agréable de pouvoir tester la disponibilité de ces dernières.
Dans le cas d’un agrégateur ne pas tester les codes erreurs du module
urllib2 peut faire perdre du temps au lecteur. En effet il arrive que
l’adresse d’un blog/flux change. Il peut aussi s’écouler un certain temps avant
que le lecteur constate que l’agrégateur n’apporte plus de nouvelles provenant
d’un site (parmi quelques centaines peut être). Et là le lecteur pourrait devoir
rattraper plusieurs semaines de nouvelles. Le pauvre.
Aussi cela aurait pour effet de laisser des threads utiliser des ressources
inutilement, appeler le parser inutilement, tenter de créer une connexion
inutilement, etc.
Un agrégateur (le mien en tout cas) demande beaucoup de bande passante (bien
que ponctuellement).
Les bons agrégateurs comme aKregator testent cela et préviennent
l’utilisateur (via une petite icône pour chaque flux). Ainsi pyAggr3g470r va
bientôt permettre au lecteur de consulter à sa demande les sites ne répondants
plus (et pour quelle raison). Un test sera aussi effectué avant d’appeler le
module feedparser et un message avertira clairement qu’un ou plusieurs flux
n’a pas été récupéré.
Ceci grâce à cette fonction (sera certainement utilisée dans la version 2.0):
def detect_url_errors(list_of_urls):
"""
Detect URL errors.
"""
errors = []
for url in list_of_urls:
req = urllib2.Request(url)
try:
urllib2.urlopen(req)
except urllib2.HTTPError, e:
# server couldn't fulfill the request
errors.append((url, e.code, \
BaseHTTPServer.BaseHTTPRequestHandler.responses[e.code][1]))
except urllib2.URLError, e:
# failed to reach the server
errors.append((url, e.reason.errno ,e.reason.strerror))
return errors
En passant la version 1.9 de pyAggr3g470r vient de sortir, l’annonce. La récupération du contenu des articles se fait de manière plus intelligente. Voir ce commit (si vous voulez des explications détaillées…). Ma base SQLite d’environ 10Mo contient près de 5000 articles exportables en texte brut ou HTML. Tout va bien 😉