Допустим, имеется сайт на котором есть какое-то поле.
В это поле нужно послать какое-то значение, нажать на кнопку, затем получить новую страницу, где перейти по первой ссылке.
За этими мне нужно обращаться к классу 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 - парсить страничку на наличие тэг
Комментариев нет:
Отправить комментарий