java平台利用jsoup开发包,抓取优酷视频播放地址与图片地址等信息。(一)

2014-11-23 22:59:02 · 作者: · 浏览: 0

/********************************************************************************************
* author:conowen@大钟
* E-mail:conowen@hotmail.com

*site:http://www.idealpwr.com/

*深圳市动力思维科技发展有限公司
* http://blog.csdn.net/conowen
* 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。

********************************************************************************************/

一: 项目目的

最近项目设计到网联网视频采集聚合,写了一个关于互联网视频的信息爬虫的小程序,以youku在线视频网站为例,实现一个java平台下的应用程序,动态抓取互联网视频信息保存到本地xml文件,构建一个多媒体播放源中心。


二:项目第三方库:

1、jsoup (HTML代码解析器)


jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。

jsoup的主要功能如下:

从一个URL,文件或字符串中解析HTML;

使用DOM或CSS选择器来查找、取出数据;

可操作HTML元素、属性、文本;

jsoup是基于MIT协议发布的,可放心使用于商业项目。

官方地址:http://jsoup.org/


2、jdom (XML构建于解析工具)

通过jdom,可以很容易地构建符合规范的xml文件,并且,jdom提供对xml文件的快速解析。

官方地址:http://jdom.org/


三:开发大体过程:

如youku(优酷)在线视频播放网站,本身就做了互联网视频聚合,就是旗下的soku,以下就已soku为例


如电视剧所对应的url地址为:http://www.soku.com/channel/teleplaylist_0_0_0_1_1.html

通过浏览器查看这个页面的HTML代码分析可知

  

就可以获得此视频的名称,封面图片地址,更新的状态,各个播放源的地址。


获取视频信息:

1、jsoup解析演示:

获取一个页面的内容,可以采用以下方式

Document doc = Jsoup.connect("http://example.com/").get();

得到doc就可以进行解析操作了。

当然,也可以设置一些连接参数,如浏览器userAgent,超时时间,页面内存大小等等。

对页面的解析就如同对xml解析一样,很简单。通过tab或者class标签就可以获取相应的内容了。


2、jsoup抓取youku优酷视频信息


	public void getVideoInfo(String pageUrl) {// 一页调用一次

		try {
			doc = Jsoup.connect(pageUrl).maxBodySize(1024 * 1024 * 10)
					.timeout(6000).get();
			// Added a maximum body response size to Jsoup.Connection, to
			// prevent running out of memory when trying to read extremely
			// large
			// documents. The default is 1MB.
		} catch (IOException e) {
			// TODO Auto-generated catch block
			getVideoInfo(pageUrl);
			System.out.println("connect error");
			e.printStackTrace();
		}
		
		

		divs_info = doc.getElementsByClass("p_link");// 视频专辑url,如电视剧

		if (divs_info != null) {

			if (divs_info.size() <= 0) {
				divs_info = doc.getElementsByClass("v_link");// 视频播放url,如资讯

			}

			urls = divs_info.select("a[href]");

			if (null != urls) {
				int i = 0;

				for (Element urlElement : urls) {

					videoTitles.add(urlElement.attr("title"));

					videoUrl.add(urlElement.attr("abs:href"));
					i++;

				}
			}

		}
		divs_thumbs = doc.getElementsByClass("p_thumb");// 获取专辑图片
		if (divs_thumbs != null) {

			thumbs = divs_thumbs.select("img[original]");
			if (thumbs.size() <= 0) {
				divs_thumbs = doc.getElementsByClass("v_thumb");
				thumbs = divs_thumbs.select("img[original]");
			}
			if (null != thumbs) {
				int i = 0;
				for (Element thumb : thumbs) {

					videoThumbUrls.add(thumb.attr("abs:original"));

					i++;

				}

			}
		}
		divs_pgm_source = doc.getElementsByClass("pgm-source");// 获取更新情况
		// divs_pgm_source.select(query)

		if (divs_pgm_source != null) {
			for (Element thumb1 : divs_pgm_source) {
				sourceId = thumb1.select("span");
				sourceUrl = thumb1.select("a");
				List
  
    videoSourceStatus = null;
				List
   
     videoSourceUrl = null; List
    
      videoSourceId = null;//保存获取的数据,以供构建xml文件 if (null != sourceId) { videoSourceId = new ArrayList
     
      (); for (Element thumb2 : sourceId) { videoSourceId.add(thumb2.attr("id")); } videoSourceIdList.add(videoSourceId); } if (null != sourceUrl) { videoSourceStatus = new ArrayList
      
       (); for (Element thumb2 : sourceUrl) { videoSourceStatus.add(thumb2.attr("status")); } videoSourceStatusList.add(videoSourceStatus); } if (null != sourceUrl) { videoSourceUrl = new ArrayList
       
        (); for (Element thumb2 : sourceUrl) { videoSourceUrl.add(thumb2.attr("href")); } videoSourceUrlList.add(videoSourceUrl); } } } try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
       
      
     
    
   
  

四、构建视频xml信息文件:


1、创建xml文件

xmlHelper.createXml(str, videoTitles, videoUrl, videoThumbUrls,
						videoSourceIdList, videoSourceStatusList,
						videoSourceUrlList, pageNum); // 创建xml
2、创建xml文