16

私は自分の古いコードを再訪していて、URL に基づいて Web サイトのタイトルを取得する方法を見つけました。多くの場合、結果を生成できず、時には誤った結果を生成することさえあるため、これは実際には安定したメソッドと呼ばれるものではありません。また、代替エンコーディングであるため、タイトルの一部の文字が表示されないことがあります。

この古いバージョンを改善するための提案はありますか?

public static string SuggestTitle(string url, int timeout)
{
    WebResponse response = null;
    string line = string.Empty;

    try
    {
        WebRequest request = WebRequest.Create(url);
        request.Timeout = timeout;

        response = request.GetResponse();
        Stream streamReceive = response.GetResponseStream();
        Encoding encoding = System.Text.Encoding.GetEncoding("utf-8");
        StreamReader streamRead = new System.IO.StreamReader(streamReceive, encoding);

        while(streamRead.EndOfStream != true)
        {
            line = streamRead.ReadLine();
            if (line.Contains("<title>"))
            {
                line = line.Split(new char[] { '<', '>' })[2];
                break;
            }
        }
    }
    catch (Exception) { }
    finally
    {
        if (response != null)
        {
            response.Close();
        }
    }

    return line;
}

最後に 1 つ - ページがフェッチされるまでコードがブロックされるため、コードの実行速度も向上させたいと考えています。そのため、ページ全体ではなくサイト ヘッダーのみを取得できれば、それは素晴らしいことです。

4

3 に答える 3

48

コンテンツを取得する簡単な方法:

WebClient x = new WebClient();
string source = x.DownloadString("http://www.singingeels.com/");

タイトルを取得するためのより簡単で信頼性の高い方法:

string title = Regex.Match(source, @"\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>",
    RegexOptions.IgnoreCase).Groups["Title"].Value;
于 2008-11-30T20:38:50.507 に答える
-1

これを達成するには、いくつかのことを行う必要があります。

  • アプリをスレッド化して、一度に複数のリクエストを処理し、作成される HTTP リクエストの数を最大化できるようにします。
  • 非同期リクエスト中に、プルバックしたい量のデータのみをダウンロードします。おそらく、戻ってきたときにデータを解析することができます
  • おそらく正規表現を使用してタイトル名を引き出したい

以前に SEO ボットでこれを行ったことがあり、一度にほぼ 10,000 件のリクエストを処理できました。各 Web リクエストがスレッド内で自己完結できることを確認する必要があるだけです。

于 2008-11-30T20:29:34.020 に答える