Давно интересует: а есть ли где-нибудь универсальный способ получения 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();
}
}
В большинстве случаев его хватает, но иногда приходится дополнять. Поэтому было бы неплохо заранее иметь готовый вариант, где все учтено
а есть ли где-нибудь универсальный способ получения html-кода всей страницы?
Существует слишком много технологий которые нужно учитывать. Есть сайты где есть AJAX подгрузка страницы. Вечная загрузка страницы (например новостная лента в вк) или, скажем, подгрузка таблицы в страницу по нажатию на кнопку.
Как ты получишь полный хтмл страницы одним запросом?
Или, скажем, ты делаешь запрос, добавляешь куки нужные учитываешь аджакс подгрузку по нажатию на кнопки каким-то хитрым макаром (например вызывая JS) или используя виртуальную прокрутку(например вызывая некий JS), а потом тебя перенаправляет для загрузку файла на другой хостнейм. И здесь нужно еще учитывать CORS (Cross-origin resource sharing).
И так далее.
Короче, что бы полностью обрабатывать все-все-все случаи жизни тебе нужно НАПИСАТЬ СВОЙ ДВИЖОК БРАУЗЕРА. Ну или использовать уже готовый.
Так что ответ на вопрос:Есть. [Точнее есть способ максимально приблизить страницу к той которой видит пользователь] Используй полноценный движок браузера. Можно headless (вроде phantomjs или CEF.headless), можно с юаем, например Gecko или CEF. В таком случае ты сможешь получать полный хтмл учитывая все-все-все нюансы которые нужно учитывать при подгрузке ЛЮБОЙ странцы (собственно, движки браузеров именно для этого и созданны, не так ли?)
Если же ты хочешь в пниципе разобратся какими способами можно сайты парсить, я расписывал основные пути вот здесь: https://ru.stackoverflow.com/a/609646/186752 и там ты сможешь сориентироватся что тебе нужно под твои нужды, а потом уже копать в нужном направлении детали реализации.
Если сайт требует авторизации (вероятно, на самом деле имеется в виду аутентификация?) и поддержки 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-запросом нестандартного вида, универсального способа нет и не может быть.
На мой взгляд, такого метода не существует так как JavaScript может на ходу добавлять/удалять элементы => для каждого сайта нужен свой отдельный подход, изучая работу сайта через консоль разработчика.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть два элемента управления Slider:
Я провел анализ своего кода и получил рекомендацию от анализатора (смниже)
В моей программе у пользователя может быть открыто множество вкладок и мне надо понимать в какой он сейчас (активной) при условии что он сам...