Python Web Grattage - urlopen erreur [Errno -2] Nom ou service qui n'est pas connu
Je suis en train d'extraire des données à partir de Civique Communes Apps lien de mon projet. Je suis en mesure d'obtenir les liens de la page dont j'ai besoin. Mais lorsque j'essaie d'ouvrir les liens que je reçois "urlopen erreur [Errno -2] Nom ou le service ne sait pas"
Le web scraping code python:
from bs4 import BeautifulSoup
from urlparse import urlparse, parse_qs
import re
import urllib2
import pdb
base_url = "http://civiccommons.org"
url = "http://civiccommons.org/apps"
page = urllib2.urlopen(url)
soup = BeautifulSoup(page.read())
list_of_links = []
for link_tag in soup.findAll('a', href=re.compile('^/civic-function.*')):
string_temp_link = base_url+link_tag.get('href')
list_of_links.append(string_temp_link)
list_of_links = list(set(list_of_links))
list_of_next_pages = []
for categorized_apps_url in list_of_links:
categorized_apps_page = urllib2.urlopen(categorized_apps_url)
categorized_apps_soup = BeautifulSoup(categorized_apps_page.read())
last_page_tag = categorized_apps_soup.find('a', title="Go to last page")
if last_page_tag:
last_page_url = base_url+last_page_tag.get('href')
index_value = last_page_url.find("page=") + 5
base_url_for_next_page = last_page_url[:index_value]
for pageno in xrange(0, int(parse_qs(urlparse(last_page_url).query)['page'][0]) + 1):
list_of_next_pages.append(base_url_for_next_page+str(pageno))
else:
list_of_next_pages.append(categorized_apps_url)
J'obtiens l'erreur suivante:
urllib2.urlopen(categorized_apps_url)
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 400, in open
response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 418, in _open
'_open', req)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1207, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1177, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error [Errno -2] Name or service not known>
Dois-je prendre soin de quelque chose de précis, lorsque je joue urlopen? Parce que je ne vois pas de problème avec le site http liens que je reçois.
[modifier]
Sur la deuxième manche, j'ai l'erreur suivante:
File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 400, in open
response = self._open(req, data)
File "/usr/lib/python2.7/urllib2.py", line 418, in _open
'_open', req)
File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 1207, in http_open
return self.do_open(httplib.HTTPConnection, req)
File "/usr/lib/python2.7/urllib2.py", line 1177, in do_open
raise URLError(err)
Le code fonctionne très bien sur mon ami Mac, mais échoue dans mon ubuntu 12.04.
Aussi j'ai essayé d'exécuter le code dans scrapper wiki et il a terminé avec succès. Mais quelques les url étaient manquantes (par rapport à mac). Il y a aucune raison pour que ces comportements?
categorized_apps_url
au moment de l'erreur?Aussi, je sais que ce genre de commentaire est souvent considéré comme gênant, mais vous pouvez trouver la vie bien plus facile si vous utilisez httplib2 ou demande au lieu de
urllib2
. Ils offrent un ensemble plus complet de fonctionnalités pour travailler avec le protocole http.Votre script fonctionne très bien à partir de mon ordinateur, comme il est. Je suis en cours d'exécution sur un Mac avec python 2.7 et il a essayé à la fois avec BeautifulSoup 3.2 et 4.0 et dans les deux cas, il renvoie une liste de 69 les liens principaux et 117 page suivante, liens. Je soupçonne que c'est quelque chose sur votre système de blocage de python. Avez-vous essayé le ping les urls directement? Peut-être que vous avez un logiciel antivirus qui bloque votre script?
Je ne suis pas en mesure de trouver un lien exact pour lequel je reçois le message d'erreur. Il se casse à des valeurs différentes. Et merci pour la suggestion. J'essaye seulement de mes mains au web grattage. Afin de vous commentaire est le bienvenu. 🙂
J'ai vérifié, et l'url de travail. Aussi j'ai essayé le même code dans l'ami de mon mac et ça fonctionne parfaitement. Est-il une raison pourquoi il ne parvient pas à mon Ubuntu 12.04 ?
OriginalL'auteur SyncMaster | 2012-07-23
Vous devez vous connecter pour publier un commentaire.
Le code fonctionne sur mon Mac et sur vos amis mac. Il fonctionne très bien à partir d'une instance de machine virtuelle Ubuntu 12.04 server. Il y a évidemment quelque chose dans votre environnement particulier - votre système d'exploitation (Ubuntu Desktop?) ou d'un réseau qui est à l'origine de la merde. Par exemple, mon routeur par défaut du paramètre limite le nombre d'appels pour le même domaine en x secondes - et pourrait causer ce genre de problème si je n'ai pas l'éteindre. Il pourrait être un certain nombre de choses.
À ce stade, je voudrais suggérer la refactorisation de votre code d'attraper le
URLError
et mettre de côté url problématiques pour une nouvelle tentative. Aussi log/les erreurs d'impression si elles ne parviennent pas après plusieurs tentatives. Peut-être même de jeter un peu de code à la fois vos appels entre les erreurs. C'est mieux que d'avoir votre script simplement de ne pas d'emblée et vous obtiendrez une rétroaction quant à savoir si c'est juste des url spécifiques, à l'origine du problème ou un problème de timing (c'est à dire qu'il ne échouer après un nombre x deurlopen
appels, ou si c'est un échec après un nombre x deurlopen
appels en montant x de micro/secondes). Si c'est un problème de timing, une simpletime.sleep(1)
inséré dans votre boucle, pourrait faire l'affaire.OriginalL'auteur Mark Gemmill
SyncMaster,
J'ai rencontré le même problème récemment, après avoir sauté sur une vieille ubuntu boîte, je n'ai pas joué avec pendant un certain temps. Cette question est en fait causée en raison de la configuration DNS de votre machine. Je recommande fortement que vous vérifiez vos paramètres DNS (/etc/resolv.conf et ajouter nameserver 8.8.8.8) et puis essayez à nouveau, vous devriez rencontrer le succès.
OriginalL'auteur Sly D