Парсер цен на топливо за текущий день
Сегодня попробуем написать простой парсер цен на топливо за сегодняшний день. В качестве источника информации будем использовать сайт Передовых Платежных Решений. Почему именно его, просто случайность. Регион для сбора сведений — Республика Татарстан. И самое главное — язык программирования C# (не все же время писать на PHP )
Для начала создадим новый проект под названием dsGasPriceParser. На проекте расположим форму с тремя Label (имена lbl95, lbl92 и lblDt). Кстати, посмотреть результат работы можно на рис. 1. Я форму немного приукрасил.
Рис. 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);
}Страницы: 1 2