2013年5月28日星期二

GoAgent 的 "Python Urlfetch Error:'GET' " 到底是怎么回事,如何解决?

用 GoAgent 的朋友经常会遇到 "Python Urlfetch Error:'GET'" 的问题,在一次和推友的对话中,无意中使我对这个问题产生了兴趣,现在来谈谈我的理解和很有限度地提供一些解决方法。

图一

首先,来看看我们一般是怎么打开网页的(假设A是你,B是网站):

1)A点击链接或输入网址;
2)A发送请求到B;
3)B收到请求,把网页数据传回A
4)A阅读网页

在2)和3)之间可能会出现一些情况,如(僻除ISP),输入的网址无效,网页不存在,服务器正在维护或关闭,路由出问题(诸如天灾)又或A和B之间沟通上出了问题都会造成我们无法正常打开网页。

在2)和3)之间,无论成功与否都有一个返回码叫 HTTP response status codes (以下统称RSC),这个码不一定从B所传回,可以从2)和3)之间的任何一个环节中传回。


以上4步,A和B是直接联系的,但如果我们用代理上网(设为C),那么A和B就必须要通过C才能联系得上:

1)A点击链接或输入网址;
2)A的请求送到C;
3)C向B发出请求;
4)B收到请求,把网页数据传回C;
5)C再把数据传送回A;
6)A阅读网页

这回,一旦出现情况,RSC会被传回到C,"Python Urlfetch Error:'GET'" 正是由C传回到A的错误信息。

 图二

谷歌提供了一个叫 URLFetch Python API,GoAgent 就是利用它和外界联系,让它能自由和谷歌以外的网站沟通。

我们欲了解 GoAgent 所传回的错误信息,得要仔细看看才行,"Python Urlfetch Error" 是一个笼统的信息,细心看下去就是 "GET", "get" 意味着C向B索取数据(网页内容),这个 "GET"(还有 POST,HEAD,PUTDELETE)都不是关键的,它只是告诉你C向B提出什么类型的请求,关键部分在下面那几行,在图一部分,我尝试打开一个不存在的网站,错误信息就是:

DNSLookupFailedError('DNS lookup failed for URL: http://www.prankwang.com/',), deadline=60
DNSLookupFailedError('DNS lookup failed for URL: http://www.prankwang.com/',), deadline=120


这个信息告诉我们,C在到达B前,进行 DNS 检查的时候所发生的错误。

在图二里,关键字是 "DownloadError", 说明无法下载网页,如果刷一刷就没事,说明很可能是在C和B联系的过程中出了点问题,如果一直都刷不出来,而 GoAgent 的设置又正确,那最常见的可能就是网页已经不存在了(404),然而,网页不存在不是不能打开网页的唯一原因,下面我们来看看当遇到类似问题时应该如何解决。

当C和B之间出了问题,我们在A点,能做些什么呢:

1) 如果你初装了 GaAgent, 记得把在 proxy.ini 里的 id 填上;
2) 刷新几次;
3) 把浏览器关了,重新打开;
4) 清除浏览器的缓冲区;
5) 清除 cookies
6) 用浏览器的安全模式尝试一下;
7) 换一个浏览器试试;
8) 重启电脑;
9) 重启 modem, 如果安装了路由或和交换器,重启一次;
10)这可能是 ISP 造成的,试试和他们联系;
11)联系B的站长,告诉ta这个情况;
12)向 GoAgent 作者(@phuslu) 反应一下;
13)这可能是 Python URLfetch API 服务器的问题,等待一下,谷歌会修复的。

祝翻墙无阻!

特别感谢 @neil_alpha,在和ta的对话中使我对这个问题有更深的思考

1 条评论: