2017-04-26 3 views
1

Ich versuche, 3 URLs gleichzeitig aufzurufen und Fehler zu protokollieren. Hier ist mein Beispielcode:Python: Wie kann man herausfinden, welche URL mit urllib2 und pool.map nicht funktioniert?

urls = ["https://example.com/gives200.php", "https://example.com/alsogives200.php", "https://example.com/gives500.php"]; 

try: 
    results = pool.map(urllib2.urlopen, urls); 
except URLError: 
    urllib2.urlopen("https://example.com/log_error/?url="+URLError.url); 

Ich möchte nur wissen, welche URLs (falls vorhanden) Fehler begangen, indem sie diese /log_error/ URL aufrufen zu müssen. Aber wenn ich den Code so habe, bekomme ich eine Fehlermeldung, dass URLError nicht definiert ist.

ich tun, um diese Einfuhren an der Spitze von meinem Code haben:

import urllib2 
from multiprocessing.dummy import Pool as ThreadPool 

Hier ist meine ganze Fehlerantwort (das AWS Lambda verwendet, für was auch immer es sich lohnt)

{ 
    "stackTrace": [ 
    [ 
     "/var/task/lambda_function.py", 
     27, 
     "lambda_handler", 
     "except Error as e:" 
    ] 
    ], 
    "errorType": "NameError", 
    "errorMessage": "global name 'URLError' is not defined" 
} 

Wie Ich erfasse die fehlerhaften URLs, damit ich weiß, welche sie sind?

UPDATE

ich es herausgefunden: die urllib.error Klasse, die URLError ein Teil ist, ist genau das: urllib, nichturllib2.

Die Oberseite dieser Dokumentation Seite erklärt, dass: https://docs.python.org/2/library/urllib2.html

Und hier ist das ausführlichere Objekt httperror, dass ich tatsächlich bekommen: https://docs.python.org/2/library/urllib2.html#urllib2.HTTPError

Das Problem der URL erroring selbst wenn noch existiert ... zur Zeit Ich habe keine Möglichkeit zu identifizieren, welche URL die eine ist.

UPDATE 2

Offenbar str(e.url) alles war ich brauchte. Ich habe dazu keine Dokumentation gefunden; es war nur eine glückliche Vermutung meinerseits.

Das ist also der Arbeits Code jetzt:

urls = ["https://example.com/gives200.php", "https://example.com/alsogives200.php", "https://example.com/gives500.php"]; 

try: 
    results = pool.map(urllib2.urlopen, urls); 
except Exception as e: 
    urllib2.urlopen("https://example.com/log_error/?url="+str(e.url)+"&code="+str(e.code)+"&reason="+e.reason; 

UPDATE 3

Dank informing me about the dangers of pool.map @mfripp ich diesen Code überarbeitet haben einmal mehr dazu:

def my_urlopen(url): 
    try: 
     return urllib2.urlopen(url) 
    except URLError: 
     urllib2.urlopen("https://example.com/log_error/?url="+url) 
     return None 

def lambda_handler(event, context): 

    urls = [ 
     "https://example.com/gives200.php", 
     "https://example.com/alsogives200.php", 
     "https://example.com/gives500.php" 
    ]; 

    results = pool.map(urllib2.urlopen, urls); 

    return urls; 

Antwort

1

Ich bin nicht sicher, ob das Ausnahmeobjekt yo geben wird Details zur fehlgeschlagenen URL Wenn nicht, müssen Sie jeden Anruf mit urllib2.urlopen(url) mit try und catch umbrechen. Könnte man so tun, wie folgt:

urls = [ 
    "https://example.com/gives200.php", 
    "https://example.com/alsogives200.php", 
    "https://example.com/gives500.php" 
] 

def my_urlopen(url): 
    try: 
     return urllib2.urlopen(url) 
    except URLError: 
     urllib2.urlopen("https://example.com/log_error/?url="+url) 
     return None 

results = pool.map(my_urlopen, urls) 
# At this point, any failed requests will have None as their value 
1
from multiprocessing import Process, Pool 
import urllib2 

# Asynchronous request 
def async_reqest(url): 
    try: 
     request = urllib2.Request(url) 
     response = urllib2.urlopen(request) 
     print response.info() 
    except: 
     pass 

pool = Pool() 
pool.map(async_reqest, links) 
+0

Wie funktioniert das mit der pool.map? – Bing

1

EDITUPDATE 3 Siehe oben. mfripp's answer musste mit diesem VERSCHMELDET werden, um es vollständig zu machen.

Ich aktualisierte den ursprünglichen Beitrag zu erklären, aber das ist genau der Code, den ich brauchte.Ich konnte keine Dokumentation finden, die mich zu e.url führte, es war einfach eine glückliche Vermutung an meinem Ende.

urls = [ 
    "https://example.com/gives200.php", 
    "https://example.com/alsogives200.php", 
    "https://example.com/gives500.php" 
]; 

try: 
    results = pool.map(urllib2.urlopen, urls); 
except Exception as e: 
    urllib2.urlopen("https://example.com/log_error/?url="+str(e.url)+"&code="+str(e.code)+"&reason="+e.reason; 
+1

Wenn 'pool.map' auf eine Ausnahme stößt, wird diese ausgelöst und alle anderen Aufgaben werden beendet. Mit diesem Code können Sie feststellen, dass einige der URLs nie ausprobiert werden. Wenn Sie jede URL versuchen und jeden protokollieren möchten, der einen Fehler verursacht, benötigen Sie hier eine der beiden anderen Antworten. –

+0

Das ist EXTREM gut zu wissen, danke! Ich überarbeiten meine "genauen Code" -Lösung und akzeptieren dann Ihre Antwort. – Bing

Verwandte Themen