Скрапинг сайтов с помощью IHTMLDocument2: решение проблемы уведомлений cookie
При работе с веб-сайтами, особенно при их скрапинге, важно учитывать множество технических и юридических аспектов. Одним из таких аспектов является обработка cookies, которые используются для хранения информации о посетителях на стороне клиента. В Европе введены строгие правила, регулирующие использование cookies, и многие сайты теперь требуют от пользователя явного разрешения на их использование.
Проблема уведомлений cookie
При скрапинге сайтов с использованием компонента IHTMLDocument2 в среде разработки Delphi, пользователи могут столкнуться с проблемой, когда сайт отображает уведомление о том, что он хочет установить cookie на компьютер пользователя. Это стандартное уведомление, предусмотренное законом о защите данных в Европейском Союзе.
Оригинальное решение проблемы
Для решения проблемы уведомлений cookie при использовании IHTMLDocument2 необходимо реализовать интерфейс IOleClientSite и установить свойство DISPID_AMBIENT_DLCONTROL, которое позволяет управлять процессом загрузки ресурсов сайта, включая сценарии и cookies. В частности, необходимо установить флаг DLCTL_SILENT, который скрывает пользовательский интерфейс и уведомления пользователя.
Альтернативные решения
В качестве альтернативы можно удалить все элементы <script> из HTML-кода перед его загрузкой в IHTMLDocument2, что также позволит избежать уведомлений cookie. Однако это может привести к некорректной работе сайтов, которые полагаются на сценарии.
Подтвержденное решение
Для того чтобы отключить пользовательский интерфейс или уведомления пользователя при работе с IHTMLDocument2, необходимо реализовать интерфейс IOleClientSite и установить свойство DISPID_AMBIENT_DLCONTROL с флагом DLCTL_SILENT. Это можно сделать, изучив источники проекта EmbeddedWB, особенно файлы IEParser.pas и UI_Less.pas, которые уже реализуют необходимые интерфейсы и поведение.
Пример кода
В качестве примера, ниже приведен упрощенный код, демонстрирующий, как можно установить необходимое свойство:
uses ..., ActiveX, MSHTML;
const
DISPID_AMBIENT_DLCONTROL = (-5512);
type
TUILess = class(TComponent, IUnknown, IDispatch, IOleClientSite)
// Описание классов и методов
end;
implementation
// Реализация методов класса TUILess
// ...
procedure TForm1.Button1Click(Sender: TObject);
const
cHTML: WideString = '<b>test</b><script>alert("boo")</script>';
var
Doc: IHTMLDocument2;
DocClientSite: TUILess;
begin
DocClientSite := TUILess.Create(nil);
try
Doc := coHTMLDocument.Create as IHTMLDocument2;
try
(Doc as IOleObject).SetClientSite(DocClientSite);
(Doc as IOleControl).OnAmbientPropertyChange(DISPID_AMBIENT_DLCONTROL); // Вызов Invoke
OleVariant(Doc).write(cHTML);
Doc.close;
ShowMessage(Doc.body.innerHtml); // Тест
finally
(Doc as IOleObject).SetClientSite(nil);
Doc := nil;
end;
finally
DocClientSite.Free;
end;
end;
Заключение
При скрапинге сайтов с помощью IHTMLDocument2 важно учитывать вопросы безопасности и соответствия законодательству, а также уметь работать с cookies и другими аспектами веб-технологий. В данной статье представлено решение проблемы уведомлений cookie, которое позволяет скрапить сайты, не отвлекаясь на ненужные пользователю уведомления.
При скрапинге сайтов с использованием `IHTMLDocument2` в среде Delphi для решения проблемы уведомлений cookie о необходимости разрешить установку cookies нужно реализовать интерфейс `IOleClientSite` и установить свойство `DISPID_AMBIENT_DLCONTROL` с флаг
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.