Знакомимся с Data Extracting SDK. Часть 1
Data Extracting SDK – независимая разработка, которая позволяет создавать приложения для извлечения, анализа и сохранения данных. Также может быть использована для написания собственных поисковых роботов и инстументов для работы с большими объемами данными.
Data Extracting SDK использует библиотеку Microsoft.mshtml для получения DOM-дерева HTML страницы и информации об HTML элементах.
Страница на codeplex: http://extracting.codeplex.com/ (последняя версия, о которой идет речь в статье, скоро будет добавлена на сайт).
Класс UriHtmlExtractor
Класс UriHtmlExtractor может быть использован для скачивания веб-документов.
Основные возможности:
- поддержка POST, GET запросов;
- возможность менять User Agent;
- поддержка запросов через прокси;
- проверка веб-страниц на CSS, HTML валидность, на наличие robots.txt, favicon.ico;
- получение Google PageRank.
Конструктор на вход принимает лишь один обязательный параметр – адрес страницы, остальные параметры – коллекция параметров в случае POST запроса, настройки прокси и User Agent – являются необязательными параметрами и могут использоваться в случае необходимости.
UriHtmlExtractor ext = new UriHtmlExtractor(new Uri("http://google.com/"));
Рассмотрим типичные сценарии использования UrlHtmlExtractor на таком примере:
NameValueCollection postParameters = new NameValueCollection(); postParameters.Add("name", "value"); // Добавляем параметр 1 postParameters.Add("submit", "true"); // Добавляем параметр 2 // Прикидываемся IE9 beta string userAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)"; UriHtmlExtractor ext = new UriHtmlExtractor(new Uri("http://google.com/"), postParameters, new WebProxy("127.0.0.1", 80), userAgent); string html = ext.DocumentHtml; // Получаем HTML код страницы string text = ext.DocumentText; // Получаем очищенный от HTML тэгов текст страницы bool isCssValid = ext.IsCSSValid(); bool isHtmlValid = ext.IsHtmlMarkupValid(); bool contactUsPageExists = ext.IsPageExists("contact.php"); bool robotsExists = ext.IsRobotsTxtExists(); Uri contactUsUri = ext.FindPage("contact"); if (contactUsUri != null) { // Что-то делаем } Uri foundUri = ext.FindPage(new string[] { "contact", "feedback" }); if (foundUri != null) { // Что-то делаем } ext.SaveHtml("C://1.html"); // Сохраняем код в файл ext.SaveText("C://1.txt"); // Сохраняем текст в файл int PR = ext.GooglePageRank;
Класс UriHtmlExtractor удобен для получения HTML кода, в то время когда разбор HTML можно сделать с помощью класса HtmlProcessor, который рассмотрим далее.
Класс HtmlProcessor
HtmlProcessor является основным инструментом для разбора HTML кода.
Возможности:
- разбор HTML – ссылки, заголовки, мета теги, изображения;
- поиск элементов по тегам, идентификатору, имени
- Linq to DOM – возможность делать запросы к DOM модели страницы с помощью Linq.
Продемонстрируем возможности класса HtmlProcessor на таком примере:
string html = "<html><head><title>My page</title></head><body>" + "<div class=\"divClass\" id=\"divId\">Div text.</div></body></html>"; HtmlProcessor proc = new HtmlProcessor(html); var elements = proc.Elements; DomElement body = proc.Body; string source = proc.DocumentSource; // Вернет значение переменной html string title = proc.Title; // My page string innerText = proc.InnerText; // Div text. bool hasFlash = proc.HasFlash; // false string divClass = proc.GetElementById("divId").Class; // divClass string divClassByTag = proc.GetElementsByTagName("div").FirstOrDefault().Class; // divClass string metaDesc = proc.MetaDescription; // null string metaKeyword = proc.MetaKeywords; // null List<DomElement> headers = proc.Headers; List<DataTable> htmlTables = proc.HtmlTables; List<DomElement> images = proc.Images; List<DomElement> links = proc.Links; proc = new HtmlProcessor(new Uri("http://microsoft.com/")); // Делаем запрос к DOM модели var q = from e in proc.Elements where e.TagName == "img" && e.Attributes["class"].IsNotNullOrEmpty() == true select e.Attributes["class"];
Большинство методов возвращают список DomElement, который содержит такие поля:
- InnerHtml
- InnerText
- OuterHtml
- OuterText
- Id – идентификатор HTML элемента;
- Class – CSS класс HTML элемента;
- TagName – название тега (например, «а», «img» и т.д.)
- Attributes – NameValueCollection аттрибутов HTML элемента.
Примечание: все названия тегов и атрибутов необходиом вводить в нижнем регистре.
Свойство HtmlTable возвращает список DataTable, в которые были преобразованы все HTML таблицы.
C помощью методом GetElementById(), GetElementsByTagName(), GetElementByName() можно получать коллекцию HTML элементов соответственно по идентификатору, тегу или названию. Также можно воспользоваться свойстами Links, Headers, Images, Metas, Scripts, которые уже содержат элементы соответствующего типа.
Класс DataExtractor
Класс DataExtrcator является хорошим помощником при работе с регулярными выражениями.
С «коробки» он позволяет извлекать такие типы данных, как:
- Emails – электронные адреса;
- IP адреса;
- Phones – телефоны в американском формате;
- CapsWord – слова в верхнем регистре;
- Url – адреса веб-документов;
- DateTimeLong – даты в формате «N/N/N H:M:S AM/PM».
Если необходимого типа данных нет в наличии, то можно добавить свою группу с помощью метода AddRegex(), который принимает на вход собственно само выражение и название группы. Позже, можно получить данные из конкретной группы с помощью переопределенного метода GetExtractedResults().
Пример использования класса DataExtractor:
string text = @" email1 = test@domain.com email2 = contactus@mydomain.ru IP = 127.0.0.1 Phone = (978) 369-1118, ask ALEX or LEO Url = http://dddddd.com:3030/page.aspx?id=5&g=6 Url = https://microsoft.com/ or ftp://microsoft.com/ Date = 01/02/2008 5:20:50 PM "; DataExtractor ext = new DataExtractor(text, DataTypes.All); ext.AddRegex(Regexes.CapsWord, "AdditionalCapsWords"); var results = ext.GetExtractedResults(); var emails = ext.GetExtractedResults("Email"); foreach (var result in results) Console.WriteLine("{0}: {1}", result.GroupName, result.Value);
В результате выполнения этого кода получим следующий результат:
Также в SDK есть вспомагательный класс Regexes, который содержит коллекцию наиболее употребляемых регулярных выражений.
Компании из статьи
Microsoft Украина | Украинское подразделение компании Microsoft. |