无法使用JSoup从此网站获取视频源链接?

时间:2016-02-06 21:51:36

标签: web-scraping jsoup

我有一个网站,我想从中获取使用Jsoup的视频链接。但我无法这样做我的程序抛出错误。有人可以帮帮我吗?

以下是代码:

import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class MovMaker {
  public static void main(String[] args) {
    try {
      String url="http://www.tamilyogi.tv/7aum-arivu-2011-hd-720p-tamil-movie-watch-online/";
      Document doc = Jsoup.connect(url).get();
      Element vid = doc.getElementsByTag("video").get(0);
       System.out.println("\nlink: " + vid.attr("src"));
        System.out.println("text: " + vid.text());
      catch (IOException e) {
    e.printStackTrace();
    }
  }
}

我的错误:

线程“main”中的异常java.lang.IndexOutOfBoundsException:索引:0,大小:0     在java.util.ArrayList.rangeCheck(未知来源)     at java.util.ArrayList.get(Unknown Source)     在MovMaker.main(MovMaker.java:16)

我想要从中获取数据的页面来源是:Here

我是java和jsoup的新手,如果有人可以给我代码,我会很感激。

此致 Bhuvanesh

2 个答案:

答案 0 :(得分:1)

您所提供的链接的直接加载的html中没有<video>标记。而是由浏览器中的某些JavaScript创建标记。由于JSoup没有运行任何JavaScript,所以你运气不好。

你能做的就是使用像

这样的东西

或者您分析html的内容以及加载该网站时浏览器中发生的网络流量,以便了解您是否可以手动构建该信息的链接。在您的情况下,我快速查看了html,发现视频标记是在IFrame中生成的。在IFrame的源代码中,您可以找到以下部分:

<script type="text/javascript">  jwplayer("vplayer").setup({
    sources: [{file:"http://cdn7.vidmad.tv/h7todtdxamlbu3tf6rutlihpzoz4di2fcsaje74hlrcqda7qibjmlb4vblxq/v.mp4",label:"720p"},{file:"http://cdn7.vidmad.tv/h7todtdxamlbu3tf6rutlihpzoz4di2fcsaje74hljcqda7qibjjd3opruyq/v.mp4",label:"360p","default": "true"},{file:"http://cdn7.vidmad.tv/h7todtdxamlbu3tf6rutlihpzoz4di2fcsaje74hlbcqda7qibjgcvfli2eq/v.mp4",label:"240p"}],
    image: "http://cdn7.vidmad.tv/i/01/00000/cjwf05thn2vm.jpg",
    duration:"9607",
    width: "100%",
    height: "350",
    aspectratio: "16:9",
    preload: "none",
    androidhls: "true",
    startparam: "start"

    ,tracks: []
    ,skin: "glow",abouttext:"VidMAD", aboutlink:"http://vidmad.tv"
  });

...

</script>

因此,该网址是<script>代码的一部分。您可以使用正则表达式来获取它:

Document doc = Jsoup.connect("http://www.tamilyogi.tv/7aum-arivu-2011-hd-720p-tamil-movie-watch-online/")
        .userAgent("Mozilla/5.0")
        .get();

Element iframeEl = doc.select("iframe[src*=embed]").first();
if (iframeEl != null){
    Document frameDoc = Jsoup.connect(iframeEl.attr("src"))
            .userAgent("Mozilla/5.0")
            .get();
    Elements scriptEls = frameDoc.select("script");
    for (Element scriptEl :scriptEls ){
        String html = scriptEl.html();
        Pattern p = Pattern.compile("sources:\\s*\\[\\{file:\"([^\"]+)");
            Matcher m = p.matcher(html);
            if (m.find()){
                String link = m.group(1);
                System.out.println(link);
                break;
            }
    }   
}

当然,我的上述解决方案仅适用于此站点和链接。您可能需要调整方法以满足您的需求,但现在应该清楚一般的想法。

答案 1 :(得分:0)

`

Document doc = Jsoup.connect("http://www.tamilyogi.tv/7aum-arivu-2011-hd-720p-tamil-movie-watch-online/")
            .userAgent("Mozilla/5.0")
            .get();
    Element iframeEl = doc.select("iframe").first();
    System.out.println(iframeEl.absUrl("src"));

`

希望这适合你。