ऐसा लगता है कि नाम संकल्प अंततः socket.create_connection
द्वारा संभाला जाता है।
-> urllib2.urlopen
-> httplib.HTTPConnection
-> socket.create_connection
हालांकि एक बार "मेजबान:" शीर्षक निर्धारित किया गया है, तो आप मेजबान को हल करने और सलामी बल्लेबाज के लिए नीचे के माध्यम से आईपी पते पर पारित कर सकते हैं।
मैं सुझाव देंगे कि आप उपवर्ग httplib.HTTPConnection
, और connect
विधि लपेट यह socket.create_connection
को पार करने से पहले self.host
संशोधित करने के लिए।
फिर एक है कि अपने HTTPConnection
बजाय httplib के स्वयं के do_open
गुजरता साथ http_open
विधि को बदलने के लिए HTTPHandler
(और HTTPSHandler
) उपवर्ग।
इस तरह
:
import urllib2
import httplib
import socket
def MyResolver(host):
if host == 'news.bbc.co.uk':
return '66.102.9.104' # Google IP
else:
return host
class MyHTTPConnection(httplib.HTTPConnection):
def connect(self):
self.sock = socket.create_connection((MyResolver(self.host),self.port),self.timeout)
class MyHTTPSConnection(httplib.HTTPSConnection):
def connect(self):
sock = socket.create_connection((MyResolver(self.host), self.port), self.timeout)
self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file)
class MyHTTPHandler(urllib2.HTTPHandler):
def http_open(self,req):
return self.do_open(MyHTTPConnection,req)
class MyHTTPSHandler(urllib2.HTTPSHandler):
def https_open(self,req):
return self.do_open(MyHTTPSConnection,req)
opener = urllib2.build_opener(MyHTTPHandler,MyHTTPSHandler)
urllib2.install_opener(opener)
f = urllib2.urlopen('http://news.bbc.co.uk')
data = f.read()
from lxml import etree
doc = etree.HTML(data)
>>> print doc.xpath('//title/text()')
['Google']
जाहिर है प्रमाणपत्र मुद्दों यदि आप HTTPS का उपयोग करें, और आप MyResolver बाहर भरने की आवश्यकता होगी रहे हैं ...
मुझे नहीं लगता कि मुझे अब के लिए HTTPS की आवश्यकता होगी, इसलिए यह पूरी तरह से पर्याप्त होगा! आपका बहुत बहुत धन्यवाद! –
'HTTPConnection._create_connection' को ओवरराइड करना भी संभव है, जो http://bugs.python.org/issue7776 के कारण पायथन 2.7.7 और 3.5 के बाद उपलब्ध है। –