从九九开始写一个JAVA网络爬虫

试着写了个Java的爬虫,当然不从零开始,所以从九九开始,知乎的页面和url比较简单,所以从知乎爬虫开始。

框架选择

主要Java开源爬虫框架有Nutch、crawler4j等,本文都没有采用。比较了现有爬虫的一些开源实现后,考虑到使用便捷性和扩展性,使用了黄亿华开发的webmagic,项目主页http://www.oschina.net/p/webmagic

webmagic做一个简单的爬虫功能方面也比较完备,按照作者的说法,参考了python的爬虫框架scrapy用Java进行设计开发,webmagic采用完全模块化的设计,功能覆盖整个爬虫的生命周期(链接提取、页面下载、内容抽取、持久化),支持多线程抓取,分布式抓取,并支持自动重试、自定义UA/cookie等功能。webmagic包含强大的页面抽取功能,开发者可以便捷的使用css、selector、xpath和正则表达式进行链接和内容的提取,支持多个选择器链式调用。感觉易用性和扩展性都相当不错。

框架选择后,基础的爬虫功能还是比较简单的,主要代码如下。

  1. public class ZhiQueFindPro implements PageProcessor {
  2. private static int num = 0;
  3. private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setUserAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31");
  4. @Override
  5. public void process(Page page) {
  6. page.addTargetRequests(page.getHtml().links().regex("^http://www\\.zhihu\\.com/question/\\d{8}$").all());
  7. String title = page.getHtml().xpath("//div[@id='zh-question-title']//h2/text()").toString();
  8. page.putField("title", title);
  9. }
  10. @Override
  11. public Site getSite() {
  12. return site;
  13. }
  14. public static void main(String[] args) {
  15. Spider spider = Spider.create(new ZhiQueFindPro()).addUrl("http://www.zhihu.com/question/38790945");
  16. spider.addPipeline(new ZhihuFilePipe());
  17. spider.thread(2).run();
  18. }
  19. }
  • 新建一个spider,在 spider中指定爬虫处理ZhiQueFindPro函数,爬虫起始url,线程等
  • 爬虫的UserAgent、RetryTimes、SleepTime需要在site里面设置。
  • 在Page处理中使用addTargetRequests添加继续爬的地址,运行时url貌似会自动去重,具体的实现要看下源码。
  • 从page中取出需要的内容,使用putField保存
  • 抓取过的page使用pipeline中的process函数处理

网页内容提取

知乎网页内容比较简单,爬取过后的内容直接使用xpath提取即可。

需要另外特别处理的是知乎中的图片外链与url外链,知乎的图片外链是带脚本带多个参数,url外链前的linktarget也要删掉。转换成最简单的普通外链。如图片脚本显示代码可用以下正则表达式除去。

  1. Pattern pattern = Pattern.compile("<noscript>[\\s\\S]*?</noscript>");

需要注意的是\之间可能有换行符,而java的正则表达式里的任意字符.是不能匹配换行的,应使用[\s\S]*来匹配noscript之间的全部内容,另注意使用*?来进行非贪婪匹配。

抓取内容处理

提取内容后,就可在pipeline中的process中对数据进行持久化

markdown与html中的互相转换

为了方便内容的保存与使用,抓取的网页内容中的html转换成markdown保存,需要在网页中展示内容时再将markdown转换成html显示

  • html转mardown: 使用Remark库,参考HTML转为markdown工具
  • markdown转html:使用pegdown将markdown转为html,pegdown支持多种扩展格式的markdown语法

抓取后的demo,参考http://wangluomei.com/blog/post/5 即是从知乎抓取后生成的。

0
特别说明: 本站资源来源于网络,仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您自己承担 如有侵犯您的版权,请及时联系admin@wangluomei.com,我们将尽快处理
没有账号? 忘记密码?