天天看点

java网络爬虫开发笔记

步骤:

0. 从一个/多个起始页面开始

1. 检查网页是否已经被爬过(mysql + connector-j)

2. 拉取网页内容(jsoup)

3. 解析网页,寻找其中的<a>标签(jsoup)

4. 将href属性中的内容作为压入队列

5. 跳转到1

技术栈(真的称得上什么技术栈吗)

1. jsoup处理http/https请求,并且解析网页元素

2. mysql做url链接去重(其实很原始)

初次涉足网络爬虫,主要也是看知乎上面天天吹python爬虫心痒痒,就选用了自己擅长的java来做。作为入门大致参考了文章:How to make a web crawler using Java?(话说这篇教程里面的代码还写错了,DB.java里面的finalize()写的是 if (conn != null || !conn.isClosed()),当conn真的是null的时候会报NullPointerException,也不知道作者是不是很久没碰java了)

实验1:从www.mit.edu出发,寻找在mit.edu域下的、含有“research”的页面。

初版代码照着教程直接打,没什么花样,不贴了。结果他Main.java这里processPage()下Jsoup.connect(url).get()这里没有try/catch块,碰到网络错误/链接爆炸直接报错,程序就停了,也是MDZZ。由于国内网速捉急,进度很慢,爬了一个多小时,总共才爬了1533个页面,平均一秒一个都不到(也是醉),找到的带有"reseach"的页面也很多(废话),就不贴出来了。

实验2:从首页 - 张鑫旭出发,扒zhangxinxu.com域下的所有页面,并输出到文件。

代码上主要就是去耦合了一点点,修正一些bug,把扒到的页面输出到一个output.txt,只有jsoup碰到的毛病才输到控制台(System.err),结果发现中文链接jsoup总是访问失败。稍微探索了一下,发现主要问题出在jsoup会把http重定向中Header里的Location的值重新urlEncode,就比如说我给他一个http://example.com/%12%34,然后它返回 301,Location是http://example.com/%12%34/,本应该继续跳转到http://example.com/%12%34/,结果jsoup会去访问http://www.example.com/%2512%2534(因为%被encode成%25),然后就404了。这个坑挺大,一时半会儿解决不了,换下一篇文章再说吧。

总结,java实现网络爬虫day1。