Java数据采集-3.抓取开源中国新闻(新版)

2022-04-24 15:08:47 浏览数 (1)

最近看之前写的几篇网页数据采集的博客,陆陆续续的有好友发私信交流,又想重新整理一下这些了,抽空继续更新本系列博客。

针对开源中国新闻列表新版,重新写代码抓取。

网址:https://www.oschina.net/news jar包:jsoup.1.7.2.jar 项目源码:https://github.com/geekfly2016/Spider

  • 分析新闻列表所在位置
  • 根据上图我们可以看出,新闻列表全部都在该div下。
代码语言:javascript复制
<div class="news-list-item" id="all-news">
<!--文章列表-->
</div>
  • 单个新闻位于该div下。
代码语言:javascript复制
<div class="item box"></div>
  • 故选择新闻列表的代码即为:
代码语言:javascript复制
Elements items = document.select("#all-news .item");
System.out.println(items.size());

注:因为class有两个,item和box,由于Jsoup选择器中需写两个select,此处使用一个即可精确匹配。可参看:http://blog.csdn.net/ywf008/article/details/53215648

  • 分析单条新闻信息
  • 标题位于第一个a标签下,标题地址为href参数
代码语言:javascript复制
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;
            }

注:抓取时打印链接发现部分链接已为完整的,有些许自行拼接域名,故此处加了判断是否已https://开始。

  • 新闻描述
代码语言:javascript复制
String desc = item.select("div[class=sc sc-text text-gradient wrap summary]").text();

对于属性有多个值得时候,除了上述提到的使用某个能确定的值或者使用多个select选择器外,也可以使用div[class=xx yy zz]这种模式匹配(推荐方式)。

  • 用户头像
代码语言:javascript复制
String author_image = item.select("img[class=avatar]").attr("src");

或者

代码语言:javascript复制
String author_image = item.select("img").first().attr("src");

获取方式都不唯一

  • 作者姓名
代码语言:javascript复制
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();
  • 获取评论数
代码语言:javascript复制
String number = item.select(".from .mr").last().text();

至此,我们已经可以完整获取当前页的新闻数据了。 注:新闻列表数据中包含一条广告数据

  • 过滤代码
代码语言:javascript复制
//过滤广告
if(!item.attr("data-tracepid").isEmpty()){
    continue;
}

仓库:https://github.com/geekfly2016/Spider 代码目录:Spider/src/xyz/geekfly/oschina/News.java

0 人点赞