Напишем свой простенький html парсер (.net, c#)

Создадим парсер, который может проходить авторизацию и получать страницы html или json данные.

public class HtmlParser
{
    public string BaseUrl { get; set; }
    public string LoginForm { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public string AuthStringPattern { get; set; }
    public string RefererUri { get; set; }
    public CookieContainer Cookie = new CookieContainer();
    private Uri _cookieHostname;
    public Uri CookieHostname { get {
        if(_cookieHostname == null)
            _cookieHostname = new Uri(BaseUrl);
        return _cookieHostname;
    } }
    public HtmlParser() {
    }
    public void Authorize()
    {
        string authString = string.Format(AuthStringPattern, UserName, Password);
        UTF8Encoding encoding = new UTF8Encoding();
        byte[] buffer = encoding.GetBytes(authString);
        Uri CookieHostname = new Uri(BaseUrl);
        //
        HttpWebRequest hrequest = (HttpWebRequest)HttpWebRequest.Create(BaseUrl + LoginForm);
        hrequest.Method = "POST";
        hrequest.KeepAlive = true;
        hrequest.ContentLength = buffer.Length;
        hrequest.UserAgent = @"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) 
        Chrome/17.0.963.83 Safari/535.11";
        hrequest.Accept = @"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        hrequest.Headers.Add(HttpRequestHeader.AcceptLanguage, @"ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
        hrequest.Headers.Add(HttpRequestHeader.AcceptEncoding, @"gzip,deflate,sdch");
        hrequest.Headers.Add(HttpRequestHeader.AcceptCharset, @"Accept-Charset: utf-8;q=0.7,*;q=0.3");
        hrequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
        hrequest.CookieContainer = Cookie;
        hrequest.ContentType = "application/x-www-form-urlencoded";
        Stream newStream = hrequest.GetRequestStream();
        newStream.Write(buffer, 0, authString.Length);
        newStream.Close();
        //
        using (HttpWebResponse response = (HttpWebResponse)hrequest.GetResponse())
        {
            CookieCollection cookies = new CookieCollection();
            cookies = response.Cookies;
            Cookie.Add(CookieHostname, cookies);
        }
    }
    private string GetCorrectUrl(string url)
    {
        if (!url.StartsWith("http://"))
        {
            url = BaseUrl + url;
        }
        return url;
    }
    public string GetHtmlString(string url, string encoding = null)
    {
        url = GetCorrectUrl(url);
        HttpWebRequest hrequest = (HttpWebRequest)HttpWebRequest.Create(url);
        //
        hrequest.Headers.Add("Cache-Control", "max-age=0");
        hrequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
        hrequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) 
        Chrome/40.0.2214.94 Safari/537.36";
        hrequest.Headers.Add("Accept-Encoding", "gzip, deflate, sdch");
        hrequest.Headers.Add("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4");
        //
        hrequest.Headers.Add("Cookie", Cookie.GetCookieHeader(CookieHostname));
        hrequest.Referer = BaseUrl + RefererUri;
        using (HttpWebResponse hresponse = (HttpWebResponse)hrequest.GetResponse())
        {
            Encoding responseEncoding = null;
            if (string.IsNullOrEmpty(encoding) || encoding.Equals("UTF8"))
                responseEncoding = UTF8Encoding.UTF8;
            else
                responseEncoding = Encoding.ASCII;

            if (!string.IsNullOrEmpty(hresponse.CharacterSet))
                responseEncoding = Encoding.GetEncoding(hresponse.CharacterSet);

            using (StreamReader strReader = new StreamReader(hresponse.GetResponseStream(), responseEncoding))
            {
                return strReader.ReadToEnd();
            }
        }
    }
    public HtmlDocument GetHtmlDoc(string url)
    {
        string html = GetHtmlString(url);
        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(html);
        return doc;
    }
    public T GetJsonData<T>(string url)
    {
        string json = GetHtmlString(url);
        return JsonConvert.DeserializeObject<T>(json);
    }
}

Использовать так:

HtmlParser hp = new HtmlParser
{
    BaseUrl = "http://localhost/",
    LoginForm = "Account/Login",
    UserName = "Admin",
    Password = "123456",
    AuthStringPattern = "UserName={0}&Password={1}"
};
hp.Authorize();
string html = hp.GetHtmlString("test.html");
По теме:
Выполняем get запрос по расписанию c#

Напишем простенькую программу, которая будет выполнять get запрос по истечению определенного интервала времени. class Program { private static Timer _timer; Read more

Выполняем действие по расписанию (asp.net, c#)

Раньше я писал программку, которая выполняла get запрос по расписанию, но так же можно написать обычный HttpModule, который будет делать Read more

Выбираем технологии и инструменты для разработки веб приложений

1 Выбор и настройка инструментов для разработки фронтенда (только самые важные): 1.1 Twitter bootstrap — фреймворк позволяет писать качественную верстку Read more

Делаем водяной знак на картинке (c#, .net)

Нанесем несколько раз картинку watermark на другую картинку. public void DrawWatermark(string watermarkImagePath, System.Drawing.Image image) { using (System.Drawing.Image watermarkImage = System.Drawing.Image.FromFile(watermarkImagePath)) Read more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *