Java数据采集-6.获取开源中国新闻列表(翻页-2)

本次抓取地址:https://www.oschina.net/news
项目源码:https://github.com/geekfly2016/Spider
代码目录:Spider/src/xyz/geekfly/get_list/OSCHINA_NEWS.java

1.打开目标网址,打开开发者工具,清空控制台

这里写图片描述

2.拖动滚动条到底部

这里写图片描述
在一堆请求中,我们可以看到有一个xhr的请求,地址如get_more_news_list,那它肯定就是翻页加载数据的Url请求了。
可点击xhr进行过滤Url请求,xhr即为Ajax类型的请求。)


这里写图片描述
点击该链接,在Header中,我们可以看到请求地址,请求类型,参数等,参数中的p即为获取第p页的数据,有些网站还会包括每页的数据条数,根据实际情况添加即可。


这里写图片描述
点击response可以查看返回的数据,细心的同学已经看到返回的数据和Java数据采集-3.抓取开源中国新闻(新版)博客中介绍的一致,此处不再做过多介绍。

3.解析数据

forEachData为解析每一页数据的,获取具体的每一条的相关信息。
以下代码详细介绍参考:Java数据采集-3.抓取开源中国新闻(新版)

public static void forEachData(Elements items){
        String host = "https://www.oschina.net";
        for(Element item: items){
            //过滤广告
            if(!item.attr("data-tracepid").isEmpty()){
                continue;
            }
            // 标题
            String title = item.select("a").first().text();

            //标题地址
            String title_href = item.select("a").first().attr("href");
            if(!title_href.startsWith("https://")){
                title_href = host + title_href;
            }
            //描述
            String desc = item.select("div[class=sc sc-text text-gradient wrap summary]").text();

            //作者头像
            String author_image = item.select("img[class=avatar]").attr("src");
            //String author_image = item.select("img").first().attr("src");

//          System.out.println(item);
            Element mr = item.select(".from .mr").get(0);
            //作者
            String author = mr.select("a").text();
            // 从span[class=mr]中移除a标签,输出的即为发布时间
            mr.select("a").remove();
            String published = mr.text();

            String number = item.select(".from .mr").last().text();
            System.out.println("\t"+ title);

        }

4.构造循环

在主函数中,使用循环获取每一页的数据,由于此类型的网站并不知道总页数,所以一般需要根据看是否还能获取到数据来判断结束。
getPageData函数为获取某一页的数据,接收页数作为参数,返回当前页的数据条数。

public static void main(String[] args) throws IOException {

        for(int page_number=1;;page_number++){
            int data_rows = getPageData(page_number);
            System.out.println("当前执行:" + page_number + "页,数据数:" + data_rows);
            //返回数据为空时,结束循环
            if(data_rows == 0){
                break;
            }
        }
    }

    public static int getPageData(int page_number) throws IOException{
        String page_url = "https://www.oschina.net/action/ajax/get_more_news_list?newsType=&p=" + page_number;

        Document document = Jsoup.connect(page_url) 
                .userAgent("ozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36") 
                .post(); 

        //获取样例 69条 共7页
        Elements items = document.select("div[class=item box]");  
        forEachData(items);
        return items.size();
    }

5.结果展示

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值