2012-02-23 14 views
8

Voglio solo una migliore idea di cosa sta succedendo qui, posso ovviamente "aggirare" il problema usando urllib2.perché urllib.urlopen (url) fallisce mentre urllib2.urlopen (url) funziona. Cosa sta causando in particolare la risposta del server?

import urllib 
import urllib2 

url = "http://www.crutchfield.com/S-pqvJFyfA8KG/p_15410415/Dynamat-10415-Xtreme-Speaker-Kit.html" 

# urllib2 works fine (foo.headers/foo.read() also behave) 
foo = urllib2.urlopen(url) 

# urllib throws errors though, what specifically is causing this? 
bar = urllib.urlopen(url) 

http://pae.st/AxDW/ mostra questo codice in azione con l'eccezione/stacktrace. foo.headers e foo.read() funzionano bene

[email protected] ~ $: curl -I "http://www.crutchfield.com/S-pqvJFyfA8KG/p_15410415/Dynamat-10415-Xtreme-Speaker-Kit.html"

HTTP/1.1 302 Object Moved 
Cache-Control: private 
Transfer-Encoding: chunked 
Content-Type: text/html; charset=utf-8 
Location: /S-FSTWJcduy5w/p_15410415/Dynamat-10415-Xtreme-Speaker-Kit.html 
Server: Microsoft-IIS/7.5 
Set-Cookie: SESSIONID=FSTWJcduy5w; domain=.crutchfield.com; expires=Fri, 22-Feb-2013 22:06:43 GMT; path=/ 
Set-Cookie: SYSTEMID=0; domain=.crutchfield.com; expires=Fri, 22-Feb-2013 22:06:43 GMT; path=/ 
Set-Cookie: SESSIONDATE=02/23/2012 17:07:00; domain=.crutchfield.com; expires=Fri, 22-Feb-2013 22:06:43 GMT; path=/ 
X-AspNet-Version: 4.0.30319 
HostName: cws105 
Date: Thu, 23 Feb 2012 22:06:43 GMT 

Grazie.

risposta

7

Questo server è non deterministico e sensibile alla versione HTTP. urllib2 è HTTP/1.1, urllib è HTTP/1.0. È possibile riprodurre questo eseguendo curl --http1.0 -I "http://www.crutchfield.com/S-pqvJFyfA8KG/p_15410415/Dynamat-10415-Xtreme-Speaker-Kit.html" un paio di volte di seguito. Occasionalmente dovresti vedere l'output curl: (52) Empty reply from server; questo è l'errore urllib sta segnalando. (Se riemetti la richiesta un paio di volte con urllib, dovrebbe succedere a volte.)

+0

Sembra che urllib.urlopen (url) funzioni appena meno del 10% di tempo. evviva per server non deterministici! –

0

Ho risolto il problema. Semplicemente utilizzo ora il urrlib invece di urllib2 e tutto funziona bene grazie a tutti :)