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();
        }
    }

猜你喜欢

转载自blog.51cto.com/14400115/2416766