2012-07-23 10 views
7

Próbuję wyodrębnić dane z linku Civic Commons Apps dla mojego projektu. Jestem w stanie uzyskać linki strony, której potrzebuję. Ale gdy próbuję otworzyć linki otrzymuję „urlopen błąd [ERRNO -2] Nazwa lub usługa nie znane”Python Web Scraping - błąd urlopen [Errno -2] Nazwa lub usługa nieznana

Wstęgę skrobanie kod 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) 

pojawia się następujący błąd:

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> 

Czy powinienem zajmować się czymś konkretnym podczas wykonywania urlopuen? Ponieważ nie widzę problemu z linkami http, które otrzymuję.

[edytuj] Na drugim biegu mam następujący błąd:

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) 

Ten sam kod działa poprawnie w mojej przyjaciółki Mac, ale nie w moim Ubuntu 12.04.

Próbowałem także uruchomić kod w wiki scrappera i zakończyło się pomyślnie. Ale brakuje kilku adresów URL (w porównaniu do mac). Czy są jakieś powody takiego zachowania?

+0

Jaka jest wartość parametru "categorized_apps_url" w miejscu wystąpienia błędu? – kojiro

+2

Ponadto wiem, że ten rodzaj komentarza jest często uważany za denerwujący, ale może okazać się, że życie * znacznie * jest łatwiejsze, jeśli używasz [httplib2] (http://code.google.com/p/httplib2/) lub [wniosków] (http://docs.python-requests.org/en/latest/index.html) zamiast 'urllib2'. Oferują bardziej kompletny zestaw funkcji do pracy z http. – kojiro

+0

Twój skrypt działa poprawnie z mojego komputera, tak jak jest. Pracuję na komputerze Mac z pythonem 2.7 i wypróbowałem go zarówno w BeautifulSoup 3.2, jak i 4.0. W obu przypadkach zwracana jest lista 69 głównych łączy i 117 następnych stron. Podejrzewam, że coś jest w systemie, który blokuje pythona. Czy próbowałeś pingować te adresy URL bezpośrednio? Być może masz oprogramowanie antywirusowe, które blokuje twój skrypt? –

Odpowiedz

4

Kod działa na moim Macu i na Macach znajomych. Działa dobrze z instancji maszyny wirtualnej serwera Ubuntu 12.04. Jest oczywiście coś w twoim konkretnym środowisku - twoim systemie operacyjnym (Ubuntu Desktop?) Lub sieci, która sprawia, że ​​się psuje. Na przykład domyślne ustawienie routera domowego ogranicza liczbę połączeń do tej samej domeny w ciągu x sekund - i może spowodować tego rodzaju problem, jeśli go nie wyłączyłem. Może to być wiele rzeczy.

Na tym etapie sugerowałbym refaktoryzację kodu, aby złapać URLError i odłożyć na bok kłopotliwe adresy URL do ponownej próby. Również błędy log/print, jeśli ulegną awarii po kilku próbach. Może nawet wrzucić jakiś kod, żeby czas zadzwonił między błędami. Lepiej jest, niż gdyby twój skrypt po prostu nie działał poprawnie, a otrzymasz informację zwrotną, czy są to tylko konkretne adresy URL powodujące problem lub problem z synchronizacją (np. Czy zawodzi po x liczbie wywołań urlopen, czy też po awarii x liczba połączeń urlopen w ilości x micro/sekund). Jeśli jest to problem z synchronizacją, prosta wersja time.sleep(1) włożona w pętle może załatwić sprawę.

4

SyncMaster,

wpadłem na tym samym numerze niedawno po skokach na starym pole ubuntu nie grałem ze na jakiś czas. Ten problem jest w rzeczywistości spowodowany ustawieniami DNS na twoim komputerze. Gorąco polecam sprawdzenie ustawień DNS (/etc/resolv.conf i dodanie serwera nazw 8.8.8.8), a następnie spróbuj ponownie, powinieneś osiągnąć sukces.

Powiązane problemy