2012-02-23 14 views
8

Po prostu chcę mieć lepszy pomysł na to, co się tutaj dzieje, mogę oczywiście "obejść" problem za pomocą urllib2.Dlaczego urllib.urlopen (url) kończy się niepowodzeniem, gdy działa urllib2.urlopen (url). Co konkretnie powoduje to odpowiedź serwera?

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/ pokazuje ten kod w akcji z wyjątkiem/stacktrace. foo.headers i foo.read() praca grzywny

[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 

Dzięki.

Odpowiedz

7

Ten serwer jest zarówno niedeterministyczny, jak i wrażliwy na wersję HTTP. urllib2 to HTTP/1.1, urllib to HTTP/1.0. Możesz to odtworzyć, uruchamiając curl --http1.0 -I "http://www.crutchfield.com/S-pqvJFyfA8KG/p_15410415/Dynamat-10415-Xtreme-Speaker-Kit.html" kilka razy z rzędu. Powinieneś czasami widzieć wyjście curl: (52) Empty reply from server; to błąd raportowania urllib. (Jeśli ponownie przesłać prośbę kilka razy za pomocą urllib, powinno się to czasem udać.)

+0

Wydaje się, że urllib.urlopen (adres URL) działa tylko poniżej 10% czasu. hooray dla niedeterministycznych serwerów! –

0

Rozwiązałem problem. Po prostu używam teraz urrlib zamiast urllib2 i wszystko działa dobrze, dziękuję wszystkim :)