使用webmagic抓取页面并保存为wordpress文件

之前做过一年的爬虫,当年功力不够,写的代码都是一点一点往上加。后来看了下据说是最优秀的爬虫scrapy的结构,山寨了一个Java版的爬虫框架webmagic

这个框架也分为Spider、Schedular、Downloader、Pipeline几个模块。此外有一个Selector,整合了常用的抽取技术(正则、xpath),支持链式调用以及单复数切换,因为受够了各种抽取的正则,在抽取上多下了一点功夫。

废话不多,上代码。在webmagic里直接实现PageProcessor接口,即可实现一个爬虫。例如对我的点点博客http://progressdaily.diandian.com/进行抓取:

    public class DiandianBlogProcessor implements PageProcessor {

        private Site site;

        @Override
        public void process(Page page) {
            //a()表示提取链接,as()表示提取所有链接
            //getHtml()返回Html对象,支持链式调用
            //r()表示用正则表达式提取一条内容,rs()表示提取多条内容
            //toString()表示取单条结果,toStrings()表示取多条
            List<String> requests = page.getHtml().as().rs("(.*/post/.*)").toStrings();
            //使用page.addTargetRequests()方法将待抓取的链接加入队列
            page.addTargetRequests(requests);
            //page.putField(key,value)将抽取的内容加入结果Map
            //x()和xs()使用xpath进行抽取
            page.putField("title", page.getHtml().x("//title").r("(.*?)\\|"));
            //sc()使用readability技术直接抽取正文,对于规整的文本有比较好的抽取正确率
            page.putField("content", page.getHtml().sc());
            page.putField("date", page.getUrl().r("post/(\\d+-\\d+-\\d+)/"));
            page.putField("id", page.getUrl().r("post/\\d+-\\d+-\\d+/(\\d+)"));
        }

        @Override
        public Site getSite() {
            //site定义抽取配置,以及开始url等
            if (site == null) {
                site = Site.me().setDomain("progressdaily.diandian.com").setStartUrl("http://progressdaily.diandian.com/").
                        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");
            }
            return site;
        }
    }

然后实现抓取代码:

    public class DiandianProcessorTest {

        @Test
        public void test() throws IOException {
            DiandianBlogProcessor diandianBlogProcessor = new DiandianBlogProcessor();
            //pipeline是抓取结束后的处理
            //ftl文件放到classpath:ftl/文件夹下
            //输出默认放到/data/temp/webmagic/ftl/[domain]目录下
            FreemarkerPipeline pipeline = new FreemarkerPipeline("wordpress.ftl");
            //Spider.me()是简化写法,其实就是new一个啦
            //Spider.pipeline()设定一个pipeline,支持设置多个pipeline,多个pipeline会进行链式调用
            //FileCacheQueueSchedular保存url,支持断点续传,临时文件输出到/data/temp/webmagic/cache目录
            //Spider.run()执行
            Spider.me().pipeline(pipeline).schedular(new FileCacheQueueSchedular(diaoyuwengProcessor.getSite(), "/data/temp/webmagic/cache/")).
                    processor(diaoyuwengProcessor).run();
        }
    }

跑一遍之后,将所有输出的文件,合并到一起,并加上wp的头尾,就是wordpress-backup.xml了!

代码已开源https://github.com/code4craft/webmagic<strike>有什么邪恶用途你懂的…</strike>

转载于:https://my.oschina.net/flashsword/blog/136846

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值