码迷,mamicode.com
首页 > Web开发 > 详细

携程智联等网站百分之60%的访问量都是爬虫,对此我们应该怎么办

时间:2018-10-14 23:03:40      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:部分   private   string   目的   网站   datetime   怎么   加ip   address   

前言

爬虫和反爬虫日益成为每家公司的标配系统。

爬虫在情报获取、虚假流量、动态定价、恶意攻击、薅羊毛等方面都能起到很关键的作用,所以每家公司都或多或少的需要开发一些爬虫程序,业界在这方面的成熟的方案也非常多。

有矛就有盾,每家公司也相应的需要反爬虫系统来达到数据保护、系统稳定性保障、竞争优势保持的目的。

像安全与黑客从来都是相辅相成一样。

爬虫与反爬虫也是在双方程序员的斗智斗勇的过程不断发展和成长的。

简单的反爬虫:

通过Headers反爬虫

从用户请求的Headers反爬虫是最常见的反爬虫策略。很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)。如果遇到了这类反爬虫机制,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改为目标网站域名。对于检测Headers的反爬虫,在爬虫中修改或者添加Headers就能很好的绕过。

基于用户行为反爬虫:

对于第二种情况,可以在每次请求后随机间隔几秒再进行下一次请求。有些有逻辑漏洞的网站,可以通过请求几次,退出登录,重新登录,继续请求来绕过同一账号短时间内不能多次进行相同请求的限制。

参数加密:js 处理过程可以写的很复杂,以至于爬虫程序员没法分析。

 

我们在和谁对抗?

 

    • 应届毕业生(三月份爬虫)
      三月份爬虫通常和毕业生(本科生、硕士、博士等)有关,他们的爬虫简单粗暴,为了让论文有数据支撑,根本不管服务器压力,加上人数不可预测,很容易弄挂站点。

    • 创业小公司
      每年新增的创业公司很多,程序开发完后,缺少数据支撑,出于公司生死存亡的考虑,不断爬取数据。

    • 不小心写错了没人去停止的失控小爬虫
      像知乎,携程,财经等网站,可能高达60%的访问量是爬虫。你就算直接封杀,也无济于事。他们可能根本爬不到任何数据了,除了http code是200以外,一切都是不对的,但由于托管后无人认领,仍然会依然孜孜不倦地爬取。

    • 成型的商业对手
      这是最大的对手,有技术,有钱,要什么有什么,如果和你死磕,你就只能硬着头皮和他死磕。

    • 抽风的搜索引擎
      搜索引擎也有抽风的时候,而且一抽风就会导致服务器性能下降,请求量跟网络攻击没有区别。

 

 

今天就说一说基本的反爬虫,实现方式是拒绝频繁访问的ip,首先我们要实现 IHttpModule接口 

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.SessionState;
using System.Configuration;
namespace MyHttp
{
  public class UrlReWrite : IHttpModule
  {
    /// <summary>
    /// 单个IP最大连接限制数量
    /// </summary>
    private int rowCount = Convert.ToInt32(ConfigurationSettings.AppSettings["HttpRowCount"]);
    /// <summary>
    /// 指定区域时间范围 单位分
    /// </summary>
    private int httpTime = Convert.ToInt32(ConfigurationSettings.AppSettings["HttpTime"]);
    public void Init(HttpApplication application)
    {
      application.BeginRequest += (new
         EventHandler(this.Application_BeginRequest));
      application.EndRequest += (new
         EventHandler(this.Application_EndRequest));
    }
    private void Application_BeginRequest(Object source, EventArgs e)
    {
      HttpApplication Application = (HttpApplication)source;
      HttpContext ctx = Application.Context;
      //IP地址
      string isIp = ctx.Request.UserHostAddress;
      if (ctx.Application["time"] == null)
      {
        ctx.Application["time"] = DateTime.Now;
      }
      else
      {
        DateTime isTime = (DateTime)ctx.Application["time"];
        int timeTract = Convert.ToInt32(DateTime.Now.Subtract(isTime).Minutes.ToString());
        if (timeTract > (httpTime - 1))
        {
          ctx.Application["time"] = null;
          ctx.Application["myip"] = null;
        }
      }
      if (ctx.Application["myip"] != null && ctx.Application["myip"] is CartIp)
      {
        CartIp cartIp = (CartIp)ctx.Application["myip"];
        cartIp.Insert(isIp);
        ctx.Application["myip"] = cartIp;
        if (cartIp.GetCount(isIp) > rowCount)
        {
          ctx.Response.Clear();
          ctx.Response.Close();
        }
      }
      else
      {
        CartIp cartIp = new CartIp();
        cartIp.Insert(isIp);
        HttpContext.Current.Application["myip"] = cartIp;
      }
    }
    private void Application_EndRequest(Object source, EventArgs e)
    {
    }
    public void Dispose()
    {
    }
  }
}

 

ListIp 类

using System;
using System.Collections.Generic;
using System.Text;
namespace MyHttp
{
  [Serializable]
  public class ListIp
  {
    private string ip;
    private int count;
    /// <summary>
    /// IP地址
    /// </summary>
    public string IP
    {
      get { return ip; }
      set { ip = value; }
    }
    /// <summary>
    /// 累加数量
    /// </summary>
    public int Count
    {
      get { return count; }
      set { count = value; }
    }
  }
  [Serializable]
  public class CartIp
  {
    public CartIp()
    {
      if (_listIp == null)
      {
        _listIp = new List<ListIp>();
      }
    }
    private List<ListIp> _listIp;
    public List<ListIp> _ListIp
    {
      get { return _listIp; }
      set { _listIp = value; }
    }
    /// <summary>
    /// 添加IP
    /// </summary>
    public void Insert(string ip)
    {
      int indexof = ItemLastInfo(ip);
      if (indexof == -1)
      {
        //不存在
        ListIp item = new ListIp();
        item.IP = ip;
        _listIp.Add(item);
      }
      else
      {
        _listIp[indexof].Count += 1;
      }
    }
    //判断IP是否存在
    public int ItemLastInfo(string ip)
    {
      int index = 0;
      foreach (ListIp item in _ListIp)
      {
        if (item.IP == ip)
        {
          return index;//存在
        }
        index += 1;
      }
      return -1;//不存在
    }
    /// <summary>
    /// 获得IP的数量
    /// </summary>
    /// <param name="ip"></param>
    /// <returns></returns>
    public int GetCount(string ip)
    {
      foreach (ListIp item in _ListIp)
      {
        if (item.IP == ip)
        {
          return item.Count;//存在
        }
      }
      return -1;//不存在
    }
  }
}

在web.config 配置访问规则

<appSettings>
<add key="HttpRowCount" value="100"/>
<add key="HttpTime" value="10"/>
</appSettings>
<system.web>
  <httpModules>
  <add name="UrlReWrite" type="MyHttp.UrlReWrite"/>
 </httpModules>
</system.web>

 对于这种方式的反反爬虫只能是放慢爬虫速度,防止被拉入黑名单!。。

携程智联等网站百分之60%的访问量都是爬虫,对此我们应该怎么办

标签:部分   private   string   目的   网站   datetime   怎么   加ip   address   

原文地址:https://www.cnblogs.com/ZaraNet/p/9788297.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!