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

2022-05-06 19:38:19 浏览数 (1)

本次抓取地址: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.抓取开源中国新闻(新版)

代码语言:javascript复制
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函数为获取某一页的数据,接收页数作为参数,返回当前页的数据条数。

代码语言:javascript复制
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.结果展示

0 人点赞