java爬虫抓取动态网页(MaterialDesign重构了自己的新闻App,数据来源是个问题)
优采云 发布时间: 2022-04-08 22:14java爬虫抓取动态网页(MaterialDesign重构了自己的新闻App,数据来源是个问题)
一、要求
最近基于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();把输入流转成字符串是常见的需求,我们把它抽象出来,写一个工具方法。
五、解析 HTML 得到标题
使用 google 浏览器的 censor 元素找出新闻标题的 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(),只会得到