手机网页视频抓取(有些网页通过这种HttpURLConnection打开网页是不会的源码(图))
优采云 发布时间: 2021-12-19 00:01手机网页视频抓取(有些网页通过这种HttpURLConnection打开网页是不会的源码(图))
10.16 青岛银
最近想拍一个网站的视频作为数据源。有人帮忙爬取视频链接后,发现1-2小时后视频链接失效。研究发现,每次打开收录视频链接的网页时,网页中的视频链接地址都不同。我想添加一些反爬虫处理。如果要获取视频链接,只要他的网页连接不变,直接解析网页即可。你可能会说,你为什么不解析儿子呢?原因是网站,json是加密的,使用解析处理器解析出来的也是一堆源码。
解决方案:
1. 首先下载jsoup包并导入。说明下,jsoup是专门用来解析html数据的,和Gson解析json一样,具体用法后面会讲到。
2. 得到html链接后,通过webview获取html数据。
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(''+" + "document.getElementsByTagName('html')[0].innerHTML+'');");
}
@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 就是网页的数据
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的 某个属性获得链接
返回的字符串是您需要的特定连接。
其实jsoup有一个Jsoup.connect()方法,可以自己获取网页,但是有些网页通过这个HttpURLConnection打开网页,视频链接不会出现。可以通过WebView模拟浏览器的打开方式,然后得到具体的网页是通过jsoup解析出来的。Jsoup也有很多不同的解析html的方法,这里就不一一介绍了。
以上是我个人的理解,如有不对请留言指正,谢谢。
参考文章: