Продовжуємо переклад статті про парсінгу або граббінг сайтів використовуючи c #.
Клас WebClient знаходиться в просторі імен SyStem.Net, він реалізує можливість отримання з даних інтернету. З його допомогою можна отримати вихідний код сторінки HTML у вигляді рядка або у вигляді файлу.
Приклад: Отримуємо вихідний код сторінки google.com
- Додаємо на форму кнопку і RichTextBox
- Клацаємо по кнопці два рази мишкою. Тим самим додаючи подія натискання на кнопку
- Додаємо в цю подію наступний код:
Використовуємо метод DownLoadString який повертає дані у вигляді рядка і додаємо цей рядок в richtextbox. Результат роботи виглядає наступним чином:
Далі можна застосовувати регулярні виразів (RegEx) до отриманої рядку, отримуючи необхідну інформацію (наприклад таким чином можна швидко отримати, тобто провести граббінг картинок, email, посилань і т.д.
Приклад: Грабба картинки
Отримавши код сторінки в попередньому прикладі і знайшовши, припустимо, всі посилання на зображення (як це зробити опишу пізніше) ми можемо зберегти всі картинки собі на комп'ютер в такий спосіб:
Приклад: Блокуючий режим WebClient
- Додайте наступний код в подія натискання кнопки:
- Після того як Ви запустите проект і натиснете на кнопку, спробуйте по переміщати форму або натиснути на ще якісь елементи форми. Вона не буде відповідати на Ваші дії. Форма заблокована виконанням операції зчитування даних з зазначеного Вами сайту
- Чому ж так відбувається? Вся справа в тому, що завантаження рядки, файлу або інших даних з Інтернету може займає тривалий час (залежить від швидкості з'єднання, завантаженості сервера і т.д.), а клас WebClient, в нашому прикладі, працює в потоці, який відповідальний за отрисовку призначеного для користувача інтерфейсу (UI). Це і призводить до підвисання форми.
- Це означає, що потік не продовжить обробку інших, наступних команд нашої програми, поки не отримає всі запитувані дані з інтернету. Це називається блокуючий режим. Вихід - це використовувати не блокуючий режим (асинхронний
Приклад: Неблокуючий режим WebClient
- Використовуємо процедуру DownloadStringAsync () - яка запустить скачування даних з Інтернету (в цьому випадку як рядок) в окремому потоці. Це означає, що наш додаток буде виконуватися далі, поки дані викачуються паралельно
- Наведений вище код завантажить дані у вигляді рядка, що не блокуючи додаток. Але ми не дізнаємося, коли дані будуть повністю завантажені. Для це необхідно визначити подія завершення завантаження, що б додаток могло нам повідомити про закінчення операції. В даному випадку ми повинні додати обробку події DownloadStringCompleted.
- Наступний код почне вивантаження даних з Інтернету у вигляді рядка в неблокірующіх режимі і по закінченню завантаження викличе подія DownloadStringCompleted, тим самим повідомить.
- Завантажена рядок передається в якості аргументу події DownloadStringAsync, і ми її можемо далі обробити такий спосіб
Приклад: Завантаження файлів на хостинг
Парсинг сайтів на c #. Частина 2. Використання WebClient