抓取网页新闻(关于Jsoup分析与思路虎扑NBA新闻网页的新闻列表)
优采云 发布时间: 2021-11-24 11:16抓取网页新闻(关于Jsoup分析与思路虎扑NBA新闻网页的新闻列表)
前言:作为一个篮球迷,你必须每天阅读NBA新闻。用了这么多新闻类APP,不知道自己是否也可以做一个简单的新闻类APP。于是我用Jsoup抓取了虎扑NBA新闻的数据,完成了一个简单的新闻APP。虽然没有技术含量,但还是写一下过程,满足菜鸟的小小成就感。
关于Jsoup
分析与思考
虎扑NBA新闻页面的新闻列表如图所示:
我们要做的就是获取图片中每条新闻的新闻标题、新闻摘要、新闻时间和来源、新闻链接地址这四个信息,然后用一个实体类News来封装以上四个数据,然后将其布局在 ListView 上。点击ListView的每个子项,用一个WebView显示子项显示的新闻链接地址,就大功告成了。效果如下:
具体实施过程
1. 在AndroidStudio中新建项目JsoupTest,然后将Jsoup jar包【下载地址】复制到项目的libs中,然后右键Add As Library...
2. 修改activity_main.xml的布局,简单的添加一个ListView,设置Listview每两个子项的间隔距离和颜色
3. 创建实体类News,封装我们将从网页中获取的新闻标题、摘要、时间来源、链接地址四个数据。很简单,用四个变量来表示以上四个数据,建立对应的构造方法和四个变量的get、set方法。
public class News {
private String newsTitle; //新闻标题
private String newsUrl; //新闻链接地址
private String desc; //新闻概要
private String newsTime; //新闻时间与来源
public News(String newsTitle, String newsUrl, String desc, String newsTime) {
this.newsTitle = newsTitle;
this.newsUrl = newsUrl;
this.desc = desc;
this.newsTime = newsTime;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public String getNewsTime() {
return newsTime;
}
public void setNewsTime(String newsTime) {
this.newsTime = newsTime;
}
public String getNewsTitle() {
return newsTitle;
}
public void setNewsTitle(String newsTitle) {
this.newsTitle = newsTitle;
}
public String getNewsUrl() {
return newsUrl;
}
public void setNewsUrl(String newsUrl) {
this.newsUrl = newsUrl;
}
}
4. 最重要的一步:使用Jsoup获取虎扑NBA新闻网页的数据,封装在News实体类中。简单总结一下实现方法
分析上图中两条新闻的源代码,找到我们想要获取的新闻标题、摘要、时间和来源、链接地址这四个数据。我们可以发现,在每条新闻的标签[div][/div]下,有两个数据,新闻的链接地址和新闻的标题。我们要做的就是使用Jsoup来解析这两个数据:
首先使用 Jsoup.connect("要获取的数据的 URL").get() 获取一个 Document 对象
Document doc = Jsoup.connect("https://voice.hupu.com/nba/").get();
使用方法doc.select("div.list-hd")返回一个Elements对象,封装了每个新闻[div][/div]标签的内容,数据格式为:[{新闻1},{新闻2 }, {新闻 3}, {新闻 4}......]
使用 for 循环遍历 titleLinks,对于每个 Element 对象:
使用e.select("a").text()获取[a][/a]之间的内容,即新闻标题;
使用e.select("a").attr("href")获取每个标签中href的值,即新闻的链接地址
Elements titleLinks = doc.select("div.list-hd");
for(Element e:titleLinks){
String title = e.select("a").text();
String uri = e.select("a").attr("href");
}
同理对于另外两个数据:news profile和news time and source,我们分析源码,分析news profile的源码
使用以下代码获取新闻简介
元素 descLinks = doc.select("div.list-content"); for(Element e: titleLinks){ String desc = e.select("span").text();}
元素 timeLinks = doc.select("div.otherInfo"); for(Element e:timeLinks){ String time = e.select("span.other-left").select("a").text();}
综上,我们已经获得了我们需要的数据,所以我们在MainActivity中声明了一个getNews()方法。在方法中,我们启动一个线程来获取数据。完整代码如下:
<p>private void getNews(){
new Thread(new Runnable() {
@Override
public void run() {
try{
//获取虎扑新闻20页的数据,网址格式为:https://voice.hupu.com/nba/第几页
for(int i = 1;i