注意: 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. 11

    2019-05

    怎么换IP地址做推广

    怎么换IP地址做推广?现在网上有很多广告联盟点击,想必做网赚的朋友都很熟悉的,通过每次点击广告来获取收益的。而这个跟刷网页排名刷网页点击率那些都一样道理的,只需每次换完IP再

  2. 17

    2019-07

    可匿名的代理服务器

    有时候你的账号或者被限制某一地区的ip登录或访问时,如何能恢复正常访问?这个时候你就需要用到代理服务器了。什么是代理服务器?代理服务器充当客户请求端(客户端)和目的服务端(

  3. 03

    2020-06

    代理IP给网络爬虫带来的益处

    代理IP给网络爬虫带来的益处!现如今网络爬虫工作人员在工作中的过程中,常常会遇到总体目标网址的反爬体制的限定,亦或是抓取数据信息的速率过快,给网络服务器产生了太大的工作压力,

  4. 27

    2019-05

    为什么不能用免费代理IP上网

    平时大家上网时,可能经常会碰到访问某些资源受限情况,有时是自身IP地址被限制,有时是对方只允许某地IP进行访问,当遇到这种情况时,很多人都会在网络中查找免费代理IP进行解决,而小

  5. 04

    2019-12

    浅谈代理ip具有的功能及实现功能的方式

    浅谈代理ip具有的功能及实现功能的方式!ip代理精灵是一款自动更换ip地址的软件,是非常好的ip代理软件,支持并各类上网方式的ip地址自动更换,比如广告联盟、刷单、刷票等。

  6. 06

    2020-05

    代理IP使用时常见的问题

    代理IP使用时常见的问题!在我们日常使用代理IP的过程中,必然会碰到各种各样的问题,很多用户一遇到问题就认为是代理IP的问题,然后什么也不管,直接找客服质问,而客服测试过后却发现