工作
无聊,找个事情做做。想想都郁闷,前段想做销售,业务面试通过,却被人事给卡在了,MD,真是扯淡,我的销售,就这样泡汤了。
对新浪大片的采集,大概分为一下几个步骤。
1,java模拟get或者post请求获取大片页面内容
2,使用
正则表达式解析出播放页面地址
3,根据播放页面地址,借助其他网站通过get或者post请求和
正则表达式找出真实地址
4,使用wget工具执行下载(wget是linux命令,windows使用,需下载安装包,然后配置 path,这样在cmd命令窗口,就可以执行wget命令了)
代码如下:
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
*
*
* Title:SinaMovie
* Description: 分析sina电影,下载电影
* Copyright: Copyright (c) 2010
* Company:
* @author libin
* @version
*/
public class SinaMovie
{
/**
* @param args
* @throws Exception
*/
public static void main ( String [] args )
throws Exception
{
List<Movie> list = getMovieList();
for ( Movie movie : list )
{
List<String> realAddressList= movie.getRealUrlList();
for(String realUrl:realAddressList){
downLoad(realUrl);
}
}
}
/**
* 获取视频首页的所有电影信息,存放入List中,因为其分页是通过异步方式,目前欠缺分页的视频抓取,需进一步研究
* @return
* @throws Exception
*/
public static List<Movie> getMovieList ()
throws Exception
{
String indexUrl = "http://video.sina.com.cn/movie/category/movie/index.html";//sina电影首页地址
String responseContent = HttpTookitEnhance.doGet(indexUrl, null, "UTF-8", false);
System.out.println("responseContent==" + responseContent);
String reg = "<div class=\"pic\"><a href=\"(.*?)\"(.*?)alt=\"(.*?)\"";
Pattern p = Pattern.compile(reg);
Matcher macher = p.matcher(responseContent);
String preUrl = "http://video.sina.com.cn";
List<Movie> list = new ArrayList<Movie>();
while ( macher.find() )
{
String playurl = preUrl + macher.group(1).trim();
System.out.println("" + playurl);
String name = macher.group(3).trim();
List<String> realUrlList = getRealAddressList(playurl);
System.out.println("2=========="+realUrlList.size());
Movie movie = new Movie();
movie.setName(name);
movie.setUrl(playurl);
movie.setRealUrlList(realUrlList);
list.add(movie);
break;//测试只下载一个电影
}
return list;
}
/**
* 借助其他网站,分析出电影的真实地址,一个电影对应多个真实地址(被切分)
* @param url 电影的网页播放地址
* @return
* @throws Exception
*/
public static List<String> getRealAddressList ( String url )
throws Exception
{
String _decurl = URLEncoder.encode(url, "UTF-8");
String realurl = "http://www.flvcd.com/parse.php?kw=" + _decurl + "&flag=&format=";
String html = HttpTookitEnhance.doGet(realurl, null, "UTF-8", false);
Pattern p1 = Pattern.compile("<a href (.*?)\"(.*?)\"");
Matcher m = p1.matcher(html);
List<String> list = new ArrayList<String>();
while ( m.find() )
{
String realUrl = m.group(2).trim();
System.out.println("realUrl---------" + realUrl);
list.add(realUrl);
}
return list;
}
/**
* 借助wget工具,执行下载(wget工具为Linuxg工具,windows使用需下载)
* -c 断点续传 -P下载目录 --tries 重试次数
* 测试URL:http://shb5.dhot.v.iask.com/f/1/648cd395f950c82e5bfb45d2fe47c10541885386.hlv
* @param downUrl
* @throws Exception
*/
public static void downLoad ( String downUrl )
throws Exception
{
System.out.println("执行下载:"+downUrl);
Runtime run = Runtime.getRuntime();
Process process = run.exec("cmd.exe /c wget -c -P C:\\test --tries=5 --timeout=60 " + downUrl);
InputStream in = process.getInputStream();
/* while ( in.read() != -1 )
{
System.out.println(in.read());
}
in.close();*/
//process.waitFor();
}
}
/**
* 电影信息
*
* Title:Movie
* Description:
* Copyright: Copyright (c) 2010
* Company:
* @author
* @version
*/
class Movie
{
String name;//电影名称
String url;//播放地址
List<String> realUrlList = new ArrayList<String>();//一个电影对应多个地址
public String getName ()
{
return name;
}
public void setName ( String name )
{
this.name = name;
}
public String getUrl ()
{
return url;
}
public void setUrl ( String url )
{
this.url = url;
}
public List<String> getRealUrlList ()
{
return realUrlList;
}
public void setRealUrlList ( List<String> realUrlList )
{
this.realUrlList = realUrlList;
}
}
由于公司网络资源,只下载一个电影,下载后的格式是hlv,改名为flv即可使用暴风影音进行播放。
HttpTookitEnhance模拟http get和post请求类,前面代码已贴出。程序还需要完善, 改用多
线程执行,现在效率很低。同时请教
牛人,目前只能抓取第一个页的内容,而新浪大片它的分页是通过异步的方式,我怎么获取异步过来的网页内容呢?
参考了牛人雷哥的代码,雷哥,java之牛人也。