SeimiCrawler抓取并整合多页新闻(即内部翻页)

15 Jun 2016

有些站点为了pv能更高一些(或是文章太长名曰优化用户体验),就会把一个文章拆成多页,分页来展示。面对这种情况,使用SeimiCrawler该如何抓取呢?下面给出一个简单的样例,仅供大家拍砖。

import cn.wanghaomiao.seimi.annotation.Crawler;
import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;
import cn.wanghaomiao.seimi.struct.Request;
import cn.wanghaomiao.seimi.struct.Response;
import cn.wanghaomiao.xpath.model.JXDocument;
import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * 内分页文章整合抓取
 * @since 2016/6/14.
 */
@Crawler(name = "mutipagenews")
public class MutiPageNewsCrawler extends BaseSeimiCrawler {
    @Override
    public String[] startUrls() {
        return new String[]{"http://bbs.miercn.com/bd/201606/thread_744157_1.html"};
    }

    @Override
    public void start(Response response) {
        try {
            JXDocument document = response.document();
            //获取上游处理函数传过来的数据,如果为空则初始化一个,一会要用来向下游传递数据
            Map<String,String> meta = response.getMeta()!=null?response.getMeta():new HashMap<String, String>();
            String preBody = meta.get("body")!=null?meta.get("body"):"";
            meta.put("body",preBody+StringUtils.join(document.sel("//div[@id='cc2']//text()"),""));

            String urlPrefix = response.getUrl().substring(0,response.getUrl().lastIndexOf("/")+1);
            //拿到下一页的地址后缀
            String nextPage = StringUtils.join(document.sel("//div[@class='page1']/a[text()*='下一页']/@href"),"");
            if (nextPage.matches(".*thread_\\d+.*")){
                //用这一个回调函数就够了
                Request req = Request.build(urlPrefix+nextPage,"start");
                logger.info("nextPage={}",req.getUrl());
                //用来向下游回调函数传送数据
                req.setMeta(meta);
                push(req);
            }else {
                //已经收集完毕
                logger.info("完整新闻体为:{}",meta.get("body"));
            }
        }catch (Exception e){
            logger.debug(e.getMessage(),e);
        }
    }
}

启动后,最终整合后的完整文章输出如下:

00:44:59 INFO  c.w.crawlers.MutiPageNewsCrawler - 完整新闻体为:   一、 微博“少奶奶门”轰动揭开“土豪”汤珈铖 汤珈铖,1983年出生,本名汤子同,还真是年轻有为啊!汤臣集团副主席、执行董事。其父汤君年是汤臣集团创始人兼董事长,其母徐枫是上世纪70年代武打女演员。 点击图片进入下一页   二、 首富万达之子-王思聪 王思聪1988年1月3日出生,身高179cm,是2010年中国首富万达集团老总王健林的独子。最近微博爆料他豪言:我们是东方壕莱坞,真是高端大气啊!看他的贴:王思聪来了 豪言:我们是东方壕莱坞 .王思聪之火以就是因为 2011年4月4日凌晨,他在微博上炮轰张兰母子,一夜之间,王思聪成为微博和天涯红人,有人认为这才是真正的“富二代”,绝非“京城四少”可比哦!    三、煤场老板之子–中国梦之声杨成瑞 杨成瑞1992年7月28日生于山东泰安,中国内地男演员、歌手, 2012年自费制作单曲《爱在当时》,2013年杨成瑞参加中国梦之声。 在杨成瑞平时的微博中,可见他穿戴都比较讲究,Gucci手提包和爱马仕皮带如影随形,能如此大手笔出唱片,找粉丝,有关他富二代的传闻浮出水面。   点击图片进入下一页 米尔军事论坛 bbs.miercn.com www.miercn.com 军情第一站   五、汪雨–上海地产界大亨汪道涵之子 汪雨,上海地产界大亨,前上海市市长汪道涵之子(三公子),是汪道涵第二任太太所生,身高172厘米,体重大约60公斤,曾去过美国留学,毕业后返回上海经营艺术公司。汪雨同张敏、赵薇、黄奕、陈紫函、蒋欣等女明星传有绯闻。   转自米尔军情网 http://www.miercn.com www.miercn.com 爱国交流理性平台  六、王烁-商业巨富王志才之子 王烁,北京人,商业巨富之子,周迅的前男友。之前媒体曾错误报道其名字为王朔,后经网友曝料,真名为王烁,是“晴妈”王艳的继子,房祖名的好友。王烁的父亲王志才,拥有京城多家房地产公司,“金钱豹”也是他的家业之一,其家产估值约为100亿以上。      七、汪小菲– 俏江南集团创始人张兰的独子 汪小菲,1981年06月27日出生于北京,俏江南集团创始人张兰的独子。现任俏江南集团总裁,合润麟(北京)食品有限公司董事长。 2010年底他与台湾艺人徐熙媛(大S)闪电订婚轰动娱乐圈,并于同年11月16日在北京市朝阳区民政局注册登记结婚。他们的婚礼于2011年3月22日在海南三亚举行。 www.miercn.com 军情第一站     八、李泽楷–香港富商李嘉诚之子 李嘉诚之子李泽楷 不能被遗忘的富二代啊 !他1966年11月8日生于香港,广东潮州人,祖籍广东潮州。1989年从美国回香港和黄任职,仅十年时间,便在事业上创造了辉煌,成为世人瞩目,有着“小超人”美名的香港第二大富商。

如有其他疑问欢迎随时通过各种渠道沟通 SeimiCrawler