Парсинг новых данных на странице

Shake3228

Client
Регистрация
09.02.2021
Сообщения
9
Благодарностей
1
Баллы
3
Подскажите, есть задача:

На доске объявлений люди с разной периодичностью выкладывают новый товар или услугу(может быть несколько раз в секунду, или же раз в несколько минут). Нужно парсить новые объявления и передавать в телеграм канал.

:(С телеграмом вроде бы понятно, через API запрос можно, а вот как именно парсить новые объявления, ума не приложу. Есть только идея взять 1 объявление, и все что выше него передавать в телеграм, а потом на роль этого объявления брать последнее по давности(last in - first out). Но эта стратегия ломается, если например сразу будет опубликовано объявлений больше чем на 1 страницу. Как это грамотно организовать?
 

sitnem

Client
Регистрация
03.12.2016
Сообщения
122
Благодарностей
78
Баллы
28
У каждого объявления есть скорее всего какой-то индивидуальный идентификатор (атрибут id или что-то подобное), если нет, можно самому его составить, например это будет: название темы + время. И хранить список идентификаторов для объявлений, которые были спарсены, соответственно, последний в списке будет как раз самое последнее спарсенное объявление. За счет этого и определеям какое объявление будет следующим, если на первой странице его нет смотрим вторую или третью...
 
  • Спасибо
Реакции: Shake3228

Shake3228

Client
Регистрация
09.02.2021
Сообщения
9
Благодарностей
1
Баллы
3
У каждого объявления есть скорее всего какой-то индивидуальный идентификатор (атрибут id или что-то подобное), если нет, можно самому его составить, например это будет: название темы + время. И хранить список идентификаторов для объявлений, которые были спарсены, соответственно, последний в списке будет как раз самое последнее спарсенное объявление. За счет этого и определеям какое объявление будет следующим, если на первой странице его нет смотрим вторую или третью...
примерно так и сделал, привязался по ссылке на объявление
сейчас ночью редко публикуют, завтра утром буду тестировать во время потоков объявлений
 

artsmm

Client
Регистрация
03.10.2018
Сообщения
1 112
Благодарностей
196
Баллы
63
Подскажите, есть задача:

На доске объявлений люди с разной периодичностью выкладывают новый товар или услугу(может быть несколько раз в секунду, или же раз в несколько минут). Нужно парсить новые объявления и передавать в телеграм канал.

:(С телеграмом вроде бы понятно, через API запрос можно, а вот как именно парсить новые объявления, ума не приложу. Есть только идея взять 1 объявление, и все что выше него передавать в телеграм, а потом на роль этого объявления брать последнее по давности(last in - first out). Но эта стратегия ломается, если например сразу будет опубликовано объявлений больше чем на 1 страницу. Как это грамотно организовать?
если объявления обновляются с какой-то периодичностью, то можно настроить бота, чтобы он парсил по времени. Если нужны только новые объявления, то сначала можно спарсить все что есть, потом сравнивать имеющиеся данные с теми которые бот парсит и добавлять только новые.
Сам парсинг, обычно так делается:
C#:
while(true){
    
    List<HtmlElement> parents = instance.ActiveTab.FindElementsByXPath("//div[@class='bull-item-content__content-wrapper']").ToList();
    
    project.SendInfoToLog("Нашли пунктов выдачи: " + parents.Count);   
    
    
    foreach(HtmlElement parent in parents){
        
        string title = parent.FindChildByXPath(".//a[contains(@class, 'bull-item__self-link auto-shy')]", 0).InnerText;
        
        string price = parent.FindChildByXPath(".//", 0).InnerText;
        
        string date = parent.FindChildByXPath(".//", 0).InnerText;
        
        //здесь сохраняем спарсенные позиции в телегу или таблицу, как удобно
        
    }
    
    HtmlElement nextPage = instance.ActiveTab.FindElementByXPath("//dalee", 0);
    
    if(nextPage.IsVoid) break;
    nextPage.Click();
    instance.ActiveTab.WaitDownloading();
}
 
  • Спасибо
Реакции: Shake3228

Shake3228

Client
Регистрация
09.02.2021
Сообщения
9
Благодарностей
1
Баллы
3
если объявления обновляются с какой-то периодичностью, то можно настроить бота, чтобы он парсил по времени. Если нужны только новые объявления, то сначала можно спарсить все что есть, потом сравнивать имеющиеся данные с теми которые бот парсит и добавлять только новые.
Сам парсинг, обычно так делается:
C#:
while(true){
  
    List<HtmlElement> parents = instance.ActiveTab.FindElementsByXPath("//div[@class='bull-item-content__content-wrapper']").ToList();
  
    project.SendInfoToLog("Нашли пунктов выдачи: " + parents.Count); 
  
  
    foreach(HtmlElement parent in parents){
      
        string title = parent.FindChildByXPath(".//a[contains(@class, 'bull-item__self-link auto-shy')]", 0).InnerText;
      
        string price = parent.FindChildByXPath(".//", 0).InnerText;
      
        string date = parent.FindChildByXPath(".//", 0).InnerText;
      
        //здесь сохраняем спарсенные позиции в телегу или таблицу, как удобно
      
    }
  
    HtmlElement nextPage = instance.ActiveTab.FindElementByXPath("//dalee", 0);
  
    if(nextPage.IsVoid) break;
    nextPage.Click();
    instance.ActiveTab.WaitDownloading();
}
Задача усложнилась тем, что объявления публикуются не сразу, а проходят видимо какую то модерацию
Ночью раз в 10-15 мин заливалось до 10 объявлений сразу, а днем сразу по 100-150 раз в 10-15 минут. На странице всего 100 публикаций, значит нужно 2 страницы или больше парсить.
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
19 470
Благодарностей
8 692
Баллы
113
На доске объявлений люди с разной периодичностью выкладывают новый товар или услугу(может быть несколько раз в секунду, или же раз в несколько минут). Нужно парсить новые объявления и передавать в телеграм канал.
Как вариант, парсить несколько последних страниц и проверять по черному списку страниц, которые уже были отправлены в Телеграм. Отправляем в ТГ и сразу пополняем черный список, например адресом на полную карточку товара или заголовком.
 
  • Спасибо
Реакции: Shake3228

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)