3

Webクローラーの作成を開始しようとしました。私が理解できないこの混乱を得るまで、順調に進んでいました。私は次のコードを書きました:

私はhttp://www.google.com文字列として渡していますURL

public void crawlURL(string URL, string depth)
{
    if (!checkPageHasBeenCrawled(URL))
    {
        PageContent = getURLContent(URL);
        MatchCollection matches = Regex.Matches(PageContent, "href=\"", RegexOptions.IgnoreCase);
        int count = matches.Count;
    }
} 

private string getURLContent(string URL)
{
    string content;
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
    request.UserAgent = "Fetching contents Data";
    WebResponse response = request.GetResponse();
    Stream stream = response.GetResponseStream();

    StreamReader reader = new StreamReader(stream);
    content = reader.ReadToEnd();

    reader.Close();
    stream.Close();
    return content;
}

問題: ページ (http://www.google.com またはその他の Web サイト) のすべてのリンクを取得しようとしていますが、正規表現の一致からのリンクの数が少なくなります。ソースコードを手動で「href =」という単語をチェックしたところ、リンク数は 19 になりましたが、41 回出現しました。コードから単語の数が減る理由がわかりません。

4

1 に答える 1

0

正規表現パターンを修正してテストしました。以下はより効率的に機能するはずです。google.ca から 11 件の一致を取得します

public void crawlURL(string URL)
        {

            PageContent = getURLContent(URL);
            MatchCollection matches = Regex.Matches(PageContent, "(href=\"https?://[a-z0-9-._~:/?#\\[\\]@!$&'()*+,;=]+(?=\"|$))", RegexOptions.IgnoreCase);
            foreach (Match match in matches)
                Console.WriteLine(match.Value);

            int count = matches.Count;

        }

        private string getURLContent(string URL)
        {
            string content;
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
            request.UserAgent = "Fetching contents Data";
            WebResponse response = request.GetResponse();
            Stream stream = response.GetResponseStream();

            StreamReader reader = new StreamReader(stream);
            content = reader.ReadToEnd();

            reader.Close();
            stream.Close();
            return content;
        }
于 2012-12-12T07:54:00.270 に答える