Tony Tsai

May the force of science be with you

Aug 23, 2014 - 3 minute read - Comments - Mac OS X

Host Is Down Using curl/wget While Page Loads in Browser


问题描述

最近想更新自己开发的geoChina,发现在Mac上运行以下代码

library(geoChina)
geocode('Tsinghua University', api = 'google', ocs = 'GCJ-02', messaging = T)

出错,返回

1
2
3
4
5
6
calling http://maps.googleapis.com/maps/api/geocode/json?address=Tsinghua%20University&sensor=false ...
Warning message:
In readLines(connect, warn = FALSE) :
  unable to connect to 'maps.googleapis.com' on port 80.
Error in fromJSON(paste(readLines(connect, warn = FALSE), collapse = "")) : 
  error in evaluating the argument 'content' in selecting a method for function 'fromJSON': Error in readLines(connect, warn = FALSE) : cannot open the connection

geocode封装的调用直接在浏览器里打开,能返回正确的json结果。而且该函数在Windows上运行正常。

问题分析

geoChina的开发的确是在Mac上完成的,但代码并没有针对不同的操作系统作了不同处理。因此可以初步判断是Mac操作系统的终端网络通讯出现了问题。http服务默认80端口,https服务默认443端口,从报错信息来看,终端网络通讯的80端口出现了问题。

curlwget命令能够实现终端网页数据内容下载,因此可以用来验证初步判断。在终端输入

$ wget www.google.com

返回

Resolving www.google.com... 2404:6800:4005:805::1012, 173.194.127.244, 173.194.127.242, ...
Connecting to www.google.com|2404:6800:4005:805::1012|:80... failed: Host is down.

输入

$ curl -v -L www.google.com

返回

* Rebuilt URL to: www.google.com/
* Hostname was NOT found in DNS cache
*   Trying 2404:6800:4005:801::1010...
*   Trying 173.194.127.241...
* connect to 2404:6800:4005:801::1010 port 80 failed: Host is down
* connect to 173.194.127.241 port 80 failed: Host is down

都显示连接失败,Host is down。而将访问的网站换成国内网站,比如www.baidu.com,则都能访问成功,下载到网站首页。

这说明终端网络通讯80端口出问题的只是google等国外易干扰服务,而不是国内网络服务。自己Mac上的应用程序有此影响的只能是代理服务了。经过一番google,发现有人遇到和我十分类似的[1],回答都是代理作祟,基本可以肯定是自己使用GoAgent代理导致终端无法通过80端口访问google服务。

问题解决

[1]给出的解决方案是在终端设置http/https代理,google Mac OS X终端设置代理的方法,找到[2]。只需清楚GoAgent代理服务端口,然后编辑~/.bash_profile文件,输入

export http_proxy='http://localhost:8103'
export https_proxy='http://localhost:8103'

保存.bash_profile文件,在终端更新.bash_profile生效

$ source .bash_profile

现在curlwget命令都可以通过代理访问google服务了,但Mac上geoChina::geocode运行还是时好时坏,看来geoChina的开发维护只能暂时转到Windows上了。

如有同侪知道解决办法,烦请邮件告知。


PS:本文采用了添加文内注释/参考文献引用Markdown写法。

参考链接

[1]: Unable to resolve host using curl/wget while page loads in browser

[2]: 如何为MacOS X终端设置代理

更新

由于GFW的原因,Google服务在国内的使用受影响。在国内调用Google Maps API时推荐使用ditu.google.cn,而不是maps.google.com。解决思路是通过调用GeoIP服务,查询用户是在国内还是国外,指定不同的Google Maps API调用链接。geoChina已更新至1.1.3