2012-07-23 12 views
7

मैं अपने प्रोजेक्ट के लिए Civic Commons Apps लिंक से डेटा निकालने का प्रयास कर रहा हूं। मैं जिस पृष्ठ की आवश्यकता है उसके लिंक प्राप्त करने में सक्षम हूं। लेकिन जब मैं लिंक को खोलने का प्रयास मैं "urlopen त्रुटि [errno -2] नाम या सेवा ज्ञात नहीं"पायथन वेब स्क्रैपिंग - urlopen त्रुटि [Errno -2] नाम या सेवा ज्ञात नहीं है

वेब scraping अजगर कोड:

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) 

मैं निम्नलिखित त्रुटि मिलती है:

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> 

क्या मुझे urlopen निष्पादित करते समय विशिष्ट चीज़ों का ख्याल रखना चाहिए? क्योंकि मुझे प्राप्त होने वाले http लिंक के साथ कोई समस्या नहीं दिख रही है।

[संपादित करें] इसके दूसरे भाग पर मैं निम्नलिखित त्रुटि मिली:

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) 

एक ही कोड मेरे दोस्त की मैक में ठीक चलाता है, लेकिन मेरी Ubuntu 12.04 में विफल रहता है।

इसके अलावा मैंने स्क्रैपर विकी में कोड चलाने की कोशिश की और यह सफलतापूर्वक समाप्त हो गया। लेकिन कुछ यूआरएल गायब थे (जब मैक की तुलना में)। क्या इन व्यवहारों के लिए कोई कारण है?

+0

त्रुटि के बिंदु पर 'categorized_apps_url' का मूल्य क्या है? – kojiro

+2

इसके अलावा, मुझे पता है कि इस तरह की टिप्पणी अक्सर परेशान माना जाता है, लेकिन यदि आप [httplib2] (http://code.google.com/p/httplib2/) या [अनुरोध] का उपयोग करते हैं तो आपको जीवन * अधिक * आसान मिल सकता है (http:// urocs.python-requests.org/en/latest/index.html) 'urllib2' के बजाय)। वे http के साथ काम करने के लिए सुविधाओं का एक और पूरा सेट प्रदान करते हैं। – kojiro

+0

आपकी स्क्रिप्ट मेरे कंप्यूटर से ठीक है। मैं पाइथन 2.7 के साथ एक मैक पर चल रहा हूं और इसे सुंदर सूप 3.2 और 4.0 दोनों के साथ करने की कोशिश की और दोनों मामलों में यह 69 मुख्य लिंक और 117 अगले पृष्ठ लिंक की एक सूची लौटाता है। मुझे संदेह है कि यह आपके सिस्टम पर कुछ है जो अजगर को अवरुद्ध कर रहा है। क्या आपने उन यूआरएल को सीधे पिंग करने की कोशिश की है? शायद आपके पास एंटीवायरस सॉफ़्टवेयर है जो आपकी स्क्रिप्ट को अवरुद्ध कर रहा है? –

उत्तर

4

कोड मेरे मैक और आपके दोस्तों मैक पर काम करता है। यह उबंटू 12.04 सर्वर के वर्चुअल मशीन इंस्टेंस से ठीक चलता है। स्पष्ट रूप से आपके विशेष वातावरण में कुछ है - आपका ओएस (उबंटू डेस्कटॉप?) या नेटवर्क जो इसे बाहर निकालने का कारण बन रहा है। उदाहरण के लिए, मेरे घर राउटर की डिफ़ॉल्ट सेटिंग x सेकंड में उसी डोमेन पर कॉल की संख्या को थ्रॉटल करती है - और अगर मैं इसे बंद नहीं करता तो इस तरह की समस्या का कारण बन सकता है। यह काफी चीज़े हो सकती। है।

इस चरण में मैं URLError को पकड़ने के लिए अपने कोड को दोबारा करने का सुझाव दूंगा और पुनः प्रयास के लिए समस्याग्रस्त यूआरएल को अलग कर दूंगा। अगर वे कई रीट्रीज़ के बाद विफल हो जाते हैं तो त्रुटियों को लॉग/प्रिंट भी करें। शायद त्रुटियों के बीच आपकी कॉल के समय कुछ कोड में फेंक दें। यह आपकी स्क्रिप्ट को सीधे विफल होने से बेहतर है और आपको फीडबैक मिलेगा कि यह समस्या या समय के मुद्दे के कारण केवल विशेष यूआरएल है (यानी यह urlopen कॉल की एक्स संख्या के बाद विफल हो जाता है, या यदि यह x के बाद विफल हो रहा है urlopen की संख्या x/mic x सेकेंड में कॉल करती है)। यदि यह एक समय मुद्दा है, तो आपके लूप में डाला गया एक साधारण time.sleep(1) चाल हो सकता है।

4

SyncMaster,

मैं हाल ही में एक पुराने ubuntu बॉक्स मैं एक समय में एक साथ नहीं खेला है पर कूद के बाद ही समस्या का सामना किया। यह समस्या वास्तव में आपकी मशीन पर DNS सेटिंग्स के कारण हुई है। मैं अत्यधिक अनुशंसा करता हूं कि आप अपनी DNS सेटिंग्स (/etc/resolv.conf और नेमसर्वर 8.8.8.8 जोड़ें) देखें और फिर पुन: प्रयास करें, आपको सफलता मिलनी चाहिए।

संबंधित मुद्दे