当前位置: 首页 > 编程笔记 >

java代理实现爬取代理IP的示例

李弘光
2023-03-14
本文向大家介绍java代理实现爬取代理IP的示例,包括了java代理实现爬取代理IP的示例的使用技巧和注意事项,需要的朋友参考一下

仅仅使用了一个java文件,运行main方法即可,需要依赖的jar包是com.alibaba.fastjson(版本1.2.28)和Jsoup(版本1.10.2)

如果用了pom,那么就是以下两个:

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.28</version>
</dependency>
<dependency>
  <groupId>org.jsoup</groupId>
  <artifactId>jsoup</artifactId>
  <version>1.10.2</version>
</dependency>

完整的代码如下:

package com.tuniu.fcm.facade.IPProxy;
import com.alibaba.fastjson.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * 获取代理IP,需要
 * com.alibaba.fastjson.JSONObject以及Jsoup
 */
public class ProxyCralwerUnusedVPN {
  ThreadLocal<Integer> localWantedNumber = new ThreadLocal<Integer>();
  ThreadLocal<List<ProxyInfo>> localProxyInfos = new ThreadLocal<List<ProxyInfo>>();
  public static void main(String[] args) {
    ProxyCralwerUnusedVPN proxyCrawler = new ProxyCralwerUnusedVPN();
    /**
     * 想要获取的代理IP个数,由需求方自行指定。(如果个数太多,将导致返回变慢)
     */
    proxyCrawler.startCrawler(1);
  }
  /**
   * 暴露给外部模块调用的入口
   * @param wantedNumber 调用方期望获取到的代理IP个数
   */
  public String startCrawler(int wantedNumber) {
    localWantedNumber.set(wantedNumber);
    kuaidailiCom("http://www.xicidaili.com/nn/", 15);
    kuaidailiCom("http://www.xicidaili.com/nt/", 15);
    kuaidailiCom("http://www.xicidaili.com/wt/", 15);
    kuaidailiCom("http://www.kuaidaili.com/free/inha/", 15);
    kuaidailiCom("http://www.kuaidaili.com/free/intr/", 15);
    kuaidailiCom("http://www.kuaidaili.com/free/outtr/", 15);
    /**
     * 构造返回数据
     */
    ProxyResponse response = new ProxyResponse();
    response.setSuccess("true");
    Map<String, Object> dataInfoMap = new HashMap<String, Object>();
    dataInfoMap.put("numFound", localProxyInfos.get().size());
    dataInfoMap.put("pageNum", 1);
    dataInfoMap.put("proxy", localProxyInfos.get());
    response.setData(dataInfoMap);
    String responseString = JSONObject.toJSON(response).toString();
    System.out.println(responseString);
    return responseString;
  }
  private void kuaidailiCom(String baseUrl, int totalPage) {
    String ipReg = "\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3} \\d{1,6}";
    Pattern ipPtn = Pattern.compile(ipReg);
    for (int i = 1; i < totalPage; i++) {
      if (getCurrentProxyNumber() >= localWantedNumber.get()) {
        return;
      }
      try {
        Document doc = Jsoup.connect(baseUrl + i + "/")
            .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
            .header("Accept-Encoding", "gzip, deflate, sdch")
            .header("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6")
            .header("Cache-Control", "max-age=0")
            .header("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36")
            .header("Cookie", "Hm_lvt_7ed65b1cc4b810e9fd37959c9bb51b31=1462812244; _gat=1; _ga=GA1.2.1061361785.1462812244")
            .header("Host", "www.kuaidaili.com")
            .header("Referer", "http://www.kuaidaili.com/free/outha/")
            .timeout(30 * 1000)
            .get();
        Matcher m = ipPtn.matcher(doc.text());
        while (m.find()) {
          if (getCurrentProxyNumber() >= localWantedNumber.get()) {
            break;
          }
          String[] strs = m.group().split(" ");
          if (checkProxy(strs[0], Integer.parseInt(strs[1]))) {
            System.out.println("获取到可用代理IP\t" + strs[0] + "\t" + strs[1]);
            addProxy(strs[0], strs[1], "http");
          }
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }
  private static boolean checkProxy(String ip, Integer port) {
    try {
      //http://1212.ip138.com/ic.asp 可以换成任何比较快的网页
      Jsoup.connect("http://1212.ip138.com/ic.asp")
          .timeout(2 * 1000)
          .proxy(ip, port)
          .get();
      return true;
    } catch (Exception e) {
      return false;
    }
  }
  private int getCurrentProxyNumber() {
    List<ProxyInfo> proxyInfos = localProxyInfos.get();
    if (proxyInfos == null) {
      proxyInfos = new ArrayList<ProxyInfo>();
      localProxyInfos.set(proxyInfos);
      return 0;
    }
    else {
      return proxyInfos.size();
    }
  }
  private void addProxy(String ip, String port, String protocol){
    List<ProxyInfo> proxyInfos = localProxyInfos.get();
    if (proxyInfos == null) {
      proxyInfos = new ArrayList<ProxyInfo>();
      proxyInfos.add(new ProxyInfo(ip, port, protocol));
    }
    else {
      proxyInfos.add(new ProxyInfo(ip, port, protocol));
    }
  }
}
class ProxyInfo {
  private String userName = "";
  private String ip;
  private String password = "";
  private String type;
  private String port;
  private int is_internet = 1;
  public ProxyInfo(String ip, String port, String type) {
    this.ip = ip;
    this.type = type;
    this.port = port;
  }
  public String getUserName() {
    return userName;
  }
  public void setUserName(String userName) {
    this.userName = userName;
  }
  public String getIp() {
    return ip;
  }
  public void setIp(String ip) {
    this.ip = ip;
  }
  public String getPassword() {
    return password;
  }
  public void setPassword(String password) {
    this.password = password;
  }
  public String getType() {
    return type;
  }
  public void setType(String type) {
    this.type = type;
  }
  public String getPort() {
    return port;
  }
  public void setPort(String port) {
    this.port = port;
  }
  public int getIs_internet() {
    return is_internet;
  }
  public void setIs_internet(int is_internet) {
    this.is_internet = is_internet;
  }
}
class ProxyResponse {
  private String success;
  private Map<String, Object> data;
  public String getSuccess() {
    return success;
  }
  public void setSuccess(String success) {
    this.success = success;
  }
  public Map<String, Object> getData() {
    return data;
  }
  public void setData(Map<String, Object> data) {
    this.data = data;
  }
}

以上这篇java代理实现爬取代理IP的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍利用Python爬取可用的代理IP,包括了利用Python爬取可用的代理IP的使用技巧和注意事项,需要的朋友参考一下 前言 就以最近发现的一个免费代理IP网站为例:http://www.xicidaili.com/nn/。在使用的时候发现很多IP都用不了。 所以用Python写了个脚本,该脚本可以把能用的代理IP检测出来。 脚本如下:  运行成功后,打开E盘下的文件,可以看到如下可用

  • 本文向大家介绍node.js 抓取代理ip实例代码,包括了node.js 抓取代理ip实例代码的使用技巧和注意事项,需要的朋友参考一下 node.js实现抓取代理ip 主要文件:index.js 包支持 : package.json 本地需要安装mongodb数据库,用于存储抓取到的ip,目前还未实现ip验证。写这个主要是处于好奇。 上面的代码就可以实现抓取ip代理网站的ip并存到mongodb数

  • 本文向大家介绍Python实现的异步代理爬虫及代理池,包括了Python实现的异步代理爬虫及代理池的使用技巧和注意事项,需要的朋友参考一下 使用python asyncio实现了一个异步代理池,根据规则爬取代理网站上的免费代理,在验证其有效后存入redis中,定期扩展代理的数量并检验池中代理的有效性,移除失效的代理。同时用aiohttp实现了一个server,其他的程序可以通过访问相应的url来从

  • 本文向大家介绍Python爬虫抓取代理IP并检验可用性的实例,包括了Python爬虫抓取代理IP并检验可用性的实例的使用技巧和注意事项,需要的朋友参考一下 经常写爬虫,难免会遇到ip被目标网站屏蔽的情况,银次一个ip肯定不够用,作为节约的程序猿,能不花钱就不花钱,那就自己去找吧,这次就写了下抓取 西刺代理上的ip,但是这个网站也反爬!!! 至于如何应对,我觉得可以通过增加延时试试,可能是我抓取的太

  • 本文向大家介绍python获取代理IP的实例分享,包括了python获取代理IP的实例分享的使用技巧和注意事项,需要的朋友参考一下 平时当我们需要爬取一些我们需要的数据时,总是有些网站禁止同一IP重复访问,这时候我们就应该使用代理IP,每次访问前伪装自己,让“敌人”无法察觉。 oooooooooooooooOK,让我们愉快的开始吧! 这个是获取代理ip的文件,我将它们模块化,分为三个函数 注:文中

  • 注解 @ProxyPool 声明代理 IP 池,在爬虫对象或者爬虫项对象上声明,则请求时自动从代理 IP 池中取出代理IP 类名:\Yurun\Crawler\Module\Crawler\Annotation\ProxyPool 参数: 名称 描述 默认值 class 代理 IP 池名 args 实例化参数 method 获取 IP 的方式:random(随机)、next(下一个) 代理 IP