自动更改IP地址反爬虫封锁

转载地址 https://github.com/ysc/superword/blob/master/src/main/java/org/apdplat/superword/tools/DynamicIp.java


/**
  *
  * APDPlat - Application Product Development Platform Copyright (c) 2013, 杨尚川,
  * yang-shangchuan@qq.com
  *
  * This program is free software: you can redistribute it and/or modify it under
  * the terms of the GNU General Public License as published by the Free Software
  * Foundation, either version 3 of the License, or (at your option) any later
  * version.
  *
  * This program is distributed in the hope that it will be useful, but WITHOUT
  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  * details.
  *
  * You should have received a copy of the GNU General Public License along with
  * this program. If not, see .
  *
  */
   
  package org.apdplat.superword.tools;
   
  import org.jsoup.Connection;
  import org.jsoup.Jsoup;
  import org.jsoup.nodes.Document;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  import java.util.*;
   
  /**
  *
  * 自动更改IP地址反爬虫封锁
  *
  * ADSL拨号上网使用动态IP地址,每一次拨号得到的IP都不一样
  *
  * @author 杨尚川
  */
  public class DynamicIp {
  private DynamicIp(){}
  private static final Logger LOGGER = LoggerFactory.getLogger(DynamicIp.class);
  private static final String ACCEPT = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
  private static final String ENCODING = "gzip, deflate";
  private static final String LANGUAGE = "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3";
  private static final String CONNECTION = "keep-alive";
  private static final String HOST = "192.168.0.1";
  private static final String REFERER = "http://192.168.0.1/login.asp";
  private static final String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:36.0) Gecko/20100101 Firefox/36.0";
   
  public static void main(String[] args) {
  toNewIp();
  }
  public static boolean toNewIp() {
  Map<String, String> cookies = login("username***", "password***", "phonenumber***");
  if("true".equals(cookies.get("success"))) {
  LOGGER.info("登陆成功");
  cookies.remove("success");
  while (!disConnect(cookies)) {
  LOGGER.info("断开连接失败,重试!");
  }
  LOGGER.info("断开连接成功");
  while (!connect(cookies)) {
  LOGGER.info("建立连接失败,重试!");
  }
  LOGGER.info("建立连接成功");
  LOGGER.info("自动更改IP地址成功!");
  return true;
  }
  return false;
  }
  public static boolean connect(Map<String, String> cookies){
  return execute(cookies, "3");
  }
  public static boolean disConnect(Map<String, String> cookies){
  return execute(cookies, "4");
  }
  public static boolean execute(Map<String, String> cookies, String action){
  String url = "http://192.168.0.1/goform/SysStatusHandle";
  Map<String, String> map = new HashMap<>();
  map.put("action", action);
  map.put("CMD", "WAN_CON");
  map.put("GO", "system_status.asp");
  Connection conn = Jsoup.connect(url)
  .header("Accept", ACCEPT)
  .header("Accept-Encoding", ENCODING)
  .header("Accept-Language", LANGUAGE)
  .header("Connection", CONNECTION)
  .header("Host", HOST)
  .header("Referer", REFERER)
  .header("User-Agent", USER_AGENT)
  .ignoreContentType(true)
  .timeout(30000);
  for(String cookie : cookies.keySet()){
  conn.cookie(cookie, cookies.get(cookie));
  }
   
  String title = null;
  try {
  Connection.Response response = conn.method(Connection.Method.POST).data(map).execute();
  String html = response.body();
  Document doc = Jsoup.parse(html);
  title = doc.title();
  LOGGER.info("操作连接页面标题:"+title);
  }catch (Exception e){
  LOGGER.error(e.getMessage(), e);
  }
  if("LAN | LAN Settings".equals(title)){
  //发出命令5秒之后再检查网络状态
  try{Thread.sleep(5000);}catch (Exception e){LOGGER.error(e.getMessage(), e);}
  if(("3".equals(action) && isConnected())
  || ("4".equals(action) && !isConnected())){
  return true;
  }
  }
  return false;
  }
  public static boolean isConnected(){
  try {
  Document doc = Jsoup.connect("http://www.baidu.com/s?wd=杨尚川&t=" + System.currentTimeMillis())
  .header("Accept", ACCEPT)
  .header("Accept-Encoding", ENCODING)
  .header("Accept-Language", LANGUAGE)
  .header("Connection", CONNECTION)
  .header("Referer", "https://www.baidu.com")
  .header("Host", "www.baidu.com")
  .header("User-Agent", USER_AGENT)
  .ignoreContentType(true)
  .timeout(30000)
  .get();
  LOGGER.info("搜索结果页面标题:"+doc.title());
  if(doc.title() != null && doc.title().contains("杨尚川")){
  return true;
  }
  }catch (Exception e){
  if("Network is unreachable".equals(e.getMessage())){
  return false;
  }else{
  LOGGER.error("状态检查失败:"+e.getMessage(), e);
  }
  }
  return false;
  }
  public static Map<String, String> login(String userName, String password, String verify){
  try {
  Map<String, String> map = new HashMap<>();
  map.put("Username", userName);
  map.put("Password", password);
  map.put("checkEn", "0");
  Connection conn = Jsoup.connect("http://192.168.0.1/LoginCheck")
  .header("Accept", ACCEPT)
  .header("Accept-Encoding", ENCODING)
  .header("Accept-Language", LANGUAGE)
  .header("Connection", CONNECTION)
  .header("Referer", REFERER)
  .header("Host", HOST)
  .header("User-Agent", USER_AGENT)
  .ignoreContentType(true)
  .timeout(30000);
   
  Connection.Response response = conn.method(Connection.Method.POST).data(map).execute();
  String html = response.body();
  Document doc = Jsoup.parse(html);
  LOGGER.info("登陆页面标题:"+doc.title());
  Map<String, String> cookies = response.cookies();
  if(html.contains(verify)){
  cookies.put("success", Boolean.TRUE.toString());
  }
  LOGGER.info("*******************************************************cookies start:");
  cookies.keySet().stream().forEach((cookie) -> {
  LOGGER.info(cookie + ":" + cookies.get(cookie));
  });
  LOGGER.info("*******************************************************cookies end:");
  return cookies;
  }catch (Exception e){
  e.printStackTrace();
  }
  return Collections.emptyMap();
  }
  }
https://github.com/ysc/superword/blob/master/src/main/java/org/apdplat/superword/tools/DynamicIp.java

你可能感兴趣的:(爬虫)