如果一个URL在使用IronWebScraper时返回404,如何继续抓取下一个URL



我正在构建一个小的抓取器,用于浏览一组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 方法。

后果:

  1. 我无法记录错误(并且在拨打第一个Request电话时,我无法知道它是否成功
  2. 不解析下一个 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);
}
}

最新更新