注意: IP代理精灵仅提供国内ip网络节点,不提供境外网络节点,不能用于任何非法用途或访问境外封闭网站,不能跨境联网,只能用于合法的国内网络加速。

请登录 注册

首页 > 新闻资讯 > 如何解决数据抓取被封IP的情况?

如何解决数据抓取被封IP的情况?

来源:IP精灵 作者:admin 时间:2019-10-14 14:37:45

  如何解决数据抓取被封IP的情况?在网络爬虫抓取信息的过程中,如果抓取频率高过了网站的设置阀值,你就会获取到503或者403等响应,将会被禁止访问。通常,网站的反爬虫机制都是依据IP来标识爬虫的。

如何解决数据抓取被封IP的情况

  于是在爬虫的开发者通常需要采取两种手段来解决这个问题:

  1、放慢抓取速度,减小对于目标网站造成的压力。但是这样会减少单位时间类的抓取量。

  2、第二种方法是通过设置代理IP等手段,突破反爬虫机制继续高频率抓取。但是这样需要稳定的代理IP软件,代理IP可以搜索到免费的,但是可能不太稳定,也有收费的,在这里推荐精灵代理ip。

  普通的基于ADSL拨号的解决办法

  通常,在抓取过程中遇到禁止访问,可以重新进行ADSL拨号,获取新的IP,从而可以继续抓取。但是这样在多网站多线程抓取的时候,如果某一个网站的抓取被禁止了,同时也影响到了其他网站的抓取,整体来说也会降低抓取速度。

  每个请求更换一个不同的代理IP

  每个请求都设置一个独立的代理IP,JAVA代码如下:

  package com.goubanjia.test;

  import java.io.BufferedInputStream;

  import java.io.InputStream;

  import java.net.HttpURLConnection;

  import java.util.ArrayList;

  import java.util.List;

  import com.gargoylesoftware.htmlunit.BrowserVersion;

  import com.gargoylesoftware.htmlunit.ProxyConfig;

  import com.gargoylesoftware.htmlunit.WebClient;

  import com.gargoylesoftware.htmlunit.html.HtmlPage;

  /**

  * 这个DEMO主要为了测试动态代理IP的稳定性

  * 也可以作为爬虫参考项目,如需使用,请自行修改代码webParseHtml方法

  */

  public class TestDynamicIp {

  public static List ipList = new ArrayList<>();

  public static boolean gameOver = false;

  public static void main(String[] args) {

  long fetchIpSeconds = 5;

  int threadNum = 10;

  int testTime = 3;

  // 请填写无忧代理IP订单号,填写之后才可以提取到IP哦

  String order = "一定要把这里改为单号哦~";

  // 你要抓去的目标网址

  String targetUrl = "http://1212.ip138.com/ic.asp";

  // 是否加载JS,加载JS会导致速度变慢

  boolean useJS = false;

  // 请求超时时间,单位毫秒,默认5秒

  int timeOut = 5000;

  if (order == null || "".equals(order)) {

  System.err.println("请输入无忧代理IP动态代理订单号");

  return;

  }

  System.out.println("############无忧代理动态IP测试开始###############");

  System.out.println("***************");

  System.out.println("接口返回IP为国内各地区,每次最多返回10个");

  System.out.println("提取IP间隔 " + fetchIpSeconds + " 秒 ");

  System.out.println("开启爬虫线程 " + threadNum);

  System.out.println("爬虫目标网址 " + targetUrl);

  System.out.println("测试次数 3 ");

  System.out.println("***************\n");

  TestDynamicIp tester = new TestDynamicIp();

  new Thread(tester.new GetIP(fetchIpSeconds * 1000, testTime, order)).start();

  for (int i = 0; i < threadNum; i++) {

  tester.new Crawler(100, targetUrl, useJS, timeOut).start();

  }

  while(!gameOver){

  try {

  Thread.sleep(100);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  System.out.println("###############无忧代理动态IP测试结束###############");

  System.exit(0);

  }

  // 抓取目标站,检测IP

  public class Crawler extends Thread{

  @Override

  public void run() {

  while(!gameOver){

  webParseHtml(targetUrl);

  try {

  Thread.sleep(sleepMs);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  }

  long sleepMs = 200;

  boolean useJs = false;

  String targetUrl = "";

  int timeOut = 5000;

  public Crawler(long sleepMs, String targetUrl, boolean useJs, int timeOut) {

  this.sleepMs = sleepMs;

  this.targetUrl = targetUrl;

  this.useJs = useJs;

  this.timeOut = timeOut;

  }

  public String webParseHtml(String url) {

  String html = "";

  BrowserVersion[] versions = {BrowserVersion.INTERNET_EXPLORER_11, BrowserVersion.CHROME, BrowserVersion.FIREFOX_38, BrowserVersion.INTERNET_EXPLORER_8};

  WebClient client = new WebClient(versions[(int)(versions.length * Math.random())]);

  try {

  client.getOptions().setThrowExceptionOnFailingStatusCode(false);

  client.getOptions().setJavaScriptEnabled(useJs);

  client.getOptions().setCssEnabled(false);

  client.getOptions().setThrowExceptionOnScriptError(false);

  client.getOptions().setTimeout(timeOut);

  client.getOptions().setAppletEnabled(true);

  client.getOptions().setGeolocationEnabled(true);

  client.getOptions().setRedirectEnabled(true);

  // 这行代码允许访问HTTPS网站,异常参考http://www.goubanjia.com/help/article-31.html

  client.getOptions().setUseInsecureSSL(true);

  String ipport = getAProxy();

  if (ipport != null) {

  ProxyConfig proxyConfig = new ProxyConfig(ipport.split(":")[0], Integer.parseInt(ipport.split(":")[1]));

  client.getOptions().setProxyConfig(proxyConfig);

  }else {

  System.out.print(".");

  return "";

  }

  HtmlPage page = client.getPage(url);

  html = page.asXml();

  System.out.println(getName() + " 使用代理 " + ipport + "请求目标网址返回HTML:" + html);

  } catch (Exception e) {

  return webParseHtml(url);

  } finally {

  client.close();

  }

  return html;

  }

  private String getAProxy() {

  if (ipList.size() > 0) {

  String ip = ipList.get((int)(Math.random() * ipList.size()));

  return ip ;

  }

  return null;

  }

  }

  // 定时获取动态IP

  public class GetIP implements Runnable{

  long sleepMs = 1000;

  int maxTime = 3;

  String order = "";

  public GetIP(long sleepMs, int maxTime, String order) {

  this.sleepMs = sleepMs;

  this.maxTime = maxTime;

  this.order = order;

  }

  @Override

  public void run() {

  long getIpTime = 0;

  int time = 1;

  while(!gameOver){

  if(time >= 4){

  gameOver = true;

  break;

  }

  try {

  java.net.URL url = new java.net.URL("http://api.ip.goubanjia.com/dynamic/get.html?order=" + order + "&ttl");

  HttpURLConnection connection = (HttpURLConnection)url.openConnection();

  connection.setConnectTimeout(3000);

  connection = (HttpURLConnection)url.openConnection();

  InputStream raw = connection.getInputStream();

  InputStream in = new BufferedInputStream(raw);

  byte[] data = new byte[in.available()];

  int bytesRead = 0;

  int offset = 0;

  while(offset < data.length) {

  bytesRead = in.read(data, offset, data.length - offset);

  if(bytesRead == -1) {

  break;

  }

  offset += bytesRead;

  }

  in.close();

  raw.close();

  String[] res = new String(data, "UTF-8").split("\n");

  List ipList = new ArrayList<>();

  for (String ip : res) {

  try {

  String[] parts = ip.split(",");

  if (Integer.parseInt(parts[1]) > 0) {

  ipList.add(parts[0]);

  }

  } catch (Exception e) {

  }

  }

  if (ipList.size() > 0) {

  TestDynamicIp.ipList = ipList;

  System.out.println("第" + ++getIpTime + "次获取动态IP " + ipList.size() + " 个");

  time += 1;

  }

  } catch (Exception e) {

  e.printStackTrace();

  System.err.println(">>>>>>>>>>>>>>获取IP出错");

  }

  try {

  Thread.sleep(sleepMs);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  }

  }

  }

  精灵代理ipIP地址改变专家,精灵代理ip软件是一款专门针对全国各地IP地址改变的产品,主要提供国内各地的IP代理服务器。可以让整台电脑的IP地址随心改变,适用于IP地址变更、网页加速、游戏加速、和突破本地网络限制。网络从此畅爽无比!

  精灵代理ip软件通过动态路由调整、全运营商的节点部署、7X24小时全网络动态监控、测速和数据中转等技术,有效解决用户在网游及网页中遇到的延时过高、登录困难、容易掉线等问题。精灵代理ip软件拥有上万条线路,真正覆盖全国网络,是市场上线路IP最多、最稳定高速、最优秀的IP代理软件。


最新资讯

推荐阅读

  1. 30

    2020-12

    API代理IP是什么?如何使用API代理IP

    API代理IP是什么?如何使用API代理IP?关于代理IP,我们已经了解了很多,知道了什么是代理IP,怎么使用代理IP,但还有一些概念不太明白,比如API代理。那么,什么是API代理呢?怎么使用API代理呢?A

  2. 30

    2019-04

    购买ip代理时要避免哪些错误

    如果你打算购买代理服务。不管你是打算用来实现web抓取、价格监视、广告验证或其他类型的在线操作,都必须认真挑选。下文给大家整理了购买ip代理时要避免哪些错误,一起来了解看看吧。(

  3. 24

    2019-07

    什么是动态代理IP?

    在区分什么是动态代理IP之前,首先我们要弄清楚,什么是代理IP?就是你在你的浏览器设置选项中(IE/chrome),手动输入你的代理ip地址。然后用浏览器去搜索,比如说访问百度,在百度搜

  4. 25

    2019-11

    爬虫过程中IP被封问题8种解决方法

    爬虫过程中IP被封问题8种解决方法!爬虫采集成为很多公司企业个人的需求,但正因为如此,反爬虫的技术也层出不穷,像时间限制、IP限制、验证码限制等等,都可能会导致爬虫无法进行,所以

  5. 02

    2020-11

    浅谈换ip软件的两种模式

    浅谈换ip软件的两种模式!如今互联网发展迅速,平时我们在网络上,有些时候难免会遇到一些ip阻碍,比如说你是做网络推广的,如果想要在一个平台上多发帖,那么光靠一个账号是不可行的,

  6. 19

    2019-04

    大数据爬虫为什么要使用IP代理

    大数据爬虫为什么要使用IP代理?如今互联网的飞速猛劲的发展,大数据的应用,大数据样本获得需要通过数据爬虫来实现,而爬虫工作者一般都绕不过代理IP这个问题,这是因为在网络爬虫抓