Парсинг страницы (сломался) - 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; }
}
}
}