android中获取网页cookie的工具方法

来源:互联网 发布:php 防止ddos攻击 编辑:程序博客网 时间:2024/06/02 06:26

1.应用场景

我自己的应用场景是,做一个股票分时图控件demo,需要抓取同花顺网站上的分时图数据,但是这个分时图数据的链接做了cookie校验,直接用httpurlconnection访问,返回403。这个分时图数据的链接在浏览器上也是不能直接打开的,先要在浏览器上访问同花顺股票的其他网页链接,网页里面会加载一段js代码,js代码会设置cookie。这个工具类就是模仿浏览器,先加载普通网页,得到网页里js代码设置的cookie。


2.实现原理

由于我对http协议没那么熟悉,js代码更是完全不了解,所以想到了用android系统提供的WebView方式,先用WebView加载同花顺普通网页,在WebView设置的WebClient的回调中,通过系统API获取到cookie数据。


3.工具类源码

package com.rzc.util;import android.app.Activity;import android.text.TextUtils;import android.webkit.CookieManager;import android.webkit.WebView;import android.webkit.WebViewClient;/** * Created by rzc on 17/11/7. */public class CookieUtil {    public static void getCookie(Activity activity, final String url,                                 final OnCookieLoadedListener cookieLoadedListener) {        final WebView webView = new WebView(activity);        webView.setWebViewClient(new WebViewClient() {            public void onPageFinished(WebView view, String url) {                super.onPageFinished(view, url);                if (cookieLoadedListener != null) {                    CookieManager cookieManager = CookieManager.getInstance();                    String cookie = cookieManager.getCookie(url);                    if (!TextUtils.isEmpty(cookie)) {                        webView.setWebViewClient(null);                        cookieLoadedListener.onCookieLoaded(cookie);                    }                }            }        });        webView.getSettings().setJavaScriptEnabled(true);        webView.loadUrl(url);    }    public interface OnCookieLoadedListener {        void onCookieLoaded(String cookie);    }}

4.下面再贴出上面提到的获取同花顺股票分时图数据的代码

    //这里code是股票代码,比如工商银行的601398;cookie通过上面的工具方法得到,工具方法的url参数为"http://stockpage.10jqka.com.cn/" + code    private static void doDownload(String code, String cookie) {        String url = "http://d.10jqka.com.cn/v2/time/hs_" + code + "/last.js";        HttpURLConnection connection = null;        try {            connection = (HttpURLConnection) new URL(url).openConnection();            connection.setRequestMethod("GET");            connection.setConnectTimeout(10 * 1000);            connection.setReadTimeout(10 * 1000);            //同花顺网站做了cookie跟referer的校验,referer是固定的,cookie会隔断时间就更新            connection.setRequestProperty("cookie", cookie);            connection.setRequestProperty("referer", "http://stockpage.10jqka.com.cn/HQ_v3.html");            int responseCode = connection.getResponseCode();            BufferedReader br = null;            StringBuilder sb = new StringBuilder();            if (responseCode == HttpURLConnection.HTTP_OK) {                br = new BufferedReader(new InputStreamReader(connection.getInputStream()));                String line = null;                while ((line = br.readLine()) != null) {                    sb.append(line).append("\n");                }                br.close();                System.out.println(br.toString());//这里就是获取到分时图数据            } else {                if (responseCode == HttpURLConnection.HTTP_FORBIDDEN) {                    //同花顺服务器做了cookie校验,调用这个方法如果捕捉到Error,则用获取cookie的工具方法刷新得到最新的cookie再调用此方法重试                    throw new Error("403");                }            }        } catch (Exception e) {            e.printStackTrace();        } finally {            if (connection != null) {                try {                    connection.disconnect();                } catch (Exception e) {                    e.printStackTrace();                }            }        }    }





阅读全文
0 0
原创粉丝点击