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

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

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

Доброго времени суток! Нужна помощь. История такова, парсер работал около 2-х лет, и внезапно перестал парсить данные. На первый взгляд исходный код страницы не поменялся. В чём причина, так и не понял, парсинг практически не знаю (метод тыка не помог) Пример страницы для парсинга: http://www.stoloto.ru/5x36/archive рабочий код такой (был):
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Net;
  10. using System.IO;
  11. namespace парсер_5_36
  12. {
  13. public partial class Form1 : Form
  14. {
  15. public Form1()
  16. {
  17. InitializeComponent();
  18. button1.Enabled = false;
  19.  
  20. string url = "http://www.stoloto.ru/5x36/archive";
  21. try
  22. {
  23. WebClient client = new WebClient();
  24. client.DownloadProgressChanged += new System.Net.DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
  25. client.Encoding = System.Text.Encoding.UTF8;
  26. client.DownloadStringCompleted += (sender, e) =>
  27. {
  28. if (!e.Cancelled && e.Error == null)
  29. {
  30. result = e.Result;
  31. button1.Enabled = true;
  32. // button1.PerformClick();
  33. }
  34. };
  35. client.DownloadStringAsync(new Uri(url));
  36. client.Dispose();
  37. }
  38. catch
  39. {
  40. MessageBox.Show("Сервер сбросил соеденение");
  41. }
  42. }
  43. string result = string.Empty;
  44.  
  45. private void button1_Click(object sender, EventArgs e)
  46. {
  47. FileStream fs = new FileStream(Application.StartupPath + "\\5-36.txt", FileMode.Create);
  48. StreamWriter streamWriter = new StreamWriter(fs);
  49. richTextBox1.Clear();
  50. var doc = new HtmlAgilityPack.HtmlDocument();
  51. doc.LoadHtml(result);
  52. var monthList = doc.DocumentNode.SelectNodes("//div[@class='month']");
  53.  
  54. foreach (var month in monthList)
  55. {
  56. var elemList = month.ChildNodes.Where(x => x.Name == "div" && x.Attributes["class"].Value == "elem");
  57. foreach (var elem in elemList)
  58. {
  59. var indoc = new HtmlAgilityPack.HtmlDocument();
  60. indoc.LoadHtml(elem.InnerHtml);
  61. HtmlAgilityPack.HtmlNode a = indoc.DocumentNode.SelectSingleNode("//a");
  62. HtmlAgilityPack.HtmlNode ins = indoc.DocumentNode.SelectSingleNode("//ins");
  63.  
  64. string date = string.Empty;
  65. richTextBox1.AppendText(String.Format("{0} {1}", a.InnerText, date));
  66. richTextBox1.AppendText("_ ");
  67. var numberList = indoc.DocumentNode.SelectNodes("//b");
  68. StringBuilder sb = new StringBuilder(256);
  69. int dj = 0;
  70. foreach (var num in numberList)
  71. {
  72. dj = dj + 1;
  73. if (dj < 6)
  74. sb.Append(num.InnerText.Replace("&nbsp;", " "));
  75. }
  76. dj = 0;
  77. richTextBox1.AppendText(sb.ToString().TrimEnd() + Environment.NewLine);
  78. }
  79. }
  80. richTextBox1.SaveFile(fs, RichTextBoxStreamType.PlainText);
  81. streamWriter.Close();
  82. fs.Close();
  83. streamWriter.Dispose();
  84. fs.Dispose();
  85. progressBar1.Value = 0;
  86. MessageBox.Show("Успешное обновление!");
  87.  
  88. this.Close();
  89. }
  90.  
  91. }
  92. }
прошу помочь, очень нужен парсер.

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

textual
Листинг программы
  1. using AngleSharp.Parser.Html;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.IO.Compression;
  6. using System.Linq;
  7. using System.Net.Http;
  8. using System.Text;
  9. using System.Text.RegularExpressions;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12.  
  13. namespace test
  14. {
  15.     class Program
  16.     {
  17.         static void Main(string[] args)
  18.         {
  19.             MainAsync().Wait();
  20.  
  21.             Console.Read();
  22.         }
  23.  
  24.         static async Task MainAsync()
  25.         {
  26.             Program p = new Program();
  27.             var content = await p.HttpGetStringContentAsync(@"http://www.stoloto.ru/5x36/archive");
  28.             var parsingContent = p.ParseHtml(content);
  29.  
  30.             Console.WriteLine(string.Join(Environment.NewLine, parsingContent.Select(item => $"{item.Date}\t{item.Draw}\t{item.Numbers}\t{item.Prize}")));
  31.         }
  32.  
  33.         private List<Stoloto> ParseHtml(string content)
  34.         {
  35.  
  36.             var parser = new HtmlParser();
  37.             var document = parser.Parse(content);
  38.  
  39.             var container = ".month .elem";
  40.             var dateContainer = ".main .draw_date";
  41.             var drawContainer = ".main .draw";
  42.             var numbersContainer = ".main .numbers .container.cleared:not(.sorted)";
  43.             var prizeContainer = ".main .prize";
  44.  
  45.             return document.QuerySelectorAll(container)
  46.                 .Select(item => new Stoloto
  47.                 {
  48.                     Date = item.QuerySelector(dateContainer).TextContent.Trim(),
  49.                     Draw = item.QuerySelector(drawContainer).TextContent.Trim(),
  50.                     Numbers = Regex.Replace(item.QuerySelector(numbersContainer).TextContent, @"[\W\D]+", " ").Trim(),
  51.                     Prize = Regex.Replace(item.QuerySelector(prizeContainer).TextContent, @"[\W\D]+", " ").Trim(),
  52.                 }).ToList();
  53.         }
  54.  
  55.         private async Task<string> HttpGetStringContentAsync(string url)
  56.         {
  57.             using (var httpClient = new HttpClient())
  58.             {
  59.                 httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml");
  60.                 httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate");
  61.                 httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");
  62.                 httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1");
  63.  
  64.                 using (HttpResponseMessage response = await httpClient.GetAsync(new Uri(url)))
  65.                 {
  66.                     var bytes = await response.Content.ReadAsByteArrayAsync();
  67.  
  68.                     Encoding encoding = Encoding.GetEncoding("utf-8");
  69.                     return encoding.GetString(bytes, 0, bytes.Length);
  70.                 }
  71.  
  72.                 //using (HttpResponseMessage response = await httpClient.GetAsync(new Uri(url)))
  73.                 //using (var responseStream = await response.Content.ReadAsStreamAsync())
  74.                 //using (var decompressedStream = new GZipStream(responseStream, CompressionMode.Decompress))
  75.                 //using (var streamReader = new StreamReader(decompressedStream))
  76.                 //{
  77.                 //    return await streamReader.ReadToEndAsync();
  78.                 //}
  79.             }
  80.         }
  81.  
  82.         public class Stoloto
  83.         {
  84.             public string Date { get; set; }
  85.             public string Draw { get; set; }
  86.             public string Numbers { get; set; }
  87.             public string Prize { get; set; }
  88.         }
  89.     }
  90. }

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут