博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用webmagic抓取页面并保存为wordpress文件
阅读量:7013 次
发布时间:2019-06-28

本文共 2621 字,大约阅读时间需要 8 分钟。

hot3.png

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

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

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

public class DiandianBlogProcessor implements PageProcessor {        private Site site;        @Override        public void process(Page page) {            //a()表示提取链接,as()表示提取所有链接            //getHtml()返回Html对象,支持链式调用            //r()表示用正则表达式提取一条内容,rs()表示提取多条内容            //toString()表示取单条结果,toStrings()表示取多条            List
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了!

代码已开源<strike>有什么邪恶用途你懂的…</strike>

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

你可能感兴趣的文章
Java多线程之并发安全经典案例-卖票
查看>>
从程序员的角度设计一个Java的神经网络
查看>>
一种在 Library 模块中调用 Application 模块功能的方法
查看>>
远程入侵原装乘用车(中)
查看>>
人手一份核武器 - Hacking Team 泄露(开源)资料导览手册
查看>>
一起撸个朋友圈吧 点赞列表背景问题修复
查看>>
面试官,你再问我 Bit Operation 试试?
查看>>
PSV 3.60 固化升级到 3.68 破解完全攻略
查看>>
Android 路由框架
查看>>
当Kotlin遇见RxJava多数据源
查看>>
vue踩坑记- Cannot find module 'wrappy'
查看>>
【实操干货】KVM命令管理虚拟机与性能优化
查看>>
前端架构思想:聚类分层
查看>>
如何使用Thinkphp搭建商城系统(一)
查看>>
网易云副总经理陈谔:平台+场景化塑造差异优势
查看>>
Java架构师最关键三个思维转变方式
查看>>
OpenGL Android课程四:介绍纹理基础
查看>>
URL中“#” “?” &“”号的作用
查看>>
jQuery_渐隐式轮播效果插件封装
查看>>
以太坊2.0协议核心Beacon链详解
查看>>