Страницы

Поиск по вопросам

понедельник, 25 ноября 2019 г.

Как можно взаимодействовать с сайтом через консольное приложение?


Допустим, имеется сайт на котором есть какое-то поле.

В это поле нужно послать какое-то значение, нажать на кнопку, затем получить новую страницу, где перейти по первой ссылке.

За этими мне нужно обращаться к классу WebBrowser?

Если можно, то покажите пример(например, можно взять целевой сайт google, но бе
использования его API.)
    


Ответы

Ответ 1



Гуглим в консоле Покажу на примере программы, которая позволяет гуглить прям в консоле (извлекае первые заглавные ссылки поиска на google.com): Предварительные работы Используйте CefSharp — библиотеку-оболочку, основанную на Chromium. Очень подробно её описал в этом ответе. Устанавливается просто через Nuget пакет. Install-Package CefSharp.OffScreen -Version 57.0.0 Скопировав из приведенного мною ответа два класса (CefSharpWrapper и ConvertHelper) у вас уже готов скелет программы, с помощью которой вы можете исполнять любой JavaScript прямо из консольного приложения. Также установите x64 или x86 в качестве платформы. Платформа Any CPU поддерживается, но требует дополнительного кода. Дополнительные свойства и методы Также для данной задачи добавьте в CefSharpWrapper свойство Address: public string Address => _browser.Address; и метод WaitTillAddressChanges: public void WaitTillAddressChanges() { // wait till address changes AutoResetEvent waitHandle = new AutoResetEvent(false); EventHandler onAddressChanged = null; onAddressChanged = (sender, e) => { _browser.AddressChanged -= onAddressChanged; waitHandle.Set(); }; _browser.AddressChanged += onAddressChanged; waitHandle.WaitOne(); } Пример самой программы Вот пример самой программы (класс Program, метод Main): public class Program { private static void Main() { MainAsync().Wait(); } private static async Task MainAsync() { CefSharpWrapper wrapper = new CefSharpWrapper(); wrapper.InitializeBrowser(); Console.Write("Введите поисковой запрос: "); string searchText = Console.ReadLine(); string[] urls = await wrapper.GetResultAfterPageLoad("https://google.com", async () => { await wrapper.EvaluateJavascript( // заполняем тесковое поле $@"document.getElementById('lst-ib').value = '{searchText}'; // выполняем submit поисковой формы document.getElementById('tsf').submit()"); // Ждём когда перейдёт на результаты поиска wrapper.WaitTillAddressChanges(); // Когда страница результатов поиска полностью подгрузится, излекае результаты return await wrapper.GetResultAfterPageLoad(wrapper.Address, async () => await wrapper.EvaluateJavascript( // получаем результаты "Array.prototype.map.call(document.querySelectorAll('h3.r > a'), (a) => a.href);")); }); Console.WriteLine("Первые ссылки поиска:"); foreach (string url in urls) { Console.WriteLine(url); } wrapper.ShutdownBrowser(); } } Результаты программы К примеру, если я введу "parse html C#": AJAX Также довольно удобно работать с AJAX c помощью с этой библиотеки.

Ответ 2



Если Вам надо закодить лишь какие-то определенные, известные части какого-то сайт - можно просто вытянуть нужные запросы, которые посылаются браузером (вычленить их можно в консоли разработчика браузера, обычно на вкладке Network) и посылать этот запрос в программе, например через HttpClient. Если же изначально самих запросов Вы знать не можете (получать надо динамически в самой программе), то может 2 варианта событий: Если сайт может работать без использования ajax - парсить страничку на наличие тэг
и отталкиваться от него. В нем есть атрибут action в котором содержится пут и атрибут encoded, который указывает формат кодировки (если нет - по умолчанию "application/x-www-form-urlencoded", вроде бы, хотя точно лучше посмотреть через консоль разработчика). Все это собираете, в том числе и параметры внутри тэга , отправляете через HttpClient и получаете ответ Если сайт работает только через ajax - тут уже сложнее и другого выхода кроме как вручную смотреть через Network какие запросы формируются и жетско их кодить я не вижу Но в большинстве случаев хватает и обычной отправки заранее подготовленных (вычлененных) запросов со своими параметрами. Так же можно привязать к HttpClient'у HttpClientHandler для хранения кукисов и других плюшек. Например Вам надо добавить пост на стену в вк определенное время - алгоритм будет такой: Создать HttpClient с привязанным к нему HttpClientHandler'ом Отправить через него POST запрос на нужный адрес (посмотреть можно на странице в в исходниках или вычленяем через консоль разработчика) со своими логином и паролем в качестве значений. Этот запрос вернет ответ, но в данном случае он не нужен, просто ждем пока придет HttpResponseMessage, чтоб нам пришли куки Отправить еще один POST запрос, который добавит сообщение на стену

Ответ 3



Нашел интересную либу Selenium с помощью которой, через драйвера можно взаимодействовать с реальным браузером. Довольная простая в управлении: using OpenQA.Selenium; using OpenQA.Selenium.Firefox; // Requires reference to WebDriver.Support.dll using OpenQA.Selenium.Support.UI; class GoogleSuggest { static void Main(string[] args) { // Create a new instance of the Firefox driver. // Note that it is wrapped in a using clause so that the browser is closed // and the webdriver is disposed (even in the face of exceptions). // Also note that the remainder of the code relies on the interface, // not the implementation. // Further note that other drivers (InternetExplorerDriver, // ChromeDriver, etc.) will require further configuration // before this example will work. See the wiki pages for the // individual drivers at http://code.google.com/p/selenium/wiki // for further information. using (IWebDriver driver = new FirefoxDriver()) { //Notice navigation is slightly different than the Java version //This is because 'get' is a keyword in C# driver.Navigate().GoToUrl("http://www.google.com/"); // Find the text input element by its name IWebElement query = driver.FindElement(By.Name("q")); // Enter something to search for query.SendKeys("Cheese"); // Now submit the form. WebDriver will find the form for us from the element query.Submit(); // Google's search is rendered dynamically with JavaScript. // Wait for the page to load, timeout after 10 seconds var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10)); wait.Until(d => d.Title.StartsWith("cheese", StringComparison.OrdinalIgnoreCase)); // Should see: "Cheese - Google Search" (for an English locale) Console.WriteLine("Page title is: " + driver.Title); } } } Однако, все равно хотелось узнать, как можно сделать это стандартными средствами .NET.

Ответ 4



Уточните каким образом происходит обработка введенного текста в поле на сайте? Сайт отправляет его GET/POST или обрабатывает иначе? Приведу ход своих мыслей на примере googl'a и GET.. Зачем нам эмулировать действия пользователя на сайте если мы напрямую можем работать с отправлением запроса, получением результата и дальнейшим парсингом string query_user = Console.ReadLine(); string url = "https://www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#newwindow=1&q=" + query_user; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); И дальше извлекаем из переменной response все что необходимо

Ответ 5



Все зависит от твоих потребностей и от сайта: Используется ли на сайте AJAX Есть ли там сложно-обходимые капчи вроде Re-Capcha На сколько сложная последовательность действий нужна На сколько важно быстродействие На сколько будет загруженной страница(это может быть просто страница, а может быть бесконечная прокрутка) Нужна ли кросплатформенность решения Используются ли какие-то хитрые технологии на сайтах вроде CORS В принципе если обобщить всю информацию поданную НИЖЕ и привести к максимально универсальному ответу: а. если нужно самое быстрое "одноразовое" решение и скорость работы не важна -- значит Selenium б. Если это задача по тестированию - Selenium в. Если нужна универсальность решения и максимально простая поддержка на долгих периодах времени и не важно сколько займет кодинг: CefSharp для прохождения капчи/рекапчи вытянуть из CefSharp куки, всунуть их в дотнетовские куки а дальше взаимодействовать с сайтом через HttpWebRequest запросы Детальнее же про каждый из способов.... WebBrowser Минуса Очень бедное управление. Сложный в работе. графический элемент, а значит будет жрать оперативу и работать медленно не работает с бесконечными страницами гипер кривая работа с JS. Некоторые сайты просто не отображаются. Устаревший инструмент. Плюса +? в теории -кросплатформенный, но не уверен. Прямая работа через HttpWebRequest Post/Get запросы с последующим парсингом. Нужну последовательность можно узнать в консоли разработчика браузера, на вкладке Network. Желательно использовать НЕ низкоуровневые запросы а какие-то библиотеки для REST запросов. Будет быстрее значительно код писатся. Минуса если на сайте AJAX - работать так может быть сложно. никак не пройти Re-Capcha. Может быть затруднительным прохождение капч в принципе. Плюса если сайт часто изменяется, реже будет ламатся код (фрондтенд менее стабилен че бекенд, так что идеальное решение для взаимодействия с бекендом!) Самое высокое быстродействие. Вы можете хоть тысячи страниц в паралели проганять. Может работать с "бесконечными" страницами любого размера. [Хотя для этого нужн будет попотеть немного] прекрасная кросплатформенность кода Selenium - в общем и целом он предназначен именно для автоматизированного тестировани веб-сайтов. В том числе и с аджакс-технологией. То есть он может делать практическ все действия, которые могут делать в браузере люди: находиль элементы интерфейса сайта, посылать в них нажатия кнопок, скролить, делать скриншоты, проверять на видимость/доступность и т.д. Т.к. указан C# тег, а так же было сказано про отсутствие лишних окон, нужно использоват связку: Selenium Web-Driver и PhantomJS. Фантом - это безюайный браузер на движке как у хрома. Он может все то же самое что и простой браузер, только не показывается визуально и не тратит ресурсы на отрисовку. Отдельно хочу сказать что сам по себе селениум довольно неудобен и далек от ООП Проблема в том, что выбора-то особенно и нету... Минуса Он не ООПшный и довольно кривой в использовании очень хреново работает с большими страницами очень медленный нужно использовать сторонние браузеры и в проэкт качать доп.библиотеки для поддержки нужного браузера Не умеет работать с внешними окнами. Например с системным окном аутентификации н сервер (с версии 3.4 умеет). Или с окнами Open/Save file (для этого есть костыли а так же я написал полууниверсальное решение: https://github.com/ukushu/DialogCapabilities ) Плюса На нем вполне можно проходить ReCapcha. При помощи юзера, правда :) Можно пройти и без юзера, если ипользовать аудиокапчу + распознавание текста с ауди через googleAPI. Например, вот здесь есть реализация прохождения рекапчи ботом, но на питоне: https://github.com/eastee/rebreakcaptcha/blob/master/rebreakcaptcha.py Вполне может работать с AJAX. А если допилять костыли, то, даже, вполне неплохо работать. Работает с посделовательностями действий любой сложности. В том числе всякие драг енд дропы. Может запускатся на многих компьютерах в паралели Не уверен ? понятия не имею по поводу кросплатформенности Оболочки вокруг готового движка вроде Хромиума. За пример - CefSharp. Минуса хреново работает с большими/бесконечными страницами относительно медленный нужно качать несколько библиотек многий функционал доступный с коробки в селениуме нужно будет реализовывать самому через JS код. Плюса На нем вполне можно проходить ReCapcha. При помощи юзера, правда :) работает с AJAX Работает с посделовательностями действий любой сложности Умеет работать с внешними окнами. Например с системным окном аутентификации на сервер. Не уверен: ? понятия не имею по поводу кросплатформенности. Скорее всего есть

Ответ 6



В заголовке вопроса - консольное приложение. Но, могу предположить по тексту В это поле нужно послать какое-то значение, нажать на кнопку, затем получить новую страницу, где перейти по первой ссылке. возможно вам подойдёт эмуляция действий пользователя в браузере. Про эмуляцию в браузере: Очень точная эмуляция действий пользователя делается с помощью написания собственног расширения для браузера (Firefox/GoogleChrome например) - от настоящего пользователя не отличить. Плагин может полностью перехватывать управление - например открыть вкладку с определённым сайтом, и "захватить" её. Внутри плагина разрабатывается некая сущность, которая может эмулировать движени и клики мышки от объекта к объекту: сами объекты с чужого сайта выбираются, например, простым jQuery - так-же как и в коде любого сайта. Также сущности нужно добавить возможность эмулировать ввод текста в любое поле. Эмуляция может происходить посылкой trusted DOM событий (это код внути плагинов умеет) или можно напрямую использовать WinApi и его PostMessageW (по крайней мере аддоны фаерфокса умеют подключать любую dll и юзать её затем из JS) - железобетонный способ. В общем технически такой эмулятор от пользователя не отличить. Под подобную деятельность заточен известный аддон Greasemonkey . Но если масштаб эмуляции планируются большими (политика добавления определённых скриптов к определённым страницам недостаточна) - не рекомендовал бы, ибо его логики не хватит. Если нужно к эмуляции добавить ещё и управление браузером из консоли, используйт selenium. Это не прокатит, если вы хотите чтобы это всё работало со стандартного сервер - то есть без GUI. Но по своей практике скажу - использовали эмуляторы часто, для них у нас были отдельные сервера с виндой, с GUI. Без GUI, с голой консолью, есть мнение что качественно эмулировать не выйдет.. Классическое использование таких эмуляторов - боты-парсеры, боты-спамеры, боты-игровые, авто-тестирование собственного сайта.

Ответ 7



На мой взгляд, лучшее решение - это WatiN. WatiN Features Automate all major HTML elements with ease Find elements by multiple attributes Native support for Page and Control model Supports AJAX website testing Supports creating screenshots of webpages Supports frames (cross domain) and iframes Handles popup dialogs like alert, confirm, login etc.. Supports HTML dialogs (modal and modeless) Easy to integrate with your favorit (unit) test tool Works with Internet Explorer 6, 7, 8, 9 and FireFox 2 and 3 Can be used with any .Net Language Licensed under the Apache License 2.0 Downloaded more than 120.000 times And since its open source you can add and contribute new features yourself Пример: [Test] public void SearchForWatiNOnGoogle() { using (var browser = new IE("http://www.google.com")) { browser.TextField(Find.ByName("q")).TypeText("WatiN"); browser.Button(Find.ByName("btnG")).Click(); Assert.IsTrue(browser.ContainsText("WatiN")); } } Сам пользуюсь для граббинга.

Комментариев нет:

Отправить комментарий