Python — избегайте дублирования записей при очистке изображений Reddit

Я новичок в python и пытаюсь написать скрипт. Я могу получить список URL-адресов, а затем записать их в файл. Позже я придумаю, как их скачать.

На данный момент меня беспокоит:

  1. Как убедиться, что URL-адреса (или элементы в списке), которые у меня уже есть, не будут снова очищены?
  2. Действительно ли это хороший способ добавить URL-адреса в список, потому что в кратчайшие сроки их будут сотни/тысячи, ИЛИ я просто хочу сохранить текстовый файл с URL-адресами?

Вот код, который у меня есть.

import praw
import json

reddit = praw.Reddit(client_id='myy-client',
                     client_secret='my-secret',
                     user_agent='my-user-agent')

my_sub = reddit.subreddit('earthporn')
imagesList = []
badContent = "comments"

#myfile = open('images.txt', 'w')
for i in my_sub.new():
    imagesList.append(i.url)
    #myfile.write(i.url + " \n")
#myfile.close()

if badContent in imagesList:
    imagesList.remove()

print(imagesList)

Обратите внимание, что строки «запись в файл» на самом деле закомментированы. Я просто экспериментировал с ними.


person Nishant    schedule 19.07.2019    source источник


Ответы (2)


Если вы хотите сохранить уникальный URL-адрес, используйте set вместо list.

Вы можете использовать файл json, чтобы сохранить все данные, а затем повторять их как генератор или что-то, что не будет использовать много вашей оперативной памяти.

person Mahund    schedule 19.07.2019

Вы можете реализовать базовый кеш, используя JSON. Если вы используете диктофон, вы можете проверить, был ли файл ранее загружен. Один из способов — хранить метаданные в виде словаря, сохраненного в JSON. Тогда загруженный файл представляет собой отдельный блоб.

Представьте, что у вас есть:

cache = {
    "https://stackoverflow.com/questions/57105974/python-avoid-duplicate-entries-scraping-reddit-images": {
        "download_date": "2018/09/19 15:55:09",
        "local_file": "2018 09 19 - 15 55 09 866446.html",
    },
    "http://www.example.org/cat.jpg": {
        "download_date": "2018/09/19 15:55:09",
        "local_file": "2018 09 19 - 15 55 09 866446.jpg",
    }
}

Вы можете проверить существование, используя if url in cache

import datetime
import os
import json

STR_DATE_FORMAT_MICROSECONDS = '%Y %m %d - %H %M %S %f' # the specifice datetime I used

def download(url):
    # downloads binary blob. saves to /cached/foo.ext
    data = actually_download(url)    
    now = datetime.datetime.now().strftime(STR_DATE_FORMAT_SECONDS)

    filepath = "{datetime}{ext}".format(
        datetime=now,
        ext=ext_type,
    )

    path = os.path.join("cached", filepath)

    # now write `data` to `path`

    return {
        'download_date': now,
        'local_file': filepath,
    }

def request_cached(cache, url):
    if url not in cache:
        cache[url] = download(url)

    return cache[url]


def main():

    with open("cache.json", mode='r', encoding='utf-8') as f:
        cache = json.load(f)

    url = # ... 
    request_cached(cache, url)

    # save
    with open("cache.json", mode='w', encoding='utf-8') as f:
        json.dump(cache, f, indent=4, sort_keys=True)

В будущем вы можете использовать download_date, чтобы решить, хорош ли кеш.

person ninMonkey    schedule 21.08.2019