@iamXado

Как сделать автоматический парсер?

Имеется вот такой код:
import telebot
import config
from time import sleep
from bs4 import BeautifulSoup
import requests

bot = telebot.TeleBot(config.token)

@bot.message_handler(commands = ['start'])
def start(message):

    html = requests.get("https://www.rbc.ru/short_news")
    soup = BeautifulSoup(html.text, 'lxml')
    title = soup.find('span', class_ = 'item__title-wrap')
    href = soup.find('div', class_ = 'item__wrap l-col-center')

    while html.status_code == 200:

        for t in title.find_all('span', class_ = 'item__title rm-cm-item-text')[:1]:

            answer_title = t.text.strip()
            print(answer_title)

        for h in href.find_all('a', class_ = 'item__link')[:1]:

            answer_href = h.get('href')
            print(answer_href)

            bot.send_message(message.chat.id, f'{answer_title}\n\n{answer_href}')

            sleep(5)

if __name__ == '__main__':
    bot.polling(none_stop = True)


Он парсит новости ленты с РБК (заголовок + ссылка), точнее последнюю новость.

mLVMV.png

Sj3Qx.png

У меня два вопроса.

1. Как спарсить не последнюю новость, а любую (например, предпоследнюю).
2. И как сделать проверку новых новостей, чтобы программа понимала, что вышла новая новость и сразу парсила её.

P.S. Ещё я обнаружил, что при таймере парсится одна и та же новость. То есть программа запущена, новость спарсилась и через указанный интервал времени, даже если на сайте появились новые новости будет парсится эта же новость, пока не перезапущу программу.
  • Вопрос задан
  • 161 просмотр
Решения вопроса 1
SoreMix
@SoreMix
yellow
1. Как спарсить не последнюю новость, а любую (например, предпоследнюю)

Логично, что нужно найти все новости, и выбрать предпоследнюю

2. И как сделать проверку новых новостей, чтобы программа понимала, что вышла новая новость и сразу парсила её.

А как вы понимаете, что новость новая? Скорее всего вы помните название последней новости, и при обновлении страницы опять находите последнюю статью, и сравниваете название с тем, которое помните? Неожидано, но для бота все точно так же. Находите последнюю на текущий момент статью -> сохраняете ее название в переменной -> через Х времени заново находите последнюю новость, и сравниваете названия.

Ещё я обнаружил, что при таймере парсится одна и та же новость. То есть программа запущена, новость спарсилась и через указанный интервал времени, даже если на сайте появились новые новости будет парсится эта же новость, пока не перезапущу программу.

Все правильно, вы один раз получили код страницы, и больше его не обновляли
html = requests.get("https://www.rbc.ru/short_news")
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
deeplay Новосибирск
от 130 000 ₽
от 130 000 ₽
KALABI Москва
от 150 000 до 200 000 ₽
21 окт. 2020, в 22:40
300 руб./за проект
21 окт. 2020, в 22:34
25000 руб./за проект
21 окт. 2020, в 21:24
7000 руб./за проект