无论这个有点像寓言的故事是否属实,年轻技工的妙计确实让人称叹。有时遇到问题常规的思路虽然合乎逻辑,涉及的知识和技术广深看上去更成为其合理性的背书,但往往被人忽视的直接简单的方法能收到四两拨千斤的奇效。
不久前想到将自己的微博下载备份,一则因为有时网站过分敏感删除了贴子,二则也想将多年来的发言备份一下以备整理和回顾。最初的想法自然是找现成的服务和软件。搜索到的几个微博应用和网站不是已过期关闭,无法工作,就是功能有限。一个客户端软件看演示能备份所有微博,但似乎不能增量备份,而且下载的数据保存在数据库里,浏览时须再选择文件格式导出。现成的工具不理想,只有自己动手。
搜索这些软件时注意到微博的API似乎有读取微博条数的限制,也不想专为自己的备份工具又去研究一套API,就准备直接在程序中读取微博的分页页面,解析出其中想要的文本日期等信息。这种途径的缺点就和写GreaseMonkey脚本一样,分析页面的部分由网页的HTML代码决定,一旦那些网页改版,程序就会失效需要重写。不过程序的读取网页和保存数据部分只要设计得与分析网页部分分离,就不受影响。
思路既定,接下来的问题就是选择开发的语言。Python、Java、C#都有类库能完成以上功能,Python的开发效率,尤其是在这种小程序和搭建原型上,优于其他。遂决定采用之。
虽然我对Python不甚熟,读取网页、分析、保存这些功能涉及到的模块都需查参考,但Python简洁清晰的语法和方便调试学习的控制台不负我的选择,很快写出读取微博网页的几行代码,问题是获得的HTML不能被xml.dom.minidom解析,打印出HTML,原来访问该URL时,网站首先返回的是一个校验页面,在浏览器内打开后会自动跳转到目的页面。要在Python程序里模拟执行校验页面内的JavaScript显然太难。
转换思路,我把目的页面先手工下载,再用程序解析,让这个工具从全自动变成半自动。下载页面可选取HTML或文本格式。后者比前者短小得多,因而我决定改用正则表达式分析该文本,代替原来的DOM解析方案(事后看来因为文本的“噪声”太多,正则表达式方案并不省事)。经过几轮调试,下载的文本页面被解析并输出到另一个文本文件,每条微博只包括日期、正文、转发内容等必要信息。
迄今我的微博历史有三十多页,半自动处理了好几页后,我浏览这些“干净”的文本,觉得清晰和易读程度比不上网页,原因是转发和评论的微博有太多//、@字符和链接地址,与文本没有格式差别地混在一起,与图片相关的微博又因为看不见图片显得无的放矢。但如果程序再去读取图片,并和文本显示在一起,势必大大增加工作量。
踌躇之际,我想到用最原始的方法试试,将网页内容直接复制粘贴到Word文档里。Windows的剪贴板和Word会尽量显示忠于原网页的富文本,几秒钟处理和下载后,得到的Word文档显示效果虽不及网页,但却远胜于我程序得到的文本——链接自动转换、图片自动下载嵌入、评论与微博原文区分也更明显。不会编程的人最先想到的应该就是这个方法,和种种有构思需学习的方案相比,最简单的竟是最有效的!
实际上在工作中为客户的需求开发程序这类情况也是比比皆是。直接从客户提出的原初需求出发,时常会事倍功半,就像被困在山洞里的人努力挖掘前进,若是方向不对,要挖穿大山才得见天日。此时如果停下,跳脱出给自己设定的宏伟任务,返回用户需求的本质,体会用户面对的问题,往往能另辟蹊径。或是转换解决问题的途径,或是改变看待问题的角度。或是避重就轻,或是从根本上取消问题,或是在IT系统外解决……
推而广之,这样让人豁然开朗的灵机一动在生活中何尝不是难能可贵。曹冲称象、司马光砸缸,都让人想起那个笑话和电影里的苏联宇航局“研发”出的铅笔的故事。
原文地址:http://blog.csdn.net/starrow/article/details/43562857