Html agility + немного логики ) - C#
Формулировка задачи:
Суть вопроса такая:
Есть ссылка ее содержимое, я подгружаю в string и передаю методу
Метод определения даты сообщения.
Работает так регуляркой ищет слова (Сегодня|Вчера) и заносит и в первую группу, после чего ищет часы и минуты, и заносит их во 2 и 3 группы соответственно.
Далее преобразует полученное в строку формата nxxyy, где n = 1 или 0 (1 - сегодня, 0 - вчера) xx - часы и yy - минуты. То есть 11526 означает, что объявление подано, сегодня в 15 часов 26 минут. Сделано это для последующего сравнения даты публикации объявлений, и вычисления новейшего. (но тут то и заложена проблема)
https://m.avito.ru/petrozavodsk/noutbuki
agilityHtmlLoader
, который ищет в переданной строке, последнее объявление (Время подачи объявления обрабатывается в методеTimeToNormalString
), и возвращает массивinforArticles
с данными о [0]Названии объявления
[1]Цене в рублях
[2]Ссылке на объявление
3Времени подачи
Но загвоздка в том, что он отправляет не все новые объявления, с предыдущего обновления, а только последнее, то есть допустим, я обращаюсь к методу раз в 10 минут, и если за эти 10 минут было подано 2 объявления, то вернет он мне данные о последнем поданном (, я бы конечно увеличил количество обращений к методу, но боюсь, что авито расценит это, как не совсем хорошие действия, и отправит Ip в бан, чего мне бы не хотелось. Поэтому очень прошу, помогите разобраться в ситуации, мозг начинает закипать, и на ум лезет не пойми что (. И еще просьба, я знаю, что мой код далек от идеала, хотелось бы послушать знающих людей, которые укажут мне на мои недочеты. Всем заранее спасибо. С Уважением Игорь.// Переменная, с датой последнего объявления в численном формате, дата вычисляется методом //TimeToNormalString
int timeparser = 0;
public string[] agilityHtmlLoader(string values)
{
string[] InfoArticles = new string[4];
HtmlAgilityPack.HtmlDocument PostsParser = new HtmlAgilityPack.HtmlDocument();
PostsParser.LoadHtml(values);
var AllNode =
PostsParser.DocumentNode.SelectNodes("//article[@class='b-item ']");
// Выбираем объявления с новейшей датой.
foreach (HtmlNode node in AllNode)
{
if (timeparser < int.Parse(TimeToNormalString(node.SelectSingleNode("./div[@class='item-info']/div[@class='info-date info-text']").InnerText)))
{
timeparser = int.Parse(TimeToNormalString(node.SelectSingleNode("./div[@class='item-info']/div[@class='info-date info-text']").InnerText));
InfoArticles[0] = node.SelectSingleNode("./h3[@class='item-header']").InnerText.Replace(""", "");
if (node.SelectSingleNode("./div[@class='item-price ']") != null)
InfoArticles[1] = PriceToNormalInt(node.SelectSingleNode("./div[@class='item-price ']").InnerText).ToString();
else
InfoArticles[1] = "Нет цены";
InfoArticles[2] = "https://www.avito.ru" + node.SelectSingleNode("./a").Attributes["href"].Value;
InfoArticles[3] = timeparser.ToString();
}
}
return InfoArticles;
} string TimeToNormalString(string time)
{
string timeConcat = "";
string pattern = @"(Сегодня|Вчера), (\d+):(\d+)";
Regex PriceCondition = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection TimeMatch = PriceCondition.Matches(time);
foreach (Match times in TimeMatch)
{
if (timeConcat == "")
{
if (times.Groups[1].ToString() == "Сегодня")
timeConcat = "1";
else
timeConcat = "0";
}
timeConcat += times.Groups[2].ToString()+times.Groups[3].ToString();
}
if (timeConcat != "")
return timeConcat;
else
return "0";
}Решение задачи: «Html agility + немного логики )»
textual
Листинг программы
foreach (HtmlNode node in AllNode)
{
if (timeparser < int.Parse(TimeToNormalString(node.SelectSingleNode("./div[@class='item-info']/div[@class='info-date info-text']").InnerText)))