среда, 19 марта 2014 г.

Web scraping с помощью XmlWebPart

Хочу поделиться небольшой находкой, обнаруженной мной буквально на днях: как делать web scraping без серверного кода (и соответственно это вообще единственный известный мне способ делать web scraping в Office365).

На всякий случай, Web scraping - это способ интеграции с внешним ресурсом, при котором нужная информация выпарзивается прямо из HTML-кода некой внешней страницы в интернете. Обычно такое требуется, когда внешний сайт не предоставляет нормального API и нет никакой возможности его сделать (на самом деле, по моему опыту, такие ситуации возникают постоянно).

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



XmlWebPart в UI носит имя "XML Viewer Web Part", и позволяет обработать XML с внешнего сайта с помощью XSL-преобразования, и отобразить результаты в SharePoint. Однако, как наверняка вам известно, хотя HTML это вроде бы XML, но если попробовать натравить XML Viewer WebPart на html-страницу, то скорее всего вы получите ошибку "Failed to apply XSLT to the content". Чаще всего эта ошибка возникает из-за наличия в коде страницы токенов " ", которые не являются корректными для XML, и потому XSL-процессор не может справиться с такими входящими данными и вылетает с ошибкой.

Недавно я с удивлением обнаружил, что все-таки есть возможность это обойти. Фокус заключается в том, что если оставить свойства XslLink и Xsl пустыми, то XML Viewer WebPart возьмет весь исходный xml/html с внешнего сайта и вставит его в неизменном виде прямо в код текущей страницы. При этом никакой обработки этого html не производится, и поэтому даже если в нем есть токены " " (и любые другие, которые не корректны для XML), все равно они будут успешно перенесены на наш сайт.

Т.е. фактически, в коде нашей страницы вдруг появится примерно такой код:

<div WebPartID="GUID-OF-YOUR-WEBPART" HasPers="false" id="WebPartWPQ12" width="100%" class="ms-WPBody ms-WPBorder noindex ms-wpContentDivSpace " style="" >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>External site title</title>
</head>
<body>
<!-- external site content goes here -->
</body>
</html>
</div>

Ну а после того как html внешней страницы попал в DOM текущей страницы, его легко можно распарзить с помощью javascript, удалить ненужные элементы или же выдрать только нужную нам информацию и затем отобразить ее отдельно.

Замечание: Надеюсь всем понятно, чем этот способ опасен: в случае, если интегрируемая внешняя страница окажется в руках злоумышленников, они могут натворить много бед, т.к. смогут выполнять любой js код в контексте страницы SharePoint. Поэтому предупреждайте клиентов и убеждайтесь, что внешняя страница является полностью безопасной и защищенной в этом плане.

2 комментария:

  1. Спасибо за статью!

    Но я попробовал, мне пишет:
    The output from this Web Part may contain an HTML FORM tag, which is not supported in this Web Part. Edit the XML or XSLT source code to remove the HTML FORM tag.

    А найти хоть один сайт без тега FORM 1 января 2017 года я не смог ). Так что пользы ноль, да и зачем оно нам надо когда уже есть ECMA 6, браузеры стремятся к взаимопониманию, etc...

    ОтветитьУдалить
    Ответы
    1. Если не нужно, никто ж не заставляет пользоваться :)
      Я использовал этот способ для того чтобы отображать в шарепойнте вакансии с внешнего сайта. Мне нужно было применить собственные стили к той странице, поэтому web scraping был необходим. Прекрасно работало, тега form на внешней странице не было, так что до твоего сообщения я не знал даже о таком ограничении :)

      С Новым Годом, и желаю не работать 1го января! :)

      Удалить

Внимание! Реклама и прочий спам будут беспощадно удаляться.