通过代理使用urlib2.urlopen在几次调用后失败
编辑: 经过多次尝试,似乎urlgrabber在处理某些情况下比urllib2更有效,即使我告诉它在每个文件后关闭连接。看起来urllib2在处理代理时可能有问题,或者是我使用它的方式有问题!无论如何,这里是一个最简单的代码示例,用于循环获取文件:
import urlgrabber
for i in range(1, 100):
url = "http://www.iana.org/domains/example/"
urlgrabber.urlgrab(url, proxies={'http':'http://<user>:<password>@<proxy url>:<proxy port>'}, keepalive=1, close_connection=1, throttle=0)
大家好!
我正在尝试写一个非常简单的Python脚本,通过urllib2来获取一堆文件。
这个脚本需要在公司网络的代理下工作(如果是在内部网络上获取文件,也就是不使用代理的话,就没有这个问题)。
这个脚本在发出几次请求后失败,出现了“HTTPError: HTTP Error 401: basic auth failed”的错误。有人知道这可能是什么原因吗?看起来代理拒绝了我的身份验证,但为什么呢?前几次的urlopen请求都正常通过了!
编辑:在请求之间加了10秒的延迟,以避免代理可能进行的某种限制,但结果没有改变。
这是我脚本的简化版本(显然去掉了敏感信息):
import urllib2
passmgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
passmgr.add_password(None, '<proxy url>:<proxy port>', '<my user name>', '<my password>')
authinfo = urllib2.ProxyBasicAuthHandler(passmgr)
proxy_support = urllib2.ProxyHandler({"http" : "<proxy http address>"})
opener = urllib2.build_opener(authinfo, proxy_support)
urllib2.install_opener(opener)
for i in range(100):
with open("e:/tmp/images/tst{}.htm".format(i), "w") as outfile:
f = urllib2.urlopen("http://www.iana.org/domains/example/")
outfile.write(f.read())
提前感谢大家!
2 个回答
1
可能是代理在限制你的请求。它可能觉得你像个机器人。
你可以试着加一个超时时间,看看这样能不能解决问题。
1
你可以通过使用urlgrabber模块中的keepalive处理器,来减少连接的数量。
import urllib2
from keepalive import HTTPHandler
keepalive_handler = HTTPHandler()
opener = urllib2.build_opener(keepalive_handler)
urllib2.install_opener(opener)
fo = urllib2.urlopen('http://www.python.org')
我不确定这是否能在你的代理设置下正常工作。你可能需要对keepalive模块进行一些修改。