Парсинг страницы (сломался) - 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(" ", " "));
- }
- 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; }
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д