java爬虫抓取动态网页(MaterialDesign重构了自己的新闻App,数据来源是个问题)

优采云 发布时间: 2022-04-08 22:14

  java爬虫抓取动态网页(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(),只会得到

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线