我正在构建一个小的抓取器,用于浏览一组URL。
目前我有这样的东西:
public class MyScraper: WebScraper{
private Queue<String> _urlToParse = new Queue<String>();
public override void Init(){
//Initializing _urlToParse with more than 1000 URLs
Request(_urlToParse.Dequeue(), Parse);
}
public override void Parse(Response response){
if(response.WasSuccessful){
//...Parsing
}else{
//logging error
}
Request(_urlToParse.Dequeue(), Parse);
}
}
但是当我收到 404 错误时,不会调用 Parse 方法。
后果:
- 我无法记录错误(并且在拨打第一个
Request
电话时,我无法知道它是否成功 - 不解析下一个 URL
我在想我会带着回应去Parse
方法。WasSuccess = false,然后能够检查状态代码。
我应该如何处理这个 404?
我能找到的记录失败 Url 的唯一方法是覆盖Log(string Message, LogLevel Type)
方法。 似乎没有充分的理由response.WasSuccessful
.正如你所说,它似乎只有在成功时才打电话给Parse()
。
public class MyScraper : WebScraper
{
private Queue<string> _urlToParse = new Queue<string>();
public override void Init()
{
_urlToParse.Enqueue("https://stackoverflow.com/");
_urlToParse.Enqueue("https://stackoverflow.com/nothing");
_urlToParse.Enqueue("https://google.com/");
Request(_urlToParse.Dequeue(), Parse);
}
public override void Parse(Response response)
{
Console.WriteLine("Handeling response");
if (_urlToParse.Count > 0)
{
Request(_urlToParse.Dequeue(), Parse);
}
}
public override void Log(string Message, LogLevel Type)
{
if (Type.HasFlag(LogLevel.Critical) & Message.StartsWith("Url failed permanently"))
{
Console.WriteLine($"Logging failed Url: {Message}");
if (_urlToParse.Count > 0)
{
Request(_urlToParse.Dequeue(), Parse);
}
}
}
}
另一种选择是WebScraper
似乎有一个MaxHttpConnectionLimit
,您可以使用它来确保它一次只打开一个连接。
public class MyScraper : WebScraper
{
public override void Init()
{
MaxHttpConnectionLimit = 1;
var urls = new string[]
{
"https://stackoverflow.com/",
"https://stackoverflow.com/nothing",
"https://google.com/"
};
Request(urls, Parse);
}
public override void Parse(Response response)
{
Console.WriteLine("Handeling response");
}
public override void Log(string Message, LogLevel Type)
{
if (Type.HasFlag(LogLevel.Critical) & Message.StartsWith("Url failed permanently"))
{
Console.WriteLine($"Logging failed Url: {Message}");
}
base.Log(Message, Type);
}
}