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的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java实现爬取百度图片的方法分析

    本文实例讲述了Java实现爬取百度图片的方法.分享给大家供大家参考,具体如下: 在以往用java来处理解析HTML文档或者片段时,我们通常会采用htmlparser(http://htmlparser.sourceforge.net/)这个开源类库.现在我们有了JSOUP,以后的处理HTML的内容只需要使用JSOUP就已经足够了,JSOUP有更快的更新,更方便的API等. jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,

  • java实现爬取知乎用户基本信息

    本文实例为大家分享了一个基于JAVA的知乎爬虫,抓取知乎用户基本信息,基于HttpClient 4.5,供大家参考,具体内容如下 详细内容: 抓取90W+用户信息(基本上活跃的用户都在里面) 大致思路: 1.首先模拟登录知乎,登录成功后将Cookie序列化到磁盘,不用以后每次都登录(如果不模拟登录,可以直接从浏览器塞入Cookie也是可以的). 2.创建两个线程池和一个Storage.一个抓取网页线程池,负责执行request请求,并返回网页内容,存到Storage中.另一个是解析网页线程池,负

  • Java实现爬取往期所有双色球开奖结果功能示例

    本文实例讲述了Java实现爬取往期所有双色球开奖结果功能.分享给大家供大家参考,具体如下: 梦想还是要有的,万一实现了呢?我相信经常买双色球的朋友和我都会有一个疑问,就是往期双色球的开奖结果是什么?我钟意的这一注双色球在往期是否开过一等奖,如果开过的话,基本上可以放弃这一注了,因为历史上应该没有出现过两期双色球开奖完全一致的吧?那么往期的开奖结果是什么呢?我自己用Java写了一个简易的类,爬取所有双色球开奖结果,本来想开发安卓版本的,由于UI等需要时间准备,有缘再开发吧. import java

  • 详解Java两种方式简单实现:爬取网页并且保存

    对于网络,我一直处于好奇的态度.以前一直想着写个爬虫,但是一拖再拖,懒得实现,感觉这是一个很麻烦的事情,出现个小错误,就要调试很多时间,太浪费时间. 后来一想,既然早早给自己下了保证,就先实现它吧,从简单开始,慢慢增加功能,有时间就实现一个,并且随时优化代码. 下面是我简单实现爬取指定网页,并且保存的简单实现,其实有几种方式可以实现,这里慢慢添加该功能的几种实现方式. UrlConnection爬取实现 package html; import java.io.BufferedReader; i

  • java爬取并下载酷狗TOP500歌曲的方法

    是这样的,之前买车送的垃圾记录仪不能用了,这两天狠心买了好点的记录仪,带导航.音乐.蓝牙.4G等功能,寻思,既然有这些功能就利用起来,用4G听歌有点奢侈,就准备去酷狗下点歌听,居然都是需要办会员才能下载,而且vip一月只能下载300首,我这么穷又这么抠怎么可能冲会员,于是百度搜了下怎么免费下载,都是python爬取,虽然也会一点,但是电脑上没安装python,再安装再研究感觉有点费劲,于是就花了半小时做了这个爬虫,技术一般,只记录分析实现过程,大牛请绕行.其中用到了一些库,包括:jsoup.Ht

  • java+selenium爬取图片签名的方法

    本文实例为大家分享了java+selenium爬取图片签名的具体实现方法,供大家参考,具体内容如下 学习记录: 1.注意 对应的版本非常重要,使用selenium得下载与游览器版本相对应的插件,有火狐和谷歌我用的谷歌,贴下谷歌driver的插件 查看谷歌版本: 2.插件存放路径 3.获取签名图片存放路径 4.Controller代码如下 @ResponseBody @RequestMapping(value = "signatureGenerationv") public String

  • Java爬虫实现爬取京东上的手机搜索页面 HttpCliient+Jsoup

    1.需求及配置 需求:爬取京东手机搜索页面的信息,记录各手机的名称,价格,评论数等,形成一个可用于实际分析的数据表格. 使用Maven项目,log4j记录日志,日志仅导出到控制台. Maven依赖如下(pom.xml) <dependencies> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId>

  • 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> </depe

  • python爬取代理IP并进行有效的IP测试实现

    爬取代理IP及测试是否可用 很多人在爬虫时为了防止被封IP,所以就会去各大网站上查找免费的代理IP,由于不是每个IP地址都是有效的,如果要进去一个一个比对的话效率太低了,我也遇到了这种情况,所以就直接尝试了一下去网站爬取免费的代理IP,并且逐一的测试,最后将有效的IP进行返回. 在这里我选择的是89免费代理IP网站进行爬取,并且每一个IP都进行比对测试,最后会将可用的IP进行另存放为一个列表 https://www.89ip.cn/ 一.准备工作 导入包并且设置头标签 import reques

  • Python爬虫简单运用爬取代理IP的实现

    功能1: 爬取西拉ip代理官网上的代理ip 环境:python3.8+pycharm 库:requests,lxml 浏览器:谷歌 IP地址:http://www.xiladaili.com/gaoni/ 分析网页源码: 选中div元素后右键找到Copy再深入子菜单找到Copy Xpath点击一下就复制到XPath 我们复制下来的Xpth内容为:/html/body/div/div[3]/div[2]/table/tbody/tr[50]/td[1] 虽然可以查出来ip,但不利于程序自动爬取所有

  • python爬取代理ip的示例

    要写爬虫爬取大量的数据,就会面临ip被封的问题,虽然可以通过设置延时的方法来延缓对网站的访问,但是一旦访问次数过多仍然会面临ip被封的风险,这时我们就需要用到动态的ip地址来隐藏真实的ip信息,如果做爬虫项目,建议选取一些平台提供的动态ip服务,引用api即可.目前国内有很多提供动态ip的平台,普遍价格不菲,而对于只想跑个小项目用来学习的话可以参考下本篇文章. 简述 本篇使用简单的爬虫程序来爬取免费ip网站的ip信息并生成json文档,存储可用的ip地址,写其它爬取项目的时候可以从生成的json

  • java通过Jsoup爬取网页过程详解

    这篇文章主要介绍了java通过Jsoup爬取网页过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一,导入依赖 <!--java爬虫--> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.3</version> </depe

  • Java基于WebMagic爬取某豆瓣电影评论的实现

    目的 搭建爬虫平台,爬取某豆瓣电影的评论信息. 准备 webmagic是一个开源的Java垂直爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发.webmagic的核心非常简单,但是覆盖爬虫的整个流程,也是很好的学习爬虫开发的材料. 下载WebMagic源码,或Maven导入,或Jar包方式导入.  码云地址:https://gitee.com/flashsword20/webmagic 试运行 搭建好后打开项目, 在 us.codecraft.webmagic.processor

  • Java使用selenium爬取b站动态的实现方式

    目录 selenium mac安装chromedriver 完整代码 maven依赖 完整代码 目标:爬取b站用户的动态里面的图片,示例动态 如下所示,我们需要获取这些图片 如图所示,哔哩哔哩漫画的数据是动态请求获取的 这里我们使用selenium来爬取数据 selenium Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样. 官网地址 这里我使用chrome浏览器,所以驱动就选用chromedriver mac安装chrome

  • Python爬取网页信息的示例

    Python爬取网页信息的步骤 以爬取英文名字网站(https://nameberry.com/)中每个名字的评论内容,包括英文名,用户名,评论的时间和评论的内容为例. 1.确认网址 在浏览器中输入初始网址,逐层查找链接,直到找到需要获取的内容. 在打开的界面中,点击鼠标右键,在弹出的对话框中,选择"检查",则在界面会显示该网页的源代码,在具体内容处点击查找,可以定位到需要查找的内容的源码. 注意:代码显示的方式与浏览器有关,有些浏览器不支持显示源代码功能(360浏览器,谷歌浏览器,火

  • python爬取音频下载的示例代码

    抓取"xmly"鬼故事音频 import json # 在这个url,音频链接为JSON动态生成,所以用到了json模块 import requests headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36" } # 请求网页

随机推荐