- Використання Selenium на C #
- Підключення Selenium до проекту
- Автоматизація дій за допомогою Selenium
- Пошук елементів по XPath
- Дії з елементами сторінки
- Плюси і мінуси парсинга за допомогою Selenium
- Парсинг HTML за допомогою HtmlAgilityPack
Наша взаимовыгодная связь https://banwar.org/
Використання Selenium на C #
Самий розповсюджений спосіб автоматизувати будь-які дії з вебсайтом - використання бібліотеки Selenium. Ця бібліотека дозволяє запустити браузер і управляти всіма діями в ньому. Підтримуються всі розповсюджені браузери.
Підключення Selenium до проекту
У контекстному меню проекту вибираємо пункт «Manage NuGet Packages ...»
Далі на вкладці «Browse» знаходимо і встановлюємо пакети Selenium.WebDriver і Selenium.WebDriver.ChromeDriver. Перший пакет - сама бібліотека, другий додає в папку з зібраними проектом драйвер до хрому ChromeDriver.exe.
Автоматизація дій за допомогою Selenium
В якості тестової задачі спробуємо на цьому блозі відкрити першу сторінку з результатами пошуку за запитом «C #» і на консоль вивести заголовки і адреси знайдених статей.
Почнемо з того, що відкриємо браузер і перейдемо на головну сторінку сайту.
using OpenQA.Selenium; using OpenQA.Selenium.Chrome; ... IWebDriver driver = new ChromeDriver (); driver.Url = @ "http://lsreg.ru";
Тепер потрібно знайти інпут для введення критерію пошуку і ввести в нього текст. Пошук елементів на сторінці здійснюється за допомогою методів IWebDriver.FindElement і IWebDriver.FindElements. Ці методи вміють шукати по безлічі критеріїв: тег, css клас, xpath і інші.
Пошук елементів по XPath
XPath - це мова запитів до дерева елементів. Ось як виглядає запит діва з id = "my_div»:
.//div[@id='my_div ']
Тут точка спочатку запиту означає, що пошук здійснюється з кореня документа. Без точки пошук осущствляем б тільки в контексті поточного елемента. Подвійний слеш означає будь-яку кількість елементів. Одинарний слеш означав би, що див лежить прямо в корені документа. Пара прикладів для наглядку:
.//div[@id='my_div']//a - всі посилання всередині діва .//div[@id='my_div']/a - посилання на першому рівні вкладеності
Крім id фільтрувати можна і по інших атрибутів.
Дії з елементами сторінки
Метод FindElement повертає екземпляр IWebElement. Для введення тексту використовується метод SendKeys, для кліка є метод Click.
Знаходимо інпут і вводимо в нього рядок пошуку
driver.FindElement (By.XPath (@ ".// div [@ id = 'search-3'] / form / input [@ id = 's']")). SendKeys ( "c #");
Кількома на кнопку пошуку
driver.FindElement (By.XPath (@ ".// input [@ id = 'searchsubmit']")). Click (); Thread.Sleep (3000);
Sleep потрібен для того, щоб результати пошуку встигли відобразитися.
Тепер знаходимо все посилання всередині заголовків і відображаємо їх текст і href
var links = driver.FindElements (By.XPath ( ".// h2 / a")); foreach (IWebElement link in links) Console.WriteLine ( "{0} - {1}", link.Text, link.GetAttribute ( "href"));
Отримуємо ось такий результат
Плюси і мінуси парсинга за допомогою Selenium
плюси:
- Сервер не відрізнить програму від реального користувача
- Можна працювати в контентом, довантажувати динамічно
мінуси
- Використання реального браузера уповільнює роботу і збільшує споживання ресурсів
- Чи не підтримується .Net Core
Парсинг HTML за допомогою HtmlAgilityPack
Якщо на сайті немає захисту від ботів і весь необхідний контент віддається відразу, то можна обійтися більш легковажним рішенням - використовувати бібліотеку HtmlAgilityPack. Підключається вона так само через NuGet. Ця бібліотека будує DOM дерево по HTML. Проблема в тому, що загрожують код сторінки доведеться самим. Для завантаження сторінки я використовую ось таку функцію
static string LoadPage (string url) {var result = ""; var request = (HttpWebRequest) WebRequest.Create (url); var response = (HttpWebResponse) request.GetResponse (); if (response.StatusCode == HttpStatusCode.OK) {var receiveStream = response.GetResponseStream (); if (receiveStream! = null) {StreamReader readStream; if (response.CharacterSet == null) readStream = new StreamReader (receiveStream); else readStream = new StreamReader (receiveStream, Encoding.GetEncoding (response.CharacterSet)); result = readStream.ReadToEnd (); readStream.Close (); } Response.Close (); } Return result; }
Завантажуємо код сторінки
using HtmlAgilityPack; .. var pageContent = LoadPage (@ "http://lsreg.ru/?s=c%23"); var document = new HtmlDocument (); document.LoadHtml (pageContent);
Тут відразу вказуємо урл сторінки з результатами пошуку. Далі аналогічно по XPath знаходимо потрібні посилання і виводимо результат.
HtmlNodeCollection links = document.DocumentNode.SelectNodes ( ".// h2 / a"); foreach (HtmlNode link in links) Console.WriteLine ( "{0} - {1}", link.InnerText, link.GetAttributeValue ( "href", ""));
Другий параметр в методі GetAttributeValue - це значення за замовчуванням.
Ru/?