网络爬虫中Json数据的解析

3,703 阅读
原文地址:http://blog.csdn.net/qy20115549/article/details/52270396 目录 [TOC] #json数据 JSON 是存储和交换文本信息的语法。类似 XML。JSON 比 XML 更小、更快,更易解析。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。 JSON 数据的书写格式是:名称/值对。 如下所示: ```json { "employees": [ { "firstName":"Bill" , "lastName":"Gates" }, { "firstName":"George" , "lastName":"Bush" }, { "firstName":"Thomas" , "lastName":"Carter" } ] } ``` #爬虫中Json数据的解析 以下,我将以一个简单的爬虫来解析爬虫中的Json数据。这里的爬虫写的比较简单,建议大家还是按照我前面写的爬虫框架来写,下面的主要是为了讲解Json的解析。 下面是爬时光网所写的一个样例程序: ##分析要爬数据,建立Model 1。首先是框架中的model,封装要爬的数据。 ```java package model; public class MtimeModel { private String prmovieId; private String url; private String movieId; private String title; public String getPrmovieId() { return prmovieId; } public void setPrmovieId(String prmovieId) { this.prmovieId = prmovieId; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getMovieId() { return movieId; } public void setMovieId(String movieId) { this.movieId = movieId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } ``` ##main方法 2。来看看我们要爬的地址:http://movie.mtime.com/212471/trailer.html,以下程序是爬相关预告片的信息。下年是main方法 ``` package main; import java.io.IOException; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import model.MtimeModel; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import parse.MtimeParse; public class Mtime { static final Log logger = LogFactory.getLog(Mtime.class); public static void main(String[] args) throws IOException, SQLException { //测试程序 String Starturl="http://movie.mtime.com/212471/trailer.html"; Document doc=Jsoup.connect(Starturl).userAgent("bbb").timeout(120000).get(); System.out.println(doc); List moviedatas=new ArrayList(); moviedatas =MtimeParse.getData(doc); for (MtimeModel mt:moviedatas) { System.out.println("prmovieId:"+mt.getPrmovieId()+" movieId:"+mt.getMovieId()+" Title:"+mt.getTitle() +" url:"+mt.getUrl()); } } } ``` 下面是获取的网站源码,主要是解析这里面Json数据,下面的程序中请定位到var videos= 可以看到这后面就是Json数据。 ```html 澳门风云2 视频 预告片 – Mtime时光网
``` ##json在线测试网站 将这里面的Json数据,放入到http://json.cn/来查看Json数据格式是否正确,如下图所示,完美啊: ![这里写图片描述](http://img.blog.csdn.net/20160821233716961) ##两种解析方式 下面便是对网页中的Json进行解析,以下是解析程序,这里提供了两种方法,一种是正则表达式,一种是fastjson,**建议使用fastjson,快捷高效。** ```java package parse; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import model.JsonModel; import model.MtimeModel; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jsoup.nodes.Document; import com.alibaba.fastjson.JSON; public class MtimeParse { static final Log logger = LogFactory.getLog(MtimeParse.class); public static List getData (Document doc) { List mtimeData=new ArrayList(); //获取待解析的html文件 String html=doc.html(); // System.out.println(html); //通过正则表达获取,所要解析的json数据,只要预告片不要花絮 Pattern data = Pattern.compile("预告片\":(.*?)\\,\"拍摄花絮"); Matcher dataMatcher = data.matcher(html); String da=""; while (dataMatcher.find()) { //待解析的json字符串 da=dataMatcher.group(1); } //jsoup获取movieId(影片id) String movieId="mtime"+doc.select("h1[property=v:itemreviewed]").select("a").attr("href"). replaceAll("\\D","").trim(); //正则匹配获取videoID(预告片id) Pattern videoID = Pattern.compile("VideoID\"(.*?)\""); //正则匹配获取videoID(预告片id) Pattern titlePattern = Pattern.compile("ShortTitle\":\"(.*?)\""); Matcher videoIDMatcher = videoID.matcher(da); Matcher titleMatcher = titlePattern.matcher(da); ArrayList urldatas = new ArrayList(); while (videoIDMatcher.find()) { urldatas.add(videoIDMatcher.group(1)); } ArrayList titles = new ArrayList(); while (titleMatcher.find()) { titles.add(titleMatcher.group(1)); } for (int i = 0; i < titles.size(); i++) { MtimeModel mtimeModel=new MtimeModel(); String prmovieId="mtime"+urldatas.get(i).replaceAll("\\D","").trim(); String url="http://video.mtime.com/"+urldatas.get(i).replaceAll("\\D","").trim()+"/?mid="+doc.select("h1[property=v:itemreviewed]").select("a").attr("href"). replaceAll("\\D","").trim(); String title=titles.get(i); mtimeModel.setPrmovieId(prmovieId); mtimeModel.setUrl(url); mtimeModel.setMovieId(movieId); mtimeModel.setTitle(title); mtimeData.add(mtimeModel); } //fastJson测试 //just contain the preview List mtimeJsonData=new ArrayList(); Pattern data1 = Pattern.compile("预告片\":(.*?)\\,(\"拍摄花絮|\"精彩片段)"); Matcher dataMatcher1 = data1.matcher(html); String da1=""; while (dataMatcher1.find()) { //待解析的json字符串 da1=dataMatcher1.group(1); } if (da1.length()!=0) { List jsonmodel1 = JSON.parseArray(da1,JsonModel.class); for (JsonModel jso:jsonmodel1 ) { JsonModel mtimeModel=new JsonModel(); String VideoID="mtime"+jso.getVideoID(); String MovieID="mtime"+jso.getMovieID(); String ShortTitle=jso.getShortTitle(); String url="http://video.mtime.com/"+jso.getVideoID()+"/?mid"+jso.getMovieID(); mtimeModel.setPrmovieId(VideoID); mtimeModel.setUrl(url); mtimeModel.setMovieID(MovieID); mtimeModel.setShortTitle(ShortTitle); mtimeJsonData.add(mtimeModel); logger.info("VideoID: "+VideoID+" MovieID:"+MovieID+" ShortTitle:"+ShortTitle+" url:"+url); } } return mtimeData; } } ``` #程序运行结果 ![这里写图片描述](http://img.blog.csdn.net/20160821234603703)

DataLearner 官方微信

欢迎关注 DataLearner 官方微信,获得最新 AI 技术推送

DataLearner 官方微信二维码