某天突发奇想,想自己写一个网络爬虫,然后上网查了前辈们的经历,发现网络爬虫好处多多,于是坚定了自己的决心。再上网一找,看到好多人推荐这本书,于是就以这本书为参考来实现自己的网络爬虫了!
首先都是照着书上的程序的运行,但毕竟这本书已经发行挺久了,于是可能会有一些误差,所以开这个博客记录一下自己的网络爬虫之路。
先说一下作者推荐的开源工具httpclient。作者用的应该是3.x,但是现在官网上已经没有这么旧的版本,而4.x与3.x的写法差距太大,对于像我这种新手来说容易晕头转向,找不到方向,后来百度到了3.1的一个版本,里面还有帮助文件下载地址:
然后就可以试着完成第一个简单的程序,但是这一步碰到了一些小问题:
1)关于文件名的问题,原程序是根据url获取文件名:
String filename = path.substring(path.lastIndexOf('/')+1);
这是一个截取子字符串的函数,从最后出现的"/"下一个字符到结尾,但是这样会产生一个小问题,比如说我设的path=http://www.baidu.com,这样保存的文件名就是www.baidu.com,系统会认为这是一个.com的文件,然后用记事本根本无法打开,所以我稍微改了一下:
String filename = path.substring(path.lastIndexOf('/')+1,path.lastIndexOf('.'));
这样截取的文件名就可以用记事本打开,里面的内容其实就是百度首页的源码。
2)关于post方法的调用
这里一开始弄得我很烦躁,因为需要一点网络知识,而且我钻了牛角尖了……一直在考虑源码中的两个参数是什么意思,后来因为程序编译老出错,就直接把参数注释了,结果程序也跑通了,保存的文件内容也是网页的源码(path="http://www.baidu.com"),这个时候我很迷惑,因为这样说来get和post方法根本没差!
去网上一搜,说的都是get和post的差别,主要是参数放置的差别,但是都没有解释参数有什么作用,参数的key-value值到底应该怎么设?后来想到了一个不是办法的办法,先从浏览器打开:http://www.lietu.com/search.jsp/query=flying,其实就是在猎兔网首页搜索关键字”flying“,然后我再用post方法设了一个参数:postMethod.addParameter("dw","flying");果然得到的结果和浏览器源码一致了。所以我的解释是,对于有参数的url来说两个方法差别明显,但对于主页这种没参数的来说,两个方法的结果应该是一致的!
第一个程序的总结到此为止。