Как сравнить элементы списка со списком базы данных перед отправкой сообщения? - PullRequest
1 голос
/ 12 марта 2020

Я создал скрипт, который очищает список Craiglist для конкретных c списков, создает список на основе заголовка, ссылки на изображение и списка ссылок. Оттуда я использую twilio, чтобы отправить себе текстовое сообщение с данными. Все это прекрасно работает, но я хочу иметь возможность сохранить список в файл, а затем сравнить новые данные с файлом и отправлять текстовые сообщения только при наличии новой информации. У меня проблемы с нахождением правильного способа сделать это.

Я уверен, что это то, чем люди все время занимаются, но я не могу найти нужную информацию, которая делает ее концептуально привлекательной для меня.

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Я думаю, что у вашего заголовка есть ответ: используйте базу данных. Простой способ достижения sh вашей цели - создать таблицу, в которой URL-адрес перечисления используется в качестве первичного ключа таблицы, и ограничить таблицу таким образом, чтобы это значение было уникальным (если предпочитаемая БД уже не требует, чтобы первичный ключ был уникальным). Для простоты здесь я буду предполагать, что вы будете go с sqlite3, поскольку с ним легко начать работу, и он имеет хорошую поддержку python с обширной документацией .

Также, для простоты, я предполагаю, что у вас есть два процесса: один, который сканирует списки и добавляет их в вашу базу данных, и один процесс, который сканирует новые записи и отправляет их в виде уведомлений.

Отсюда есть ряд подходов, которые вы могли бы предпринять для достижения sh вашей цели только отправки новой информации. Если у вас есть только один процесс, сканирующий вашу базу данных и отправляющий уведомления, достаточно просто добавить столбец, который отслеживает, был ли вам отправлен конкретный листинг или нет. В качестве схемы вы можете определить таблицу со столбцами:

CREATE TABLE listings(
    url TEXT PRIMARY KEY,
    title TEXT,
    image_link TEXT,
    sent_to_notifications INT);

Поскольку SQLite изначально не поддерживает логические значения, вы можете просто использовать 1/0 как True / False в поле sent_to_notifications. Теперь, когда вы захотите просмотреть новые списки в вашей базе данных, вы можете получить список всех из них, например: SELECT * FROM listings WHERE sent_to_notifications=0;. Затем, после отправки уведомления для конкретной записи, UPDATE listings SET sent_to_notifications=1 WHERE url="url_that_was_just_sent";. Конечно, вы можете настроить это так, чтобы обновлять весь пакет сразу, но я просто даю один из возможных вариантов того, как атаковать такую ​​проблему.

0 голосов
/ 12 марта 2020

В итоге я нашел простой способ сделать это:

list = []
with open("listing.txt", "r+") as f:
    pre_check_list = f.read()
final_list = []

for h in listing_soup.find_all('a', {"class": "result-title 
hdrlnk"}, limit = 5):
    link = h.get('href')
    title = h.text
    if link not in pre_check_list:
        list.append(title)
        list.append(link + '\n')

final_list = '\n'.join(list)

with open("listing.txt", "a") as f:
    f.writelines(final_list)
    f.close()

Я в основном устанавливаю переменную в качестве содержимого файла, собираю новые данные, сравниваю их с существующими данными и добавляю, если новые .

...