Логика реализации динамического веб-скребка на C#
-
22-09-2019 - |
Вопрос
Я хочу разработать веб-скребок в C # window forms.То, чего я пытаюсь добиться, заключается в следующем:
- Получите URL-адрес от пользователя.
- Загрузите веб-страницу в элементе управления пользовательским интерфейсом IE (встроенный браузер) в WinForms.
- Разрешить пользователю выделять текст (непрерывный, небольшого размера (не более 50 символов)).с загруженной веб-страницы.
- Когда пользователь желает сохранить местоположение (расположение HTML DOM) он должен быть сохранен в базе данных, чтобы пользователь мог использовать это местоположение для извлечения данных из этого местоположения во время своих последующих посещений.
Предположим, что загруженный веб-сайт является сайтом с прейскурантом и указанная стоимость продолжает меняться, идея состоит в том, чтобы сохранить иерархию DOM, чтобы я мог просмотреть ее в следующий раз.
Я был бы в состоянии сделать это, если бы все HTML-элементы имели свои атрибуты id.В случае , когда идентификатор равен нулю , я не в состоянии выполнить это .
Может ли кто-нибудь предложить правильную идею по этому поводу (минимальный фрагмент кода, если возможно).?
Это было бы полезно, даже если бы вы могли поделиться некоторыми онлайн-ресурсами.
Спасибо,
виджай
Решение
Один из подходов — создать стек тегов/стилей/идентификаторов до элемента, который вы хотите выбрать.
От нужного элемента перейдите к ближайшему элементу id.Таким образом вы избавитесь от большей части верхнего заголовка и т. д.Затем постройте последовательность для поиска.
Пример:
<html>
<body>
<!-- lots of html -->
<div id="main">
<div>
<span>
<div class="pricearea">
<table> <!-- with price data -->
Например, вы должны сохранить в своей базе данных последовательность: [id=main],div,span,div,table или возможно div[класс=ценовая область],таблица.
Использование стилей/классов также может использоваться для создания вашего пути.Вы можете выбирать: искать тег, атрибут тега или их комбинацию.Вам нужно, чтобы он был максимально точным и содержал как можно меньше элементов, чтобы сделать его надежным.
Если макет редко меняется, это позволит вам каждый раз переходить к одному и тому же месту.
Я бы также посоветовал вам использовать Пакет гибкости HTML или что-то подобное для анализа DOM, поскольку управление IE работает медленно.
Скрапинг экрана — это весело, но добиться 100%-ной точности для всех страниц сложно.Удачи!
Другие советы
Немного погуглив , я наткнулся на довольно простое решение .Ниже прилагается примерный фрагмент текста.
if (webBrowser.Document != null)
{
IHTMLDocument2 HtmlDoc = (IHTMLDocument2)webBrowser.Document.DomDocument;// loads the HTML DOM
IHTMLSelectionObject selection = HtmlDoc.selection;// Fetches the currently selected HTML Element.
IHTMLTxtRange range = (IHTMLTxtRange)selection.createRange();
IHTMLElement parentElement = range.parentElement();// Identifies the parent element
targetSourceIndex = parentElement.sourceIndex;
//dataLocation = range.parentElement().id;
MessageBox.Show(range.text);//range.parentElement().sourceIndex
}
Я использовал Встроенный веб-браузер в приложении Winforms, которое загружает HTML DOM текущей веб-страницы.
Тот Самый IHTMLЭлемент экземпляр предоставляет свойство с именем 'SourceIndex', которое присваивает уникальный идентификатор каждому из html-элементов.
Можно сохранить этот SourceIndex в базе данных и запросить содержимое в этом месте.используя следующий код.
if (webBrowser.Document != null)
{
IHTMLDocument2 HtmlDoc = (IHTMLDocument2)webBrowser.Document.DomDocument;
IHTMLElement targetElement = null;
foreach (IHTMLElement domElement in HtmlDoc.all)
{
if (domElement.sourceIndex == int.Parse(node.InnerText))// fetching the persisted data from the XML file.
{
targetElement = domElement;
break;
}
}
MessageBox.Show(targetElement.innerText); //range.parentElement().sourceIndex
}