webmagic根据xpath解析页面

来源:互联网 发布:手机解锁软件 编辑:程序博客网 时间:2024/06/01 07:54

昨天做页面的时候,有一个需求,大概要实现的功能就是用户输入一个网址url和一个xpath路径,根据这个xpath去用户给的url里解析,最后呈现出解析的结果,以达到用户判断自己写的xpath是否正确。

之前百度了一个网上的一种用htmlclean来解析的,我试了一下,效果还不错,也比较简单,毕竟人家是专门用来做解析的嘛。后面因为项目里用的爬虫框架是webmagic,想的是最好不要引用别的框架了,于是就用了webmagic来做了。

首先webmagic用来做html解析真的是太可惜了,号称是要做国产第一爬虫框架的webmagic,它的功能有多强大大家自行百度。

其实webmagic上手很简单,只需要写一个类来实现webmagic的PageProcessor接口,然后就可以用了。

import us.codecraft.webmagic.Page;import us.codecraft.webmagic.Site;import us.codecraft.webmagic.processor.PageProcessor;public class WebMagic implements PageProcessor {    private Site site;    private String xpath;    private Page page;    public void setPage(Page page){        this.page = page;    }    public Page getPage(){        return this.page;    }    public void setXpath(String xpath){        this.xpath = xpath;    }    public String getXpath(){        return this.xpath;    }    //这个方法的Page参数就是解析之后的内容    @Override    public void process(Page page) {        page.putField("content", page.getHtml().xpath(this.xpath).all());        this.page = page;    }}

然后在别的方法里面来启动webmagic

WebMagic webMagic = new WebMagic();webMagic.setSite(Site.me().setSleepTime(1000));//process方法需要用到xpath,所以要先初始化xpathwebMagic.setXpath(xpath);MemoryPipeline pipeline = new MemoryPipeline();Spider.create(webMagic)      .addUrl(url)      .addPipeline(pipeline)      .run();

这里本来我们可以直接通过

Spider.create(webMagic)      .addUrl(url)      .run();

这句来启动webmagic然后用我写的webmagic.getPage()方法来获取解析结果的,但是为了方便返回前台,又加了一个类MemoryPipeline来截取解析的结果

import java.util.Map;import us.codecraft.webmagic.ResultItems;import us.codecraft.webmagic.Task;import us.codecraft.webmagic.pipeline.Pipeline;public class MemoryPipeline implements Pipeline{    private Map<String, Object> dataMap;    @Override    public void process(ResultItems resultItems, Task arg1) {        dataMap = resultItems.getAll();    }    public Map<String, Object> getDataMap() {        return dataMap;    }    public void setDataMap(Map<String, Object> dataMap) {        this.dataMap = dataMap;    }}

最后通过一句

Map<String, Object> dataMap = pipeline.getDataMap();

来得到一个hashmap返回到前台去,再在前台遍历一下就可以了

拿百度测试一下,获取百度的title
这里写图片描述

成功!

呕心沥血写出来的,转载请一定注明出处!

2 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 1岁宝宝多动症怎么办 3岁宝宝胆小怎么办 爱挑食的孩子怎么办 小孩上课经常发呆怎么办 小孩不爱吃饭挑食怎么办 一年级小孩学习不好怎么办 宝宝上课坐不住怎么办 八个月婴儿拉稀怎么办 八个月孕妇拉稀怎么办 孩子好动爱喊怎么办 八个月小孩发烧怎么办 孩子好动怎么办学龄前教育 小孩好动症该怎么办 小孩子好动症该怎么办 怀孕5个月胎死亡怎么办 小孩多动调皮怎么办 手心老是出汗是怎么办 孩子吃饭特别慢怎么办 小孩子老想睡觉怎么办 孩子下午上课犯困怎么办 小孩子有多动症该怎么办 初中写作业犯困怎么办 孩子晚上学习困怎么办 小孩子容易兴奋激动怎么办 中考时过度兴奋怎么办 小孩兴奋不睡觉怎么办 孩子突然反常不听话怎么办? 婴儿亢奋不睡觉怎么办 宝宝听力筛查没通过怎么办 7个多月宝宝缺钙怎么办 暑假孩子天天看电视怎么办 移植后天天便秘怎么办 天天拉屎还便秘怎么办 孩子不爱吃鸡蛋怎么办 孩子看书没耐心怎么办 5岁宝宝鼻炎怎么办 手术后认知障碍怎么办 孩子很调皮好动怎么办 学生打家长该怎么办 老师打学生家长该怎么办 三岁儿子多动症怎么办