أعمال urllib.urlopen لكن urllib2.urlopen لا
سؤال
ولدي موقع بسيط أنا على اختبار. انها تعمل على المضيف المحلي ويمكنني الوصول إليه في متصفح الويب الخاص بي. صفحة الفهرس هو ببساطة كلمة "تشغيل". سوف urllib.urlopen
بنجاح قراءة الصفحة ولكن لا urllib2.urlopen
سوف. وهنا السيناريو الذي يوضح المشكلة (هذا هو السيناريو الفعلي وليس تبسيط برنامج نصي اختبار مختلف):
import urllib, urllib2
print urllib.urlopen("http://127.0.0.1").read() # prints "running"
print urllib2.urlopen("http://127.0.0.1").read() # throws an exception
وهنا تتبع المكدس:
Traceback (most recent call last):
File "urltest.py", line 5, in <module>
print urllib2.urlopen("http://127.0.0.1").read()
File "C:\Python25\lib\urllib2.py", line 121, in urlopen
return _opener.open(url, data)
File "C:\Python25\lib\urllib2.py", line 380, in open
response = meth(req, response)
File "C:\Python25\lib\urllib2.py", line 491, in http_response
'http', request, response, code, msg, hdrs)
File "C:\Python25\lib\urllib2.py", line 412, in error
result = self._call_chain(*args)
File "C:\Python25\lib\urllib2.py", line 353, in _call_chain
result = func(*args)
File "C:\Python25\lib\urllib2.py", line 575, in http_error_302
return self.parent.open(new)
File "C:\Python25\lib\urllib2.py", line 380, in open
response = meth(req, response)
File "C:\Python25\lib\urllib2.py", line 491, in http_response
'http', request, response, code, msg, hdrs)
File "C:\Python25\lib\urllib2.py", line 418, in error
return self._call_chain(*args)
File "C:\Python25\lib\urllib2.py", line 353, in _call_chain
result = func(*args)
File "C:\Python25\lib\urllib2.py", line 499, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 504: Gateway Timeout
وأي أفكار؟ أنا قد ينتهي التي تحتاج إلى بعض الميزات الأكثر تقدما من urllib2
، لذلك أنا لا أريد أن اللجوء فقط إلى استخدام urllib
، بالإضافة أريد أن أفهم هذه المشكلة.
المحلول
ويبدو وكأنه لديك إعدادات الوكيل المعرف الذي urllib2 هو التقاط جرا. عندما يحاول وكيل "127.0.0.01/"، الوكيل يتخلى عن وإرجاع خطأ 504.
الثعبان غامض urllib2 وكيل مسكتك :
proxy_support = urllib2.ProxyHandler({})
opener = urllib2.build_opener(proxy_support)
print opener.open("http://127.0.0.1").read()
# Optional - makes this opener default for urlopen etc.
urllib2.install_opener(opener)
print urllib2.urlopen("http://127.0.0.1").read()
نصائح أخرى
هل تدعو urlib2.open الأولى تليها urllib.open لها نفس النتائج؟ أتساءل فقط اذا كانت الدعوة الأولى لفتح يسبب المتشعب الخادم للحصول على مزدحم مما تسبب في مهلة؟
وأنا لا أعرف ما يحدث، ولكن قد تجد هذه مفيدة في الاعتقاد بها:
>>> import urllib2
>>> urllib2.urlopen('http://mit.edu').read()[:10]
'<!DOCTYPE '
>>> urllib2._opener.handlers[1].set_http_debuglevel(100)
>>> urllib2.urlopen('http://mit.edu').read()[:10]
connect: (mit.edu, 80)
send: 'GET / HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: mit.edu\r\nConnection: close\r\nUser-Agent: Python-urllib/2.5\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Date: Tue, 14 Oct 2008 15:52:03 GMT
header: Server: MIT Web Server Apache/1.3.26 Mark/1.5 (Unix) mod_ssl/2.8.9 OpenSSL/0.9.7c
header: Last-Modified: Tue, 14 Oct 2008 04:02:15 GMT
header: ETag: "71d3f96-2895-48f419c7"
header: Accept-Ranges: bytes
header: Content-Length: 10389
header: Connection: close
header: Content-Type: text/html
'<!DOCTYPE '
وurllib.urlopen () رميات الطلب التالي على الملقم:
GET / HTTP/1.0
Host: 127.0.0.1
User-Agent: Python-urllib/1.17
وحين urllib2.urlopen () يلقي هذا:
GET / HTTP/1.1
Accept-Encoding: identity
Host: 127.0.0.1
Connection: close
User-Agent: Python-urllib/2.5
وهكذا، الخادم الخاص بك إما لا يفهم HTTP / 1.1 أو حقول رأس إضافية.