10.16 青岛 阴
近来,想取某网站的视频做数据源,经别人帮忙爬取了视频链接后发现,视频的连接会在1--2小时后就失效了。经研究发现,每次打开包含视频链接的网页,网页内的视频连接地址都是不一样的,想来是加了些防爬取处理了。想要取视频链接,只要他的网页连接不变,直接解析网页好了,可能你会说,为什么不解析son,原因呢,想这种网站,json都是加密的,用解析器解析出来的也是一堆的源码。
解决方案:
1.先下载jsoup的架包并导入。解释下,jsoup是专门用来解析html数据的,像解析json的Gson似的,具体用法稍后说。
2. 在拿到html的链接后,通过webview获取到html数据。
<pre name="code" class="java"> WebView mWebView=new WebView(this);
//允许执行javascript语句
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");
mWebView.loadUrl(videoUrl);
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url); return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
view.loadUrl("javascript:window.local_obj.showSource('<head>'+" + "document.getElementsByTagName('html')[0].innerHTML+'</head>');");
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl); }
});
final class InJavaScriptLocalObj{
@JavascriptInterface
public void showSource(String html) {
//html 就是网页的数据 </span>
System.out.println("====>html="+html); }
}
3.获取到网页数据后,在使用jsoup对网页进行解析。你要想解析json那样,分析他的结构,在电脑浏览器F12看他的结构,看需要的链接在那个html的节点下。再通过
Document doc = Jsoup.parse(html);
Element element = doc.getElementById("tt-video-video"); //搜索搜索节点的id 获得element
String videoUrl = element.attr("src"); // 通过element的 某个属性获得链接
这个返回的string就是你所需要的具体连接了。
其实jsoup有个Jsoup.connect()方法,是可以自己获取网页的,但是有些网页通过这种HttpURLConnection打开网页是不会出现视频链接,通过WebView模拟一下浏览器打开方式是有的,再获取到具体网页通过jsoup解析。jsoup还有好多的方法,可以有不同的方式解析html,具体就不一一介绍了。
以上是我的个人理解,如果不对,欢迎留言指正,谢谢。
参考文章:http://blog.youkuaiyun.com/hellohaifei/article/details/9331631