java爬蟲常用設置代理IP教程

爬蟲必須用代理IP嗎?很多用戶認爲爬蟲必須要用代理IP,沒有代理IP將寸步難行;也有人說,代理IP是非必須的。那麼他們這樣認爲的理由都是什麼呢?
有的用戶他自己寫爬蟲程序,公司的任務一天要爬取幾十萬個頁面,有時任務多的時候一天要上百萬,爬着爬着IP就被封了,沒有代理IP根本不行,他認爲沒有代理ip爬蟲將寸步難行。
他們說很有道理,都用親身體驗來證明了自己的觀點。爬蟲程序從本質上來說也是個訪問網頁的用戶而已,只不過是個不那麼守規矩的特殊用戶,服務器一般很不歡迎這樣的特殊用戶總是用各種手段發現和禁止。最常見的就是判斷你訪問的頻率,因爲普通人訪問網頁的頻率是不會很快的,如果發現某個ip訪問的過快就會將此ip封禁。
當任務量比較大的時候,一天採集上百萬的數據,慢慢爬就完不成任務了,加速爬的話,目標服務器壓力太大,就會封IP,同樣完不成任務。那怎麼辦呢,只有用代理IP來解決了。在這裏我就是使用了我們長期使用的一家質量好的代理,億牛雲代理,而且是使用的他們的爬蟲代理(動態轉發)和一般的api模式不一樣。這種更簡單更方便,對於懶人來說絕對是最佳選擇。
具體代碼的使用
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.URL;
import java.util.Random;

    class ProxyAuthenticator extends Authenticator {
        private String user, password;

        public ProxyAuthenticator(String user, String password) {
            this.user     = user;
            this.password = password;
        }

        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(user, password.toCharArray());
        }
    }

    /**
     * 注意:下面代碼僅僅實現HTTP請求鏈接,每一次請求都是無狀態保留的,僅僅是這次請求是更換IP的,如果下次請求的IP地址會改變
     * 如果是多線程訪問的話,只要將下面的代碼嵌入到你自己的業務邏輯裏面,那麼每次都會用新的IP進行訪問,如果擔心IP有重複,
     * 自己可以維護IP的使用情況,並做校驗。
     */
    public class Demo {
        public static void main(String args[]) throws Exception {
            // 要訪問的目標頁面
            String targetUrl = "http://httpbin.org/ip";

            // 代理服務器
            String proxyServer = "t.16yun.cn";
            int proxyPort      = 31111;

            // 代理隧道驗證信息
            String proxyUser  = "username";
            String proxyPass  = "password";

            try {
                URL url = new URL(targetUrl);

                Authenticator.setDefault(new ProxyAuthenticator(proxyUser, proxyPass));

                // 創建代理服務器地址對象
                InetSocketAddress addr = new InetSocketAddress(proxyServer, proxyPort);
                // 創建HTTP類型代理對象
                Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);

                // 設置通過代理訪問目標頁面
                HttpURLConnection connection= (HttpURLConnection) url.openConnection(proxy);
                // 設置Proxy-Tunnel
                // Random random = new Random();
                // int tunnel = random.nextInt(10000);
                //connection.setRequestProperty("Proxy-Tunnel",String.valueOf(tunnel));

                // 解析返回數據
                byte[] response = readStream(connection.getInputStream());

                System.out.println(new String(response));
            } catch (Exception e) {
                System.out.println(e.getLocalizedMessage());
            }
        }

        /**
         * 將輸入流轉換成字符串
         *
         * @param inStream
         * @return
         * @throws Exception
         */
        public static byte[] readStream(InputStream inStream) throws Exception {
            ByteArrayOutputStream outSteam =new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = -1;

            while ((len = inStream.read(buffer)) != -1) {
                outSteam.write(buffer, 0, len);
            }
            outSteam.close();
            inStream.close();

            return outSteam.toByteArray();
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章