【问题标题】:How can I prevent web crawlers from affecting my cache (Redis, CDN, etc?)如何防止网络爬虫影响我的缓存(Redis、CDN 等?)
【发布时间】:2016-12-12 02:44:31
【问题描述】:

理论:如果网络爬虫爬取我的整个网站,我的默认缓存机制(例如 Redis)将被淹没,并且可能会老化错误的数据。 (取决于缓存策略)。

假设网络爬虫不需要我为最终用户提供的性能提升,我可以编辑我的应用以“保护缓存”

问题

  • 这是个好主意吗?
  • 网络爬虫是否测量交付内容之间的时间差?
  • 除了用户代理,我是否应该“标记”引用 robots.txt 的会话并假设它们是爬虫?
  • 我应该如何以管理方式或程序方式处理此交付?
  • 举个极端的例子,我可以限制网络爬虫吗?

如果我以编程方式实现这一点,我需要告诉 GetFromCacheAsync 不要根据某些客户端信息更新缓存。

  • 添加方法重载以确定是否应更新缓存是否违反任何领域驱动设计理论?
  • 我应该把“更新Redis”或“不更新Redis”的逻辑放在哪里……这方面我认为与DDD最相关

HomeController.cs

 public async Task<ActionResult> Events()
 {
      ViewBag.Events = await eventSvc.GetLiveEvents(DateTime.Now);
     return View();
 }

Services.EventManagementService.cs

public async Task<List<Event>> GetLiveEvents(DateTime currentDate)
{
   //return ctx.Events.Where(e => e.StatusId == (int)EventStatus.Live && e.EventDate >= DateTime.Now).ToList();
  return await cloudCtx.GetLiveEvents(DateTime.Now);
}

Data.CloudContext.cs

    public async Task<List<Event>> GetLiveEvents(DateTime currentDate)
    {
        string year = currentDate.Year.ToString();
        var key = GenerateLiveEventsKey(year); 

        var yearEvents = await cache.GetFromCacheAsync<List<Event>>(key, async () =>
        { 
            List<Event> events = new List<Event>();
            string partitionKey = year;

            TableQuery<EventRead> query = new TableQuery<EventRead>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey));
            TableQuerySegment<EventRead> currentSegment = null;
            var result = tableEvents.ExecuteQuery(query);
            while (currentSegment == null || currentSegment.ContinuationToken != null)
            {
                currentSegment = await tableMyEvents.ExecuteQuerySegmentedAsync(query, currentSegment != null ? currentSegment.ContinuationToken : null);
                foreach (EventRead nosqlEvent in currentSegment.Results)
                {
                    var eventObj = nosqlEvent.ToEvent(true);
                    events.Add(eventObj);
                }
            }

            return events;
        });
        return yearEvents.Where(e => e.EventDate >= currentDate).ToList();
    }

Data.Cache.cs

  public async Task<T> GetFromCacheAsync<T>(string key, Func<Task<T>> missedCacheCall, TimeSpan timeToLive)
    {
        if (!IsCacheAvailable)
        {
            var ret = await missedCacheCall();
            return ret;
        }

        IDatabase cache = Connection.GetDatabase();
        var obj = await cache.GetAsync<T>(key);
        if (obj == null)
        {
            obj = await missedCacheCall();
            if (obj != null)
            {
                cache.Set(key, obj);
            }
        }
        return obj;
    }

【问题讨论】:

    标签: caching web-crawler robots.txt cache-control


    【解决方案1】:
    Is this a good idea?
    

    如果它没有损坏(或者如果首先没有真正的问题),请不要修复它。

    Do web crawlers measure the time difference between delivered content?
    

    谷歌可以。如有必要,它的机器人会减慢爬行速度。

    Aside from user agent, should I "tag" a session that references
    robots.txt and assume they are a crawler?
    

    用户代理已经足够好了。

    How should I administratively, or programmatically handle this delivery?
    

    返回 503 告诉机器人他们来得太频繁了。

    In an extreme example, can I throttle a web crawler?
    

    是的,见上文。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多