java抓取网页内容(.getEntity实现方案,解析本地弹幕xml文件的代码如下)

优采云 发布时间: 2022-01-04 12:14

  java抓取网页内容(.getEntity实现方案,解析本地弹幕xml文件的代码如下)

  (一)实现思路一,定位弹幕文件

  一般使用json或者xml格式来保存弹幕,所以我们只要在视频网页中找到xml文件或者json文件就可以定位弹幕文件。

  2.解析弹幕文件

  然后通过jsoup解析文件,提取出我们弹幕的文本内容。

  (二)第一个实现方案,解析本地文件1,定位弹幕文件

  比如我们要抓取下面视频的弹幕文件。

  

  打开Chrome的Network后刷新网页,然后在输入框中输入xml,过滤掉xml文件资源:

  

  将光标移动到文件上,可以看到文件的具体地址如下:

  

  在文件上右击Open in new tab,在新的浏览器页面查看弹幕文件的内容:

  

  2.解析弹幕文件2.1 创建基础maven工程

  

  输入 GroupId 和 ArtifactId

  

  本项目将使用jar包jsoup,所以在项目根目录下创建lib目标,将jar复制进去,然后将jar包构建到项目中,如下:

  

  选择 jar 并单击“确定”。

  

  2.2 在项目根目录下创建弹幕文件

  在根目录创建一个3232417.xml文件,复制弹幕页面的内容,保存在文件中。只需全选并直接复制即可。我们后面解析文件的时候,只会提取有用的文本,所以第一行内容不需要去掉,如下:

  

  2.3 代码实现

  解析本地弹幕xml文件的代码如下:

  import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.File; import java.util.ArrayList; /** * Created by shuhu on 2018/1/20. */ public class LocalFile { public static ArrayList getData(String fileName){ ArrayList list = new ArrayList(); try{ File input = new File(fileName); Document doc = Jsoup.parse(input, "UTF-8"); //每条弹幕的内容都处于标签中,于是根据该标签找到所有弹幕 Elements contents = doc.getElementsByTag("d"); for (Element content : contents) { list.add(content.text()); //将标签中的文本内容,也就是弹幕内容,添加到list中 } } catch (Exception e) { e.printStackTrace(); } return list; } } 复制代码

  在入口类Main.java中,调用LocalFile类的getData方法,输入参数为xml文件名,每条弹幕解析输出:

  import java.util.ArrayList; /** * Created by shuhu on 2018/1/20. */ public class Main { public static void main(String[] args){ ArrayList items = new ArrayList(); //1,通过解析本地文件的方式得到所有弹幕 items = LocalFile.getData("3232417.xml"); //遍历输出每条弹幕 for (String item : items) { System.out.println(item); } } } 复制代码

  输出如下:

  

  (三) 第二种实现方案,解析远程服务器文件1,添加httpclient依赖

  由于需要访问远程服务器,所以使用了一个相关的依赖,提供对http服务器的访问。在 pom.xml 文件中添加:

   org.apache.httpcomponents httpclient 4.3.3 复制代码

  2. 实现代码

  import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.util.ArrayList; /** * Created by shuhu on 2018/1/20. */ public class RemoteFile { public static ArrayList getData(String fileName) throws IOException { ArrayList list = new ArrayList(); //1,创建HttpClient对象,我们使用到Apache中的HttpClient的实例CloseableHttpClient CloseableHttpClient httpclient = HttpClients.createDefault(); //2,创建HttpGet请求实例,该实例指示向目标URL发起GET请求 HttpGet httpGet = new HttpGet(fileName); //3,执行HttpGet请求实例,也就是发起GET请求,响应结果保存到httpResponse变量中 CloseableHttpResponse httpResponse = httpclient.execute(httpGet); try { //4,得到弹幕文件的文件内容 HttpEntity httpEntity = httpResponse.getEntity(); String httpHtml = EntityUtils.toString(httpEntity); //5,解析弹幕文件,把每条弹幕放入list中 Document doc = Jsoup.parse(httpHtml, "UTF-8"); Elements contents = doc.getElementsByTag("d"); for (Element content : contents) { list.add(content.text()); //将标签中的文本内容,也就是弹幕内容,添加到list中 } } catch (Exception e) { e.printStackTrace(); } finally { httpResponse.close(); } return list; } } 复制代码

  CloseableHttpResponse httpResponse = httpclient.execute(httpGet); 执行GET请求后,响应结果保存在httpResponse中。response.getEntity()是响应结果中的消息实体,因为响应结果中还收录Headers等其他内容如下图所示,这里我们只需要关注getEntity()消息实体即可。

  

  EntityUtils.toString(response.getEntity()); 以流的形式返回服务器写入的响应内容。比如服务端调用的方法最后是: responseWriter.write("just do it"); 然后是EntityUtils。toString(response.getEntity()); 得到这句话就去做吧。这可以简单的理解为网页的html代码,也就是在网页源代码上右击可以看到的所有html代码。我们需要解析的就是这样的html代码。

  在入口类Main.java中,调用RemoteFile类的getData方法,输入参数为xml文件名,解析每个弹幕并输出:

  import java.util.ArrayList; /** * Created by shuhu on 2018/1/20. */ public class Main { public static void main(String[] args){ ArrayList items = new ArrayList(); //1,通过解析本地文件的方式得到所有弹幕 // items = LocalFile.getData("3232417.xml"); //2,通过解析远程服务器文件的方式得到所有弹幕 items = RemoteFile.getData("https://comment.bilibili.com/3232417.xml"); //遍历输出每条弹幕 for (String item : items) { System.out.println(item); } } } 复制代码

  输出如下:

  

  项目代码

  代码仓库:完整的项目代码

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线