java爬虫抓取网页数据( MaterialDesign重构了自己的新闻App,数据来源过程Get)
优采云 发布时间: 2021-10-08 17:34java爬虫抓取网页数据(
MaterialDesign重构了自己的新闻App,数据来源过程Get)
Java实现爬虫向App提供数据(Jsoup网络爬虫)
更新时间:2020年7月31日11:57:06 作者:学习编程知识
本文文章主要介绍Java爬虫为App提供数据的实现,即Jsoup网络爬虫。文章中的示例代码很详细,有一定的参考价值。有兴趣的朋友可以参考一下。
一、要求
最近,我基于 Material Design 重构了我的新闻应用。数据源有问题。
前人分析了知乎每日新闻和凤凰新闻等API。根据对应的URL,可以得到新闻的JSON数据。为了锻炼写代码的能力,打算自己爬新闻页面,获取数据来搭建API。
二、效果图
下图为原版网站
爬虫获取数据并显示在APP移动端
三、爬虫想法
App的实现过程请参考这些文章文章。本文主要讲解如何抓取数据。
Android下记录App操作生成Gif动态图的*敏*感*词*:///article/78236.htm
学习 Android Material Design(RecyclerView 而不是 ListView):///article/78232.htm
Android项目实战页面(RecyclerView):///article/78230.htm
Jsoup 简介
Jsoup 是一个 Java 开源 HTML 解析器,可以直接解析 URL 地址和 HTML 文本内容。
Jsoup主要有以下功能:
四、爬取过程
获取获取网页 HTML 的请求
新闻页面Html的DOM树如下:
下面这段代码使用代码根据指定的url获取get请求返回的html源代码。
public static String doGet(String urlStr) throws CommonException {
URL url;
String html = "";
try {
url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setDoInput(true);
connection.setDoOutput(true);
if (connection.getResponseCode() == 200) {
InputStream in = connection.getInputStream();
html = StreamTool.inToStringByByte(in);
} else {
throw new CommonException("新闻服务器返回值不为200");
}
} catch (Exception e) {
e.printStackTrace();
throw new CommonException("get请求失败");
}
return html;
}
InputStream in = connection.getInputStream();将输入流转换为字符串是一个常见的要求。我们把它抽象出来,写一个工具方法。
public class StreamTool {
public static String inToStringByByte(InputStream in) throws Exception {
ByteArrayOutputStream outStr = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
StringBuilder content = new StringBuilder();
while ((len = in.read(buffer)) != -1) {
content.append(new String(buffer, 0, len, "UTF-8"));
}
outStr.close();
return content.toString();
}
}
五、解析 HTML 获取标题
使用谷歌浏览器的审查元素,找出新闻标题的html代码:
关于举办《经典音乐作品欣赏与人文审美》讲座的通知
我们需要从上面的 HTML 中找到 id="article_title" 的部分,使用 getElementById(String id) 方法
String htmlStr = HttpTool.doGet(urlStr);
// 将获取的网页 HTML 源代码转化为 Document
Document doc = Jsoup.parse(htmlStr);
Element articleEle = doc.getElementById("article");
// 标题
Element titleEle = articleEle.getElementById("article_title");
String titleStr = titleEle.text();
六、获取发布日期和信息来源
还要找出对应的HTML代码
2015-05-28
??Դ:
浏览次数:
477
思路和上面类似。使用 getElementById(String id) 方法找出 id="article_detail" 作为 Element,然后使用 getElementsByTag 获取 span 部分。因为有 3 个 ...,它返回 Elements 而不是 Element。
// article_detail包括了 2016-01-15 来源: 浏览次数:177
Element detailEle = articleEle.getElementById("article_detail");
Elements details = detailEle.getElementsByTag("span");
// 发布时间
String dateStr = details.get(0).text();
// 新闻来源
String sourceStr = details.get(1).text();
七、分析浏览量
如果打印出上面的details.get(2).text(),你只会得到