Читать «C# 4.0: полное руководство» онлайн - страница 664

Герберт Шилдт

      end = htmlstr.IndexOf('"', start);

      uri = htmlstr.Substring(start, end - start);

      startloc = end;

    }

    return uri;

  }

  static void Main(string[] args) {

    string link = null; string str; string answer;

    int curloc; // содержит текущее положение в ответе

    if (args.Length != 1) {

      Console.WriteLine("Применение: MiniCrawler <uri>");

      return;

    }

    string uristr = args[0]; // содержит текущий URI

    HttpWebResponse resp = null;

    try {

      do {

        Console.WriteLine("Переход по ссылке " + uristr);

        // Создать объект запроса типа WebRequest по указанному URI.

        HttpWebRequest req = (HttpWebRequest)

                    WebRequest.Create(uristr);

        uristr = null; // запретить дальнейшее использование этого URI

        // Отправить сформированный запрос и получить на него ответ,

        resp = (HttpWebResponse)req.GetResponse();

        Stream istrm = resp.GetResponseStream();

        // Заключить поток ввода в оболочку класса StreamReader.

        StreamReader rdr = new StreamReader(istrm);

        // Прочитать всю страницу,

        str = rdr.ReadToEnd();

        curloc = 0;

        do {

          // Найти следующий URI для перехода по ссылке,

          link = FindLink(str, ref curloc);

          if (link != null) {

            Console.WriteLine("Найдена ссылка: " + link);

            Console.Write("Перейти по ссылке, Искать дальше, Выйти?");

            answer = Console.ReadLine();

            if (string.Equals(answer, "П", StringComparison.OrdinalIgnoreCase)) {

              uristr = string.Copy(link); break;

            }

            else if (string.Equals(answer, "B", StringComparison.OrdinalIgnoreCase)) {

              break;

            }

            else if (string.Equals(answer, "И", StringComparison.OrdinalIgnoreCase)) {

              Console.WriteLine("Поиск следующей ссылки.");

            }

          }

          else {

            Console.WriteLine("Больше ссылок не найдено.");

            break;

          }

        } while (link.Length > 0);

        // Закрыть ответный поток,

        if (resp != null) resp.Close();

      } while (uristr != null);

    }

    catch (WebException exc) {

      Console.WriteLine("Сетевая ошибка: " + exc.Message +

      "Код состояния: " + exc.Status);

    }

    catch (ProtocolViolationException exc) {

      Console.WriteLine("Протокольная ошибка: " + exc.Message);

    }

    catch (UriFormatException exc) {

      Console.WriteLine("Ошибка формата URI: " + exc.Message);

    }

    catch (NotSupportedException exc) {

      Console.WriteLine("Неизвестный протокол: " + exc.Message);

    }

    catch (IOException exc) {

      Console.WriteLine("Ошибка ввода-вывода: " + exc.Message);

    }

    finally {

      if (resp != null) resp.Close();

      Console.WriteLine("Завершение программы MiniCrawler.");

    }

  }

}

Ниже приведен пример сеанса поиска, начиная с адреса www .McGraw-Hill. com. Следует иметь в виду, что конкретный результат поиска зависит от состояния содержимого на момент поиска.

Переход по ссылке http://mcgraw-hill.com