关于python urllib2模块的问题

我用urllib2模块在线程中请求一批url(十几个的样子),这个线程每隔十几分钟运行一次。每次初始运行程序时可以顺利请求到URL资源,但十几分钟线程再次请求时就全都出现“HTTP Error 503: Service Unavailable” 错误,但此时又可在浏览器中正常打开这些链接,在IDLE Shell中以导入模块的方式运行那个函数也没问题,这是什么情况?

请求时设置了User-Agent,应该不是被服务器阻止了,我怀疑是不是资源没有释放的原因,但不知怎么解决。还有urllib2.urlopen(...) 后使用close()关闭连接。
阅读 5.5k
2 个回答

找到原因了,我的代码某处设置了代理,而这个地方逻辑写错了。
原来是这样的:

....
req = urllib2.Request(urls[i], headers = reqHeaders)
proxy = urllib2.ProxyHandler({hh:pp,})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
resp = urllib2.urlopen(req, timeout = 30)
page = resp.read()
....

更改后是这样的,然后就没问题了,上面把代理设置成全局了,所以才出现这些错误:

....
req = urllib2.Request(urls[i], headers = reqHeaders)
proxy = urllib2.ProxyHandler({hh:pp,})
opener = urllib2.build_opener(proxy)
resp = opener.open(req, timeout = 30)
page = resp.read()
....

通常HTTP状态码5开头(例如 500 503 503)的都是服务器错误。

为了验证你的程序是否正确,你可以访问一下别的站点,例如baidu

如果说服务器主动拒绝服务,返回400相关的设计才科学。例如是主动封你的这个ip的请求。

至于说资源不释放这个猜测,才几十个线程的请求,随随便便就500的服务器,也太脆弱了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进