Парсер цен на топливо за текущий день

Сегодня попробуем написать простой парсер цен на топливо за сегодняшний день. В качестве источника информации будем использовать сайт Передовых Платежных Решений. Почему именно его, просто случайность. Регион для сбора сведений — Республика Татарстан. И самое главное — язык программирования C# (не все же время писать на PHP smile )

Для начала создадим новый проект под названием dsGasPriceParser. На проекте расположим форму с тремя Label (имена lbl95, lbl92 и lblDt). Кстати, посмотреть результат работы можно на рис. 1. Я форму немного приукрасил.

dsGasPriceParserРис. 1. Пример запущенного приложения

Принцип работы программы довольно прост. Сначала осуществляется запрос на определенный URL, откуда вытягивается все содержимое страницы (https://www.petrolplus.ru/fuelindex/tatarstan_republic/). После при помощи класса для работы с регулярными выражениями Regex ищем нужные нам строки. Так информация о ценах на странице представлена в виде графика, то за его построение отвечает javascript. Вот как раз из данного скрипта мы и будем извлекать данные.

В результате получаем данные для бензина 92 и 95, а также дизельного топлива.

Сразу приведу весь текст программы файла основной формы (frmMain.cs).

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Net;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace dsGasPriceParser
{
public partial class frmMain : Form
{
// Файл для хранения данных
private static string filename = AppDomain.CurrentDomain.BaseDirectory + @"\dsGasPriceParser";

// Ссылка для парсинга данных
private static string sourceUrl = "https://www.petrolplus.ru/fuelindex/tatarstan_republic/";

public frmMain()
{
InitializeComponent();
}

private static void getData(string url)
{
List<string> list = new List<string>();

string html = getRequest(url);

string pattern = @"(('АИ-\d{2}')|('Дизельное топливо'))+" +
@"(,data:\s)+" +
@"\[(.*)\]+";

Regex regex = new Regex(pattern);
MatchCollection matches = regex.Matches(html);

foreach (Match math in matches)
{
string Prices = math.Groups[5].ToString();
string[] Price = Prices.Split(',');

double newPrice = double.Parse(Price[6], CultureInfo.InvariantCulture);

list.Add(String.Format("{0:0.00}", newPrice));
}

try
{
// Запись в файл
File.WriteAllLines(filename, list);
}
catch
{
MessageBox.Show("Неудалось записать файл", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

private static string getRequest(string url)
{
try
{
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.AllowAutoRedirect = false;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
using (Stream stream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream, Encoding.GetEncoding(response.CharacterSet)))
{
return reader.ReadToEnd();
}
}
}
}
catch
{
return String.Empty;
}
}

private void Form1_Load(object sender, EventArgs e)
{
if (File.Exists(filename))
{
DateTime creationTime = File.GetLastWriteTime(filename);
if (DateTime.Now.ToShortDateString() != creationTime.ToShortDateString())
{
getData(sourceUrl);
}
}
else
{
getData(sourceUrl);
}

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

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

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: