Класс или метод для получения html C#

125
31 октября 2019, 08:20

Давно интересует: а есть ли где-нибудь универсальный способ получения html-кода всей страницы? Ведь на некоторых сайта нужны куки, где-то еще и авторизация. В данный момент использую такой простенький вариант:

static string getResponse(string uri)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586";
    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
    using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.Default, true, 8192))
    {
        return reader.ReadToEnd();
    }
}

В большинстве случаев его хватает, но иногда приходится дополнять. Поэтому было бы неплохо заранее иметь готовый вариант, где все учтено

Answer 1

а есть ли где-нибудь универсальный способ получения html-кода всей страницы?

Существует слишком много технологий которые нужно учитывать. Есть сайты где есть AJAX подгрузка страницы. Вечная загрузка страницы (например новостная лента в вк) или, скажем, подгрузка таблицы в страницу по нажатию на кнопку.

Как ты получишь полный хтмл страницы одним запросом?

Или, скажем, ты делаешь запрос, добавляешь куки нужные учитываешь аджакс подгрузку по нажатию на кнопки каким-то хитрым макаром (например вызывая JS) или используя виртуальную прокрутку(например вызывая некий JS), а потом тебя перенаправляет для загрузку файла на другой хостнейм. И здесь нужно еще учитывать CORS (Cross-origin resource sharing).

И так далее.

Короче, что бы полностью обрабатывать все-все-все случаи жизни тебе нужно НАПИСАТЬ СВОЙ ДВИЖОК БРАУЗЕРА. Ну или использовать уже готовый.

Так что ответ на вопрос:

Есть. [Точнее есть способ максимально приблизить страницу к той которой видит пользователь] Используй полноценный движок браузера. Можно headless (вроде phantomjs или CEF.headless), можно с юаем, например Gecko или CEF. В таком случае ты сможешь получать полный хтмл учитывая все-все-все нюансы которые нужно учитывать при подгрузке ЛЮБОЙ странцы (собственно, движки браузеров именно для этого и созданны, не так ли?)

Если же ты хочешь в пниципе разобратся какими способами можно сайты парсить, я расписывал основные пути вот здесь: https://ru.stackoverflow.com/a/609646/186752 и там ты сможешь сориентироватся что тебе нужно под твои нужды, а потом уже копать в нужном направлении детали реализации.

Answer 2

Если сайт требует авторизации (вероятно, на самом деле имеется в виду аутентификация?) и поддержки cookies, необходимо добавить код, который реализует это. Другого варианта нет. Если сайт использует стандартную basic authentication, это можно сделать так:

NetworkCredential myCred = new NetworkCredential("admin","123","example.com"); 
CredentialCache myCache = new CredentialCache(); 
myCache.Add(new Uri("example.com"), "Basic", myCred);
CookieContainer myContainer = new CookieContainer();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://example.com/");
request.Credentials = myCache;
request.CookieContainer = myContainer;
request.PreAuthenticate = true;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Для сайтов, где аутентификация осуществляется POST-запросом нестандартного вида, универсального способа нет и не может быть.

Answer 3

На мой взгляд, такого метода не существует так как JavaScript может на ходу добавлять/удалять элементы => для каждого сайта нужен свой отдельный подход, изучая работу сайта через консоль разработчика.

READ ALSO
Перемещение ползунка Slider в пределах SelectionStart и SelectionEnd

Перемещение ползунка Slider в пределах SelectionStart и SelectionEnd

Есть два элемента управления Slider:

118
Что значит рекомендация CA2122 Security::Permissions LinkDemand при анализе C++clr кода?

Что значит рекомендация CA2122 Security::Permissions LinkDemand при анализе C++clr кода?

Я провел анализ своего кода и получил рекомендацию от анализатора (смниже)

196
Правильная сериализация

Правильная сериализация

Познаю науку JSON в C#Действую по статьям и мануалам

160
Активная вкладка браузера Selenium

Активная вкладка браузера Selenium

В моей программе у пользователя может быть открыто множество вкладок и мне надо понимать в какой он сейчас (активной) при условии что он сам...

153