java借助代理ip,解决访问api频繁导致ip被禁的问题

之前做的一个项目需要频繁地访问豆瓣的api,但是豆瓣api对访问次数是有限制的,同一个ip访问过于频繁就会被禁一段时间。原本可以申请api-key来放宽限制,但貌似现在豆瓣已经不开放申请了。
不仅是豆瓣api,爬取网页时也会有ip被禁的情况。这时使用代理ip就可以解决这样的问题。
所谓代理ip,也就是让别的服务器代替你发送请求,然后再把结果返回给你。直接在百度上搜索免费代理ip,就能看到一堆网页提供代理ip列表的,直接把它们的ip地址和端口复制下来就能用了。收集一定数目的可用代理ip,建立一个代理ip池,就能实现目的了。
在java中有两种使用代理ip的方式:

  • 直接调用System.setProperty()方法:
System.setProperty("proxyHost",host[i]);
System.setProperty("proxyPort",port[i]);
  • 创建proxy:
    SocketAddress addr = new InetSocketAddress(host[0], Integer.parseInt(port[0])); 
    Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);
    在建立http连接时:
    URL url = new URL(访问的url); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(ProxyUtil.getProxy());
    connection.setRequestMethod("GET");
    connection.setConnectTimeout(5000);
    connection.connect();

以上的第一种方法在代理ip无效时,仍然会通过本地ip去访问url;而第二种方法若代理ip无效则会抛出异常,不会继续访问。
怎么看代理ip是否有效呢?有个api提供了查看访问者ip的功能,在java程序中使用代理ip后访问这个api: http://pv.sohu.com/cityjson ,如果不抛出异常、返回的ip是你所用到的代理ip,那么这个ip即是有效的了。

你可能感兴趣的:(Java)