سؤال

ولدي موقع بسيط أنا على اختبار. انها تعمل على المضيف المحلي ويمكنني الوصول إليه في متصفح الويب الخاص بي. صفحة الفهرس هو ببساطة كلمة "تشغيل". سوف 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 أو حقول رأس إضافية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top