0

我正在用 C# 编写一个网络爬虫。在获取页面上所有链接的方法中,我想返回链接列表,但使用 LINQ 对其进行“过滤”,以便列表仅包含存在的 url。我有一个名为 RemoteFileExists 的辅助方法,它返回一个布尔值。在方法结束时,我编写了以下 LINQ 行:

//Links is a List<string> that hasn't been filtered
return (from link in Links
                where RemoteFileExists(link)
                select link).ToList<string>();

出于某种原因,当我这样做时,列表返回为空。

远程文件存在:

static bool RemoteFileExists(string url)
    {
        try
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.Method = "HEAD";
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            return (response.StatusCode == HttpStatusCode.OK);
        }
        catch
        {
            return false;
        }
4

2 回答 2

3

我猜要么你的链接不正确,要么你的网站不支持HEAD. 由于此代码有效

List<string> Links = new List<string>() {"http://www.google.com"};
var res = ( from link in Links
            where RemoteFileExists(link)
            select link).ToList<string>();
于 2013-01-06T18:19:24.747 回答
0

我一直在我的代码中使用 RemoteFileExists 方法。有时程序挂起是因为请求没有关闭。现在我正在使用以下代码:

static bool RemoteFileExists(string url)
{
  try
  {
    HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
    request.Method = "HEAD";
    HttpWebResponse response = request.GetResponse() as HttpWebResponse;
    response.Close();

    return (response.StatusCode == HttpStatusCode.OK);
  }
  catch
  {
    return false;
  }
}

此外,上面的代码没有检测到重定向。这对爬虫很重要,因为您需要知道何时前进到另一个页面,而不是跟随重定向到同一页面。

于 2013-03-02T10:37:10.857 回答