Парсинг страницы (сломался) - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Нужна помощь. История такова, парсер работал около 2-х лет, и внезапно перестал парсить данные. На первый взгляд исходный код страницы не поменялся. В чём причина, так и не понял, парсинг практически не знаю (метод тыка не помог) Пример страницы для парсинга: http://www.stoloto.ru/5x36/archive рабочий код такой (был):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
 
namespace парсер_5_36
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            button1.Enabled = false;

            string url = "http://www.stoloto.ru/5x36/archive";
 
            try
            {
                WebClient client = new WebClient();
                client.DownloadProgressChanged += new System.Net.DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
                client.Encoding = System.Text.Encoding.UTF8;
                client.DownloadStringCompleted += (sender, e) =>
                {
                    if (!e.Cancelled && e.Error == null)
                    {
                        result = e.Result;
                        button1.Enabled = true;
                       // button1.PerformClick();
                    }
                };
 
                client.DownloadStringAsync(new Uri(url));
                client.Dispose();
 
            }
            catch
            {
 
                MessageBox.Show("Сервер сбросил соеденение");
            }
 
        }
 
        string result = string.Empty;

        private void button1_Click(object sender, EventArgs e)
        {
            FileStream fs = new FileStream(Application.StartupPath + "\\5-36.txt", FileMode.Create);
 
            StreamWriter streamWriter = new StreamWriter(fs);
 
            richTextBox1.Clear();
            var doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(result);
            var monthList = doc.DocumentNode.SelectNodes("//div[@class='month']");

            foreach (var month in monthList)
            {
                var elemList = month.ChildNodes.Where(x => x.Name == "div" && x.Attributes["class"].Value == "elem");
                foreach (var elem in elemList)
                {
                    var indoc = new HtmlAgilityPack.HtmlDocument();
                    indoc.LoadHtml(elem.InnerHtml);
                    HtmlAgilityPack.HtmlNode a = indoc.DocumentNode.SelectSingleNode("//a");
                    HtmlAgilityPack.HtmlNode ins = indoc.DocumentNode.SelectSingleNode("//ins");

                    string date = string.Empty;
 
                    richTextBox1.AppendText(String.Format("{0} {1}", a.InnerText, date));
                    richTextBox1.AppendText("_ ");
 
                    var numberList = indoc.DocumentNode.SelectNodes("//b");
                    StringBuilder sb = new StringBuilder(256);
                    int dj = 0;
                    foreach (var num in numberList)
                    {
                        dj = dj + 1;
                        if (dj < 6)
                            sb.Append(num.InnerText.Replace("&nbsp;", " "));
                    }
                    dj = 0;
                    richTextBox1.AppendText(sb.ToString().TrimEnd() + Environment.NewLine);
                }
            }
            richTextBox1.SaveFile(fs, RichTextBoxStreamType.PlainText);
            streamWriter.Close();
            fs.Close();
            streamWriter.Dispose();
            fs.Dispose();
            progressBar1.Value = 0;
            MessageBox.Show("Успешное обновление!");

            this.Close();
        }

    }
}
прошу помочь, очень нужен парсер.

Решение задачи: «Парсинг страницы (сломался)»

textual
Листинг программы
using AngleSharp.Parser.Html;
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
 
namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            MainAsync().Wait();
 
            Console.Read();
        }
 
        static async Task MainAsync()
        {
            Program p = new Program();
            var content = await p.HttpGetStringContentAsync(@"http://www.stoloto.ru/5x36/archive");
            var parsingContent = p.ParseHtml(content);
 
            Console.WriteLine(string.Join(Environment.NewLine, parsingContent.Select(item => $"{item.Date}\t{item.Draw}\t{item.Numbers}\t{item.Prize}")));
        }
 
        private List<Stoloto> ParseHtml(string content)
        {
 
            var parser = new HtmlParser();
            var document = parser.Parse(content);
 
            var container = ".month .elem";
            var dateContainer = ".main .draw_date";
            var drawContainer = ".main .draw";
            var numbersContainer = ".main .numbers .container.cleared:not(.sorted)";
            var prizeContainer = ".main .prize";
 
            return document.QuerySelectorAll(container)
                .Select(item => new Stoloto
                {
                    Date = item.QuerySelector(dateContainer).TextContent.Trim(),
                    Draw = item.QuerySelector(drawContainer).TextContent.Trim(),
                    Numbers = Regex.Replace(item.QuerySelector(numbersContainer).TextContent, @"[\W\D]+", " ").Trim(),
                    Prize = Regex.Replace(item.QuerySelector(prizeContainer).TextContent, @"[\W\D]+", " ").Trim(),
                }).ToList();
        }
 
        private async Task<string> HttpGetStringContentAsync(string url)
        {
            using (var httpClient = new HttpClient())
            {
                httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml");
                httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate");
                httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");
                httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1");
 
                using (HttpResponseMessage response = await httpClient.GetAsync(new Uri(url)))
                {
                    var bytes = await response.Content.ReadAsByteArrayAsync();
 
                    Encoding encoding = Encoding.GetEncoding("utf-8");
                    return encoding.GetString(bytes, 0, bytes.Length);
                }
 
                //using (HttpResponseMessage response = await httpClient.GetAsync(new Uri(url)))
                //using (var responseStream = await response.Content.ReadAsStreamAsync())
                //using (var decompressedStream = new GZipStream(responseStream, CompressionMode.Decompress))
                //using (var streamReader = new StreamReader(decompressedStream))
                //{
                //    return await streamReader.ReadToEndAsync();
                //}
            }
        }
 
        public class Stoloto
        {
            public string Date { get; set; }
            public string Draw { get; set; }
            public string Numbers { get; set; }
            public string Prize { get; set; }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5