天天看點

java抓取資料+破解屏蔽ip通路【多線程資料采集之三】

java抓取資料+破解屏蔽ip通路

今天就講解一下,怎麼破解 伺服器 屏蔽ip的請求。

現在大多網站采取 ip通路次數達到一定次數就屏蔽ip的功能。

那麼要破解伺服器的屏蔽。 就隻有改變ip, 或者代理ip。

如果用代理,哪裡去找那麼多ip呢。  用adsl 擷取動态ip不是很簡單嗎。

那麼現在就貼上adsl擷取動态ip的方案執行個體源碼

1、抓取網頁資料的時候  catch異常之後 , 就采取撥号程式

//門票浏覽  url參數 http://www.lvmama.com/dest/lantiancheng   

    public static DataBean getWebData1(String url){   

        DataBean data = null;   

        try {   

            Document docdata = Jsoup.connect(url).timeout(20000).get();   

        } catch (Exception e) {   

            e.printStackTrace();   

                        //撥号一下   

                        ConnectAdslNet.reconnectAdsl("寬帶",Main.adslname,Main.adslpass);   

        }   

        return data;   

    }   

2、撥号擷取動态ip的 工具類

import java.io.BufferedReader;   

import java.io.InputStreamReader;   

import org.apache.log4j.Logger;   

/**  

 *   

 * ADSL撥号上網  

 * Windwos作業系統需要是GBK編碼  

 * @author yijianfeng  

 */   

public class ConnectAdslNet {   

    static Logger logger = Logger.getLogger(ConnectAdslNet.class);   

     /**   

     * 執行CMD指令,并傳回String字元串   

     */     

    public static String executeCmd(String strCmd) throws Exception {     

        Process p = Runtime.getRuntime().exec("cmd /c " + strCmd);     

        StringBuilder sbCmd = new StringBuilder();     

        //注意編碼 GBK   

        BufferedReader br = new BufferedReader(new InputStreamReader(p     

                .getInputStream(),"GBK"));     

        String line;     

        while ((line = br.readLine()) != null) {     

            sbCmd.append(line + "\n");     

        }     

        return sbCmd.toString();     

    }     

    /**   

     * 連接配接ADSL   

    public static boolean connectAdsl(String adslTitle, String adslName, String adslPass) throws Exception {     

        System.out.println("正在建立連接配接.");     

        String adslCmd = "rasdial " + adslTitle + " " + adslName + " "     

                + adslPass;     

        String tempCmd = executeCmd(adslCmd);     

        // 判斷是否連接配接成功     

        if (tempCmd.indexOf("已連接配接") > 0) {     

            System.out.println("已成功建立連接配接.");     

            return true;     

        } else {     

            System.out.println(tempCmd);     

            System.out.println("建立連接配接失敗");     

            return false;     

     * 斷開ADSL   

    public static boolean disconnectAdsl(String adslTitle) throws Exception {     

        String disconnectAdsl = "rasdial " + adslTitle + " /disconnect";     

        String result = executeCmd(disconnectAdsl);          

        if (result.indexOf("沒有連接配接")!=-1){     

            System.out.println(adslTitle + "連接配接不存在!");     

            System.out.println("連接配接已斷開");     

    /**  

     * @param args  

     * @throws Exception  

     */   

    public static boolean reconnectAdsl(String adslTitle, String adslName, String adslPass){   

        boolean bAdsl = false;   

            disconnectAdsl(adslTitle);    

            Thread.sleep(3000);            

            bAdsl = connectAdsl(adslTitle,adslName,adslPass);   

            Thread.sleep(3000);   

            int i = 0;   

            while (!bAdsl){   

                disconnectAdsl(adslTitle);    

                Thread.sleep(3000);   

                bAdsl = connectAdsl(adslTitle,adslName,adslPass);   

                if(i>5){   

                    break;   

                }   

            }   

        }catch(Exception e){   

            logger.error("ADSL撥号異常:", e);   

        return bAdsl;          

    public static void main(String[] args) throws Exception {   

//        reconnectAdsl("寬帶","adsl賬号","密碼");     

    }      

}   

采用上述辦法,基本上就可以解決撥号的問題了。 

如果程式加入了多線程。 那麼就必須考慮多線程,撥号同步,以及資料同步問題。  提高效率和避免重複操作。

到此,破解屏蔽ip通路就搞定了!

      本文轉自yjflinchong 51CTO部落格,原文連結:http://blog.51cto.com/yjflinchong/1165154,如需轉載請自行聯系原作者