对新浪大片只管看不能下载说NO!_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 对新浪大片只管看不能下载说NO!

对新浪大片只管看不能下载说NO!

 2010/12/11 11:31:50  li_sir  http://li-sir.javaeye.com  我要评论(0)
  • 摘要:工作无聊,找个事情做做。想想都郁闷,前段想做销售,业务面试通过,却被人事给卡在了,MD,真是扯淡,我的销售,就这样泡汤了。对新浪大片的采集,大概分为一下几个步骤。1,java模拟get或者post请求获取大片页面内容2,使用正则表达式解析出播放页面地址3,根据播放页面地址,借助其他网站通过get或者post请求和正则表达式找出真实地址4,使用wget工具执行下载(wget是linux命令,windows使用,需下载安装包,然后配置path,这样在cmd命令窗口,就可以执行wget命令了
  • 标签:下载 新浪
  工作无聊,找个事情做做。想想都郁闷,前段想做销售,业务面试通过,却被人事给卡在了,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之牛人也。


  
发表评论
用户名: 匿名