gpt4 book ai didi

c# - 这是为我的屏幕抓取器缓存页面的糟糕方法吗?

转载 作者:可可西里 更新时间:2023-11-01 17:03:58 28 4
gpt4 key购买 nike

我写了一个简单的屏幕抓取程序来帮助我为我的希腊语类(class)制作词汇卡片。它从在线词典中抓取单词,并以我的闪存卡管理员可以理解的格式输出它们。

我不想每次运行爬虫时都用请求轰炸字典,所以我在第一次加载它们时将每个页面缓存到我的硬盘(当然,这也使它更快)。我以前从未做过任何缓存,所以我不确定这种事情的最佳实践是什么。这是我的解决方案:

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 保存到一个新文件中。这样做有什么明显的问题吗?

最佳答案

您不需要构建自己的缓存。您的所有请求都将自动通过 WinINetCache 进行路由。要打开缓存,只需执行以下操作:

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

只要服务器将其页面定义为可缓存,缓存就会自动发生。

关于c# - 这是为我的屏幕抓取器缓存页面的糟糕方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4845194/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com