网络爬虫中Json数据的解析
3,699 阅读
原文地址: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数据格式是否正确,如下图所示,完美啊:

##两种解析方式
下面便是对网页中的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;
}
}
```
#程序运行结果

