質問

urllib2.urlopenカスタムオープナー の利用 127.0.0.1::1)を解決するスしています。ないの変更 /etc/resolv.conf, しています。

することを可能として、ソリューションツールを使う dnspython 照会するアドレス httplib をカスタムのurl先制に成功します。内にあります。語 urlopen 使用カスタムネームサーバの起動ものです。ご意見募集

役に立ちましたか?

解決

ようにな名前解決、最終的に取り扱い socket.create_connection.

-> urllib2.urlopen
-> httplib.HTTPConnection
-> socket.create_connection

一度の"ホスト:"ヘッダに設定されていないといを解決することができるホストのIPアドレスを降り、まずは先制に成功します。

たすことを示唆してサブクラス httplib.HTTPConnection, 、を包む connect 方法を変更 self.host 渡す前に socket.create_connection.

そのサブクラス HTTPHandlerHTTPSHandler の代替として http_open 方法ととお HTTPConnection の代わりにhttplib独自の do_open.

このように:

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...

他のヒント

他(汚れ方はモンキ-パッチング socket.getaddrinfo.

例えば、次のコードを追加します(無限)のキャッシュdnsルックアップ

import socket
prv_getaddrinfo = socket.getaddrinfo
dns_cache = {}  # or a weakref.WeakValueDictionary()
def new_getaddrinfo(*args):
    try:
        return dns_cache[args]
    except KeyError:
        res = prv_getaddrinfo(*args)
        dns_cache[args] = res
        return res
socket.getaddrinfo = new_getaddrinfo

ま実装する必要がご自身のdnsルックアップがクライアント(または使用dnspythonになっているということ).その名のルックアップ手順glibcは複雑での互換性を確保するためのその他の非dns名ます。がえのないことを指定DNSサーバーのglibcライブラリです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top