Sieht aus wie Namensauflösung wird letztlich von socket.create_connection
behandelt.
-> urllib2.urlopen
-> httplib.HTTPConnection
-> socket.create_connection
Obwohl, sobald der „Host:“ Header festgelegt wurde, können Sie den Host und geben die IP-Adresse durch bis auf den Opener lösen.
Ich würde vorschlagen, dass Sie httplib.HTTPConnection
Unterklasse, und wickeln Sie die connect
Methode self.host
zu ändern, bevor es zu socket.create_connection
vorbei.
Unterklasse Dann HTTPHandler
(und HTTPSHandler
) die http_open
Methode mit einer ersetzen, die Ihre HTTPConnection
statt httplib eigenen zu do_open
geht.
So:
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']
Offensichtlich gibt es Zertifikat Fragen, ob Sie die HTTPS verwenden, und Sie werden MyResolver füllen müssen aus ...
Ich glaube nicht, dass ich HTTPS für jetzt brauche, also wird dies vollkommen ausreichen! Vielen Dank! –
Es ist auch möglich, 'HTTPConnection._create_connection' zu überschreiben, das seit Python 2.7.7 und 3.5 aufgrund http://bugs.python.org/issue7776 verfügbar ist. –