Неправильно отрабатывает компонент TIdHTTP в Delphi

При парсинге HTML на Delphi заметил такой косяк, метод GET возвращает не весь HTML: когда искал нужные ноды не смог их найти в дереве DOM, начал исследовать и обнаружил пропажу. Если зайти на сайт и сохранить страницу ручками - разница размера с результатом TIdHTTP - более чем в 2 раза.
Мой код:

function GetWebPage(const url: string): string;
const
  agent = 'Mozilla/5.0 (iPad; CPU OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Mobile/15E148 Safari/604.1';
var
  SSL: TIdSSLIOHandlerSocketOpenSSL;
  HTTP: TIdHTTP;
begin
  HTTP := TIdHTTP.Create;
  SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  try
    SSL.SSLOptions.Method := sslvTLSv1_2;
    SSL.SSLOptions.SSLVersions := [sslvTLSv1_2];
    HTTP.IOHandler := SSL;
    HTTP.HandleRedirects := True;
    HTTP.Request.Accept := 'text/html';
    HTTP.Request.ContentType := 'text/html';
    HTTP.Request.UserAgent := agent;
    Result := HTTP.Get(url).Trim;
  finally
    HTTP.Free;
    SSL.Free;
  end;
end;

Ответ из HTTP.Response:

ResponseCode: 200 ResponseText: HTTP/1.1 200 OK
Server: cloudflare
CacheControl: no-cache, no-store, must-revalidate
CharSet: utf-8
Connection: keep-alive
ContentType: text/html
TransferEncoding: chunked
GetNamePath: TIdHTTPResponse

Подскажите, может я где допустил ошибку, или подскажите через какой компонент (под Delphi) лучше делать GET запросы.


Ответы (1 шт):

Автор решения: Vlad Chapl
  1. Вполне вероятно ты спотыкаешься о защиту Cloudflare. В интенрете ищем "web scraping cloudflare".
  2. Возможно DOM модель достраивается динамически при помощи JavaScript. Попробуй в браузере сохранить страницу. (Вроде это не твой случай.)

P.S. https://habr.com/ru/articles/716434/ "Chrome Headless против cloudflare JS challenge"

→ Ссылка