0

C# で Web クローラーを作成しています。ページ上のすべてのリンクを取得するメソッド内で、リンクのリストを返したいのですが、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 に答える