2011-01-30 8 views
1

그리스어 수업에 어휘 플래시 카드를 만드는 데 도움이되는 간단한 화면 스크레이퍼를 작성했습니다. 온라인 사전에서 단어를 긁어내어 플래시 카드 관리자가 이해할 수있는 형식으로 출력합니다.화면 스크레이퍼의 페이지를 캐시하는 것이 좋지 않습니까?

스크래퍼를 실행할 때마다 요청에 사전을 포격하고 싶지 않으므로 처음으로로드 할 때 각 페이지를 하드 드라이브에 캐시합니다 (물론 이것은 훨씬 빠릅니다). 이전에 캐싱을 한 번도 해 본 적이 없으므로 이런 종류의 모범 사례가 무엇인지 잘 모르겠습니다. 여기 내 해결책은 다음과 같습니다.

using System; 
using System.IO; 
using System.Net; 
using System.Web; 

public class PerseusDocument 
{ 
    readonly string url; 

    public PerseusDocument (string url) 
    { 
     this.url = url; 

     ... // (load the DOM with a third-party library) 
    } 

    static string cacheUrl; 
    static string CacheUrl { 
     get { 
      if (cacheUrl == null) { 
       cacheUrl = Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData), "perseus"); 
       Directory.CreateDirectory (cacheUrl); 
      } 

      return cacheUrl; 
     } 
    } 

    string FullCacheUrl { 
     get { return Path.Combine (CacheUrl, HttpUtility.UrlEncode (url)); } 
    } 

    bool IsCached { 
     get { return File.Exists (FullCacheUrl); } 
    } 

    string Html { 
     get { 
      if (IsCached) 
       return File.ReadAllText (FullCacheUrl); 

      WebClient client = new WebClient(); 
      string html = client.DownloadString (url); 

      using (StreamWriter file = new StreamWriter (FullCacheUrl)) 
       file.Write (html); 

      return html; 
     } 
    } 
} 

즉, URL과 동일한 이름을 가진 파일이 캐시에 있는지 단순히 확인합니다. 그렇다면로드하고, 그렇지 않으면 html을 새 파일에 저장합니다. 이런 식으로 일하는 데 어떤 눈부신 문제가 있습니까?

답변

3

캐시를 직접 만들 필요가 없습니다. 모든 요청은 WinINetCache를 통해 자동으로 라우팅됩니다. 캐시를 켜려면 다음을 수행하면됩니다.

webClient.CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default); 

서버가 페이지를 캐시 가능으로 정의하면 캐싱이 자동으로 수행됩니다.

+0

흠, 이것은 Mono에서 NotImplementedException을 제공합니다 (우분투에서 실행 중이며 OS X을 사용하는 일부 클래스 메이트와이 도구를 공유하므로 .NET이 옵션이 아닙니다). 사냥을하고 작동시킬 수있는 방법을 찾을 수 있는지 알아 보겠습니다. –

+0

@Matthew Ahh, 당신이 우분투에서 뛰고 있다는 것을 몰랐습니다. WinINetCache는 Windows입니다. 오징어 (http://www.squid-cache.org/)를 살펴 보겠습니다. 정식 프록시로 설치하면 무료로 캐싱을받을 수 있습니다. –

관련 문제