我想告诉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对象没有方法。(还:是小写字母。)您需要做的就是将用作第一个参数,这将给您您的答复。