Продолжаем перевод статьи о парсинге или граббинге сайтов используя c#.
Первая часть:Парсинг сайтов на c#. Часть 1. Использование WebBrowser
Класс WebClient находится в пространстве имен SyStem.Net, он реализует возможность получения из данных интернета. С его помощью можно получить исходный код страницы HTML в виде строки или в виде файла.
Пример: Получаем исходный код страницы google.com
- Добавляем на форму кнопку и RichTextBox
- Щелкаем по кнопке два раза мышкой. Тем самым добавляя событие нажатия на кнопку
- Добавляем в это событие следующий код:
WebClient wc = new WebClient(); string answer = wc.DownloadString('http://www.google.com'); richTextBox1.AppendText(answer);
Используем метод DownLoadString который возвращает данные в виде строки и добавляем эту строку в richtextbox. Результат работы выглядит следующим образом:
Далее можно применять регулярные выражений (RegEx) к полученной строке, получая необходимую информацию (например таким образом можно быстро получить, то есть провести граббинг картинок, email, ссылок и т.д.
Пример: Граббим картинки
Получив код страницы в предыдущем примере и найдя, допустим, все ссылки на изображения (как это сделать опишу позже) мы можем сохранить все картинки себе на компьютер следующим способом:
WebClient wc = new WebClient(); wc.DownloadFile(@'http://jobtools.ru/wp-content/uploads/2013/04/dbfshow090-150x150.jpg', 'dbfshow.jpg');
Изображение будет скачено в папку с программой.
Первым параметром идет ссылка на изображение, во втором параметре имя файла для сохранения.
В примере ниже будет показано как заливать файлы на хостинг, таким образом можно реализовать практически автоматический парсинг картинок с определенных сайтов и добавлением их на своих ресурсах, проектах.
Пример: Блокирующий режим WebClient
- Добавьте следующий код в событие нажатия кнопки:
WebClient wc = new WebClient(); wc.DownloadData('http://www.yandex.ru');
- После того как Вы запустите проект и нажмете на кнопку, попробуйте по перемещать форму или нажать на еще какие-нибудь элементы формы. Она не будет отвечать на Ваши действия. Форма заблокирована выполнением операции считывания данных с указанного Вами сайта
- Почему же так происходит? Все дело в том, что загрузка строки, файла или иных данных из Интернета может занимает длительное время (зависит от скорости соединения, загруженности сервера и т.д.), а класс WebClient, в нашем примере, работает в потоке, который ответственен за отрисовку пользовательского интерфейса (UI). Это и приводит к подвисанию формы.
- Это значит, что поток не продолжит обработку других, последующих команд нашей программы, пока не получит все запрашиваемые данные с интернета. Это называется блокирующий режим. Выход — это использовать не блокирующий режим (асинхронный
Пример: Неблокирующий режим WebClient
- Используем процедуру DownloadStringAsync() — которая запустит скачивание данных с Интернета (в этом случае как строку) в отдельном потоке. Это означает, что наше приложение будет выполнятся дальше, пока данные скачиваются параллельно
wc.DownloadStringAsync(new Uri('http://www.yandex.ru'));
- Приведенный выше код скачает данные в виде строки, не блокируя приложение. Но мы не узнаем, когда данные будут полностью загружены. Для это необходимо определить событие завершения загрузки, что бы приложение могло нам сообщить об окончании операции. В данном случае мы должны добавить обработку события DownloadStringCompleted.
- Следующий код начнет выгрузку данных с Интернета в виде строки в неблокирующем режиме и по окончанию загрузки вызовет событие DownloadStringCompleted, тем самым уведомит.
WebClient wc = new WebClient(); wc.DownloadStringCompleted+=new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted); wc.DownloadStringAsync(new Uri('http://www.yandex.ru'));
- Загруженная строка передается в качестве аргумента событию DownloadStringAsync, и мы её можем дальше обработать следующим способом
void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { //Получаем доступ к скачанной строке string html = e.Result; //Используем строку по своему усмотрению textBox1.Text = html; }
Пример: Загрузка файлов на хостинг
String uriString = 'FileUploadPagePath'; // Создаем новый экземпляр WebClient WebClient myWebClient = new WebClient(); //Путь КУДА будем сохранять файл string fileName = 'File Path'; //Заливка файла по указанному пути //Используется метод HTTP POST byte[] responseArray = myWebClient.UploadFile(uriString, fileName); // Декодируем и выводим ответ textBox1.Text = 'Response Received. '; + System.Text.Encoding.ASCII.GetString(responseArray);
Получив код страницы в предыдущем примере и найдя, допустим, все ссылки на изображения
(как это сделать опишу позже) — где можно про это найти?Спасибо.