Читать «C# 4.0 полное руководство - 2011» онлайн - страница 641
Герберт Шилдт
/* MiniCrawler: скелетный вариант поискового робота.
Применение: для запуска поискового робота укажите URI в командной строке. Например, для того чтобы начать поиск с адреса www.McGraw-Hill.com, введите следующую команду:
MiniCrawler http://McGraw-Hill.com
*/
using System; using System.Net; using System.10;
class MiniCrawler {
// Найти ссылку в строке содержимого, static string FindLink(string htmlstr,
ref int startloc) {
int i;
int start, end; string uri = null;
i = htmlstr.IndexOf("href=\"http", startloc,
StringComparison.OrdinallgnoreCase);
if(i != -1) {
start = htmlstr. IndexOf (1111, i) + 1; end = htmlstr. IndexOf (1111, 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 ("Переход по ссылке 11 + 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.ReadToEndO ;
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.OrdinallgnoreCase)) {
uristr = string.Copy(link); break;
} else if(string.Equals(answer, "B",
StringComparison.OrdinallgnoreCase)) { break;
} else if(string.Equals(answer, "И",
StringComparison.OrdinallgnoreCase)) {
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);