我有一个抓取工具,可以下载页面并对其进行处理。 1小时后,每个请求来源需要1分钟或更长时间才能完成,但是在程序开始时,每个地址都会在1秒内下载,我怀疑目标网站限制了我的请求或流量,但是当我关闭程序并运行它时再次表现恢复正常。所以我的代码存在一些问题 任何帮助都会非常感激
public class PageFetcher
{
public PageFetcher() { }
public PageFetcher(string urlAddress) { URLAddress = urlAddress; }
private int relayPageCount = 0;
public string URLAddress { get; set; }
public string FetchingEncoding { get; set; }
public PageFetchResult Fetch()
{
PageFetchResult fetchResult = new PageFetchResult();
HttpWebRequest req = null;
HttpWebResponse resp = null;
try
{
req = (HttpWebRequest)HttpWebRequest.Create(URLAddress);
req.UserAgent = "Mozilla/4.0";
req.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip, deflate");
resp = (HttpWebResponse)req.GetResponse();
string resultHTML = "";
byte[] reqHTML = ResponseAsBytes(resp);
Stream resultStream = new MemoryStream(reqHTML);
resultStream.Position = 0;
string contentEncoding = resp.ContentEncoding.ToLower();
if (contentEncoding.Contains("gzip") || contentEncoding.Contains("deflate"))
{
if (contentEncoding.Contains("gzip"))
resultStream = new GZipStream(resultStream, CompressionMode.Decompress);
if (contentEncoding.Contains("deflate"))
resultStream = new DeflateStream(resultStream, CompressionMode.Decompress);
}
StreamReader readerStream = null;
if (!string.IsNullOrEmpty(FetchingEncoding))
readerStream = new StreamReader(resultStream, Encoding.GetEncoding(FetchingEncoding));
else if (!string.IsNullOrEmpty(resp.CharacterSet))
readerStream = new StreamReader(resultStream, Encoding.GetEncoding(resp.CharacterSet));
resultHTML = readerStream.ReadToEnd();
req.Abort();
resp.Close();
fetchResult.IsOK = true;
fetchResult.ResultHTML = resultHTML;
URLAddress = resp.ResponseUri.AbsoluteUri;
}
catch (Exception ex)
{
if (req != null)
req.Abort();
if (resp != null)
resp.Close();
fetchResult.IsOK = false;
fetchResult.ErrorMessage = ex.Message;
}
return fetchResult;
}
答案 0 :(得分:1)
您的代码看起来不错。您可能会看到减速的几个原因。
第一:上游缓存。例如,如果您在同一组URL上多次运行测试,一旦您点击URL,它将被缓存在许多地方 - 您的代理服务器(如果有的话),您的互联网提供商的代理(如果他们有他们),目的地网站的缓存等。
因此,对于任何抓取工具速度测试,请确保您从一组非常大的网址中随机选择网址(足够大,以至于因抓取而导致其中任何网站被缓存的可能性非常小)。
接下来,我会查看您应用的其余部分。你确定它的实际读取速度很慢吗?或者是应用程序的其他部分(例如存储获取数据的部分)可能导致速度减慢。由于大多数数据存储机制(在RAM中,在数据库中等)因为在其中放入更多数据而变得慢得多,因此您应该确保只对HTTP访问进行计时,而不是考虑整体爬虫吞吐量,包括存储。