Получение HTML через прокси перед разбором с помощью Html Agility Pack
Соедините HttpClient, настроенный через прокси, с Html Agility Pack, отделяя сетевые ошибки от разбора HTML.
using var handler = new HttpClientHandler
{
UseProxy = true,
Proxy = new WebProxy("http://proxy.example:8080")
};
using var client = new HttpClient(handler);
string html = await client.GetStringAsync(
"https://www.example.com/catalog");
var document = new HtmlAgilityPack.HtmlDocument();
document.LoadHtml(html);Этот современный фрагмент .NET использует System.Net и System.Net.Http. Настроенный клиент отвечает за сетевую маршрутизацию, а Html Agility Pack получает возвращённую строку HTML. Сохраняйте правильно настроенный клиент для текущей работы, вместо того чтобы пересоздавать его пулы для каждой страницы.
Для этого примера публичной страницы неаутентифицированный кандидат из списка HTTP-прокси может заменить посредника. Замените назначение отдельно. URL сайта сохраняет свою идентичность TLS. Аутентифицированные учётные данные прокси относятся к WebProxy; ни учётные данные сайта, ни отключённая проверка их не заменяют.
GetStringAsync рассматривает неуспешные HTTP-статусы как ошибки. Не превращайте неудачную загрузку в пустой HtmlDocument. Если приложению нужны заголовки, сведения о статусе или тело ошибки, используйте HTTP-операцию, ориентированную на ответ, и проверяйте её перед разбором.
Строковый метод избегает безусловного дополнительного преобразования необработанных байтов в UTF-8. Если вы намеренно получаете байты, перенесите требования к кодировке ответа и документа в декодирование.
LoadHtml создаёт разобранный документ; он не выполняет скрипты, не загружает стили и не переходит по ссылкам. Разрешайте последующие относительные ссылки относительно местоположения ответа и помните, что элементы, отрисованные браузером, могут отсутствовать в загруженном исходном коде. Каждый ответ должен создавать собственный документ, даже если запросы используют один и тот же настроенный HTTP-клиент.