Завершение программы MiniCrawler.
Рассмотрим подробнее работу программы MiniCrawler. Она начинается с ввода пользователем конкретного URI в командной строке. В методе Main()
этот URI сохраняется в строковой переменной uristr
. Затем по указанному URI формируется запрос, и переменной uristr
присваивается пустое значение, указывающее на то, что данный URI уже использован. Далее отправляется запрос и получается ответ. После этого содержимое читается из потока ввода, возвращаемого методом GetResponseStream()
и заключаемого в оболочку класса StreamReader
. Для этой цели вызывается метод ReadToEnd()
, возвращающий все содержимое в виде строки из потока ввода.
Далее программа осуществляет поиск ссылки в полученном содержимом. Для этого вызывается статический метод FindLink()
, определяемый в программе MiniCrawler. Этот метод вызывается со строкой содержимого и исходным положением, с которого начинается поиск в полученном содержимом. Эти значения передаются методу FindLink()
в виде параметров htmlstr
и startloc
соответственно. Обратите внимание на то, что параметр startloc
относится к типу ref
. Сначала в методе FindLink()
создается копия строки содержимого в нижнем регистре, а затем осуществляется поиск подстроки href="http, обозначающей ссылку. Если эта подстрока найдена, то URI копируется в строковую переменную uri
, а значение параметра startloc
обновляется и становится равным концу ссылки. Но поскольку параметр startloc
относится к типу ref
, то это приводит к обновлению соответствующего аргумента метода Main()
, активизируя поиск с того места, где он был прерван. В конечном итоге возвращается значение переменной uri
. Эта переменная инициализирована пустым значением, и поэтому если ссылка не найдена, то возвращается пустая ссылка, обозначающая неудачный исход поиска.
Если ссылка, возвращаемая методом FindLink()
, не является пустой, то она отображается в методе Main()
, и далее программа запрашивает у пользователя очередные действия. Пользователю предоставляются одна из трех следующих возможностей: перейти по найденной ссылке, нажав клавишу <���П>, искать следующую ссылку в имеющемся содержимом, нажав клавишу <���И>, или же выйти из программы, нажав клавишу <���В>. Если пользователь нажмет клавишу <���П>, то программа осуществит переход по найденной ссылке и получит новое содержимое по этой ссылке. После этого поиск очередной ссылки будет начат уже в новом содержимом. Этот процесс продолжается до тех пор, пока не будут исчерпаны все возможные ссылки.
В качестве упражнения вы сами можете усовершенствовать программу MiniCrawler, дополнив ее, например, возможностью перехода по относительным ссылкам. Сделать это не так уж и трудно. Кроме того, вы можете полностью автоматизировать поисковый робот, чтобы он сам переходил по найденной ссылке без вмешательства со стороны пользователя, начиная со ссылки, обнаруженной на самой первой странице полученного содержимого, и продолжая переход по ссылкам на новых страницах. Как только будет достигнут тупик, поисковый робот должен вернуться на один уровень назад, найти следующую ссылку и продолжить переход по ссылке. Для организации именно такого алгоритма работы программы вам потребуется стек, в котором должны храниться идентификаторы URI и текущее состояние поиска в строке URL С этой целью можно, в частности, воспользоваться коллекцией класса Stack
. В качестве более сложной, но интересной задачи попробуйте организовать вывод ссылок в виде дерева.
Применение класса WebClient
В заключение этой главы уместно рассмотреть класс WebClient
. Как упоминалось в самом ее начале, класс WebClient
рекомендуется использовать вместо классов WebRequest
и WebResponse
в том случае, если в приложении требуется лишь выгружать или загружать данные из Интернета. Преимущество класса WebClient
заключается в том, что он автоматически выполняет многие операции, освобождая от их программирования вручную.
В классе WebClient
определяется единственный конструктор.
public WebClient()
Кроме того, в классе WebClient
определяются свойства, сведенные в табл.26.6, а также целый ряд методов, поддерживающих как синхронную, так и асинхронную передачу данных. Но поскольку рассмотрение асинхронной передачи данных выходит за рамки этой главы, то в табл. 26.7 приведены только те методы, которые поддерживают синхронную передачу данных. Все методы класса WebClient
генерируют исключение WebException
, если во время передачи данных возникает ошибка.
Читать дальше