当前位置: 首页 > 面试题库 >

告诉urllib2使用自定义DNS

巫马劲
2023-03-14
问题内容

我想告诉urllib2.urlopen(或一个 自定义的opener
)使用127.0.0.1(或::1)解析地址。但是,我不会更改我的/etc/resolv.conf

一种可能的解决方案是使用一种工具dnspython来查询地址并httplib构建自定义网址打开器。我更希望告诉urlopen您使用自定义名称服务器。有什么建议?


问题答案:

看起来名称解析最终是由处理的socket.create_connection

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

尽管设置了“主机:”标头后,您仍可以解析主机并将IP地址向下传递到打开程序。

我建议您子类化httplib.HTTPConnection,并在将connect方法self.host传递给之前包装要修改的方法socket.create_connection

然后,将其子类HTTPHandler(和HTTPSHandler)替换为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 …



 类似资料:
  • # 5.1 自定义报告是什么? {#51-自定义报告是什么?} 在进行网站分析的时候,通常需要关联多个维度进行分析, 同时根据不同组合维度,选取合适的衡量指标。 例如,衡量 广告流量 达成的事件数 或 不同来源流量的所使用客户端及其地域分布。 在默认报告中,系统提供了单个维度的分析视角。 而自定义报告则可实现关联不同分析维度,衡量站点数据表现。 示例如下: 维度1 维度2 维度3 衡量指标 广告维

  • 我们的客户正在为内部应用程序使用自己的根CA。证书在Windows密钥库中,但不在Java密钥库中。如何让Java Web Start应用程序使用Windows密钥库搜索valide证书中的SSL连接?将证书导入每个Java密钥库是没有选择的! 编辑:我想使用Windows密钥库的主要原因是验证已签名应用程序的证书

  • 问题内容: 我想用Cython包装一个包含C ++和OpenMP代码的测试项目,并通过文件与distutils一起构建它。我文件的内容如下所示: 该标志与gcc一起用于针对OpenMP进行编译和链接。但是,如果我只是调用 由于编译器是clang,因此无法识别此标志: 我尝试指定gcc失败: 如何告诉distutils使用gcc? 问题答案: 尝试使用os.environ从setup.py内部设置“

  • 我想用Cython包装一个包含C和OpenMP代码的测试项目,并通过一个文件用distutils构建它。我的文件内容是这样的: 标志与gcc一起用于编译和链接OpenMP。然而,如果我只是调用 无法识别此标志,因为编译器为clang: 我尝试指定gcc失败: 如何告诉distutils使用gcc?

  • 问题内容: 使用urllib2.urlopen(..)时,我想在请求中发送自定义的“ Accept”标头。我怎么做? 问题答案: 不完全的。创建对象实际上并不发送请求,并且Request对象没有方法。(还:是小写字母。)您需要做的就是将用作第一个参数,这将给您您的答复。