想要把draw2d的在线API下载到本地。
相信很多人都有类似的想法,因为在线看毕竟不方便。
最先想到的是使用网络爬虫工具爬取网页(比如WinHTTrack),以前经常用,但是试了试,对于draw2d的API,地址:http://draw2d.org/draw2d_touch/jsdoc_6,至现在下来了首页,内容全都没有下载下来。
最好的工具,适应性有限制,所以想到自己写一个,当然,写之前,先找找源码,居然还真找到了,基于nodejs的,地址:http://www.cnblogs.com/wadeyu/archive/2015/07/10/4636170.html,试了一下,虽然代码没问题,但是api还是没有下载下来。
然后自己用as写了一个,参考了上面的nodejs版的。通过审查元素,我发现<a>标签的href属性是“/#!/api/draw2d.Connection”这种格式,而当前页面的地址可能是“http://draw2d.org/draw2d_touch/jsdoc_6/#!/api/draw2d.Canvas ,首先想到的是,是不是真实的地址应该是“http://draw2d.org/draw2d_touch/jsdoc_6/”+a.href呢?试验了一把,还真下载到东西了,只不过下载到的文件,每一个都是66k,内容都是只有导航,没有正文。
从控制台看到,当点击某一项时,除了一些gif,png图片之外,还有一个js文件,提示没有找到。通过跟踪js的报错,最终找到,http://draw2d.org/draw2d_touch/jsdoc_6/output/draw2d.Canvas.js?callback=Ext.data.JsonP.draw2d_Canvas&_dc=1463386721861没有加载到,单独加载这个地址,发现,返回的就是正文的内容,不知道“?”后边的参数是什么含义,直接去掉,发现也没有问题。
也就是说,需要提取<a>href地址“/#!/api/draw2d.Connection”中api后面的内容“draw2d.Connection”然后加上后缀名“.js”作为文件名,赋值给变量url,加载“http://draw2d.org/draw2d_touch/jsdoc_6/output/”+url,下载之后保存到output文件夹下。最后把output文件夹整体剪切到用WinHTTrack爬取的文件的index.html的同级目录(同级还有resources、extjs文件夹)。打开index.html,点击左侧的导航果然可以了。
美中不足是,好多图片或者iframe的内容还是没有下载下来。
<a>标签href中的“#!”还是第一次见,查了一下,http://www.zhihu.com/question/19946782这里说的比较靠谱:
链接:http://www.zhihu.com/question/19946782/answer/13441584
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
但近年来 hash tag 越来越多地被用于 AJAX 请求获取数据,不同 hash tag 对应的网页内容也有所不同,为了有效地区别这种情况和过去传统的页内锚点标示,让搜索引擎更好地抓取 AJAX 数据,Google 提出的解决方案 (似乎是在 2009 年) 是用 #! (被称为 hashbang ) 来进行区分,他们将带有 #! 的 URL 称为 pretty AJAX URL (http://code.google.com/web/ajaxcrawling/docs/getting-started.html F.Y.I.)。当网页爬虫遇到这样的 URL 就会将带不同 hash tag 的 URL 当做不同内容来进行抓取,从而获得更全的信息。
Google 的这一方案如果被其他搜索引擎广泛采纳 (据说 Bing 和 Yahoo! 可能都已支持),无疑将成为一个事实标准,如果富 AJAX 网站想进行进一步的 SEO,也就会越来越多地支持这样的格式。
以下个人理解。
其实也就是说:#后面的内容服务器是不解析的,比如请求“http://draw2d.org/draw2d_touch/jsdoc_6/#!/api/draw2d.Canvas”,对于服务器来说,和请求http://draw2d.org/draw2d_touch/jsdoc_6/是一样的,到浏览器之后,浏览器认识“#”,叫页内锚点,但是#加上后边那一大堆,其实锚点是不存在的,所以浏览器也就忽略了,服务器和浏览器都不处理,最后,我们就可以用js来处理了。获取请求的地址字符串,燃火获取到"#!"后边的内容,然后加载相应的内容,替换页面某个标签的innerHTML。
折腾了半天,虽然文字内容是下载下来了,但是还是不完善,而且遇到其他格式还得重新分析,通用性太差。
能不能有一种方法,能够适用所有的情况呢?
目前我能想到的是用缓存的方法。虽然浏览器自带缓存机制,但是我们会经常需要清空缓存,所以,如果有一个工具专门用来加载并管理各种API,感觉还是很实用的。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。