如何使用Python和urllib2设置源IP /接口?
不幸的是,正在使用的标准库模块堆栈(urllib2,httplib,socket)为此目的而设计得有些糟糕-
在操作的关键点HTTPConnection.connect
(在httplib中)委托给socket.create_connection
,这反过来使您没有任何“钩子”在创建套接字实例sock
和sock.connect
调用之间,您需要在插入sock.bind
之前插入sock.connect
源IP(我正在广泛传播信息,而不是以这种不密封,过度封装的方式设计抽象-
我我将在本周四的OSCON上以“ Zen和抽象维护的艺术”为标题来谈论这一点-但在这里,您的问题是如何处理我们以这种方式设计的一堆抽象(叹气)。
当您遇到此类问题时,您只有两个不太好的解决方案:要么复制,粘贴并编辑设计错误的代码,然后在代码中放置原始设计人员无法满足的“钩子”。或“猴子补丁”该代码。GOOD都不是,但是两者都可以,所以至少要感谢我们有这样的选择(通过使用开源和动态语言)。在这种情况下,我想我会去进行猴子补丁(这很糟糕,但是复制和粘贴编码甚至更糟)—一个代码片段,例如:
import socket
true_socket = socket.socket
def bound_socket(*a, **k):
sock = true_socket(*a, **k)
sock.bind((sourceIP, 0))
return sock
socket.socket = bound_socket
true_socket`以避开将来尚未创建的套接字)。第二种替代方法会添加其自身的复杂性以正确编排,因此我在等所有内容解释之前,等待您澄清您是否确实需要此类复杂性。
AKX的好答案是“复制/粘贴/编辑”选项的变体,因此我不需要对此进行太多扩展-
请注意,它并不能完全复制socket.create_connection
其connect
方法,请参见此处的源代码(页末),并决定create_connection
如果您决定采用该功能,则可能希望在复制/粘贴/编辑版本中体现该功能的其他功能。
我对python还很陌生。我正试图为我正在从事的一个项目编写一个非常简单的web刮板。在这个过程中,我试图使用Tor来更改我的IP地址,这样我就不会与我正在刮取的服务断开连接。在将新IP添加到我的项目之前,我试图测试特定于获取新IP的代码。这是我正在测试的代码。 当我执行此操作时,会出现以下错误: IP 1:Traceback(最近一次调用last):文件“scrapingTools.py”,第8
问题内容: 我正在与API建立多个连接。进行删除查询。我在第3000个查询中遇到了该错误。 像这样: 比在控制台中: 在第3000个请求之后,它会说: 问题答案: 该错误来自Windows本身,请参阅避免TCP / IP端口耗尽。要修复错误,请关闭您的连接,因为您没有在调用opener.close()从而导致套接字泄漏。
问题内容: 我打开网址: 我想做的就是以相同的方式连接到我在某处告诉我的代理: 但这也不起作用。 我知道urllib2具有类似代理处理程序的功能,但是我无法回忆起该功能。 问题答案:
问题内容: 我正在尝试使用Python获取URL,响应为JSON。但是,当我跑步时 html的类型为str,我期望使用JSON。有什么办法可以将响应捕获为JSON或python字典而不是str。 问题答案: 如果URL返回有效的JSON编码数据,请使用该库对其进行解码:
问题内容: 我正在urllib2的urlopen中使用timeout参数。 我如何告诉Python,如果超时到期,应该引发自定义错误? 有任何想法吗? 问题答案: 在极少数情况下要使用。这样做会捕获可能很难调试的 任何 异常,并且会捕获包括和在内的异常,这些异常会使您的程序恼人。 最简单的说,您会发现: 以下内容应捕获连接超时时引发的特定错误:
问题内容: 我正在尝试使用urllib2 http客户端在python中创建下载进度栏。我已经查看了API(以及Google),似乎urllib2不允许您注册进度挂钩。但是,较旧的不推荐使用的urllib确实具有此功能。 有谁知道如何使用urllib2创建进度条或报告挂钩?还是有一些其他的黑客来获得类似的功能? 问题答案: 这是一个完全有效的示例,它建立在Anurag响应中的分块方法的基础上。我的