1

我创建了一个脚本,它为特定列表抓取 craiglist,根据标题、图像链接和列表 href 创建一个列表。从那里我使用 twilio 向自己发送一条包含数据的短信。这一切都很好,但我希望能够将列表保存到文件中,然后将新数据与文件进行比较,并且只有在有新信息时才给我发短信。我很难用正确的方法来解决这个问题。

我相信这是人们一直在做的事情,但我没有找到正确的信息来让它在概念上为我点击。

4

2 回答 2

1

我认为您的标题有答案:使用数据库。实现您的目标的一种简单方法是设置一个使用列表 URL 作为表的主键的表,并约束该表以使该值必须是唯一的(如果您的首选数据库还不需要主键键是唯一的)。为简单起见,我假设您将使用sqlite3,因为它很容易上手,并且具有良好的 python 支持和大量文档

另外,为简单起见,我假设您有两个进程:一个扫描列表并将它们添加到您的数据库中,另一个进程扫描新条目并将它们作为通知发送。

从这里开始,您可以采取多种方法来实现仅发送新信息的目标。如果您只有一个进程扫描您的数据库并发送通知,那么添加一列来跟踪特定列表是否已发送给您很简单。作为大纲,您可以定义一个包含列的表:

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

由于 SQLite 本身不支持布尔值,因此您可以在sent_to_notifications字段中使用 1/0 作为 True/False。现在,任何时候您想在数据库中扫描新列表时,您都可以获得所有列表,其中包含以下内容:SELECT * FROM listings WHERE sent_to_notifications=0;. 然后,在发送特定条目的通知后,UPDATE listings SET sent_to_notifications=1 WHERE url="url_that_was_just_sent";. 当然,您可以调整它以一次更新整个批次,但我只是提供一个关于如何解决此类问题的可能大纲。

于 2020-03-11T22:08:42.233 回答
0

我最终找到了一种简单的方法:

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()

我基本上将一个变量设置为文件内容,收集新数据,将其与现有数据进行比较,如果是新数据则附加它。

于 2020-03-12T18:42:32.110 回答