Serveur miroir et ignorer les fichiers déjà traités

0

Avant de commencer à écrire ma propre application à cet effet, il existe peut-être déjà une meilleure solution au problème:

Je dois vérifier tous les jours sur un serveur HTTP les nouveaux fichiers à télécharger et à traiter. Fondamentalement, ce sont des fichiers zip qui doivent être extraits.

Les anciens fichiers sont supprimés un jour et les nouveaux fichiers sont téléchargés plusieurs fois par jour. Je ne veux pas traiter un fichier deux fois.

Ma solution actuelle consiste à enregistrer tous les fichiers localement et à utiliser wget avec -nc options, qui est appelée par un cronjob deux fois par jour:

wget -nc -t 10 -o wget.log -r -l 1 --no-parent --reject "index.html*" http://myserver/

Maintenant, je peux analyser le fichier journal, obtenir tous les nouveaux fichiers téléchargés et les traiter:

grep saved wget.log | awk '{ print $6}' # generate a list of downloaded files

Mais je vais accumuler un tas de fichiers sur mon disque dont je n’ai pas besoin. Alors, ai-je besoin d'une base de données pour stocker les fichiers déjà téléchargés et vérifier pour chaque fichier s'il a déjà été traité?

reox
la source
Avez-vous suffisamment accès au serveur HTTP pour savoir s’il fournit également une évaluation rsync, de même que les différents référentiels des distributions Linux? Une implémentation de rsync peut être plus facile si l’architecture du serveur Web la prend en charge et si vous ne faites que récupérer des "enregistrements" dans une "base de données", de manière générale. Codait-il un script pour refléter un sous-ensemble d’ubuntu, et réviser ce document pour rsynchroniser ubuntu me donnait quelques idées allant dans le sens de ce que vous pensez faire, si cela peut vous aider.
Billy McCloskey
non je ne. mais aussi dans ce cas, je dois sauvegarder tous les enregistrements du serveur, car sinon, rsync ne saurait pas si je l'ai déjà téléchargé.
reox
Oui, mais il existe des options de filtrage dans rsync pour limiter ce qui est téléchargé, de manière récursive en dehors du site, donc tous les enregistrements avec un astérisque, et seulement ce qui a changé.
Billy McCloskey

Réponses:

0

J'ai maintenant écrit un court script pour mettre en miroir le serveur et sauvegarder les noms de fichiers dans une base de données.

vous pouvez également rechercher des hachages md5, par exemple si un nom de fichier peut être dupliqué

import urllib.request as urll
import re
import shelve
import hashlib
import time

res = urll.urlopen(url)

html = res.read()

files = re.findall('<a href="([^"]+)">', str(html))[1:]

db = shelve.open('dl.shelve')

print(files)

for file in files:
    if file not in db:
        print("Downloadling %s..." %file)
        res = urll.urlopen(url + "" + file)
        bytes = res.read()
        md5 = hashlib.md5(bytes).hexdigest()

        with open("dl\\"+file, 'wb') as f:
            f.write(bytes)

        print((time.time(), len(bytes), md5))
        db[file] = (time.time(), len(bytes), md5)

db.close()
reox
la source