Espelhe o servidor e ignore os arquivos já processados

0

Antes de começar a escrever meu próprio aplicativo para isso, talvez já exista uma solução melhor para o problema:

Eu preciso verificar um servidor HTTP todos os dias para baixar e processar novos arquivos. Basicamente, são arquivos zip que precisam ser extraídos.

Arquivos antigos são excluídos em alguns dias e novos arquivos são enviados várias vezes por dia. Eu não quero processar um arquivo duas vezes.

Minha solução atual é salvar todos os arquivos localmente e usar wget com -nc options, que é chamado por um cronjob duas vezes ao dia:

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

Agora posso analisar o arquivo de log, obter todos os novos arquivos baixados e processá-los:

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

Mas vou acumular um monte de arquivos no meu disco que eu não preciso. Então, eu preciso de um banco de dados para armazenar arquivos já baixados e verificar se há algum arquivo já processado?

    
por reox 14.01.2014 / 16:41

1 resposta

0

Eu escrevi agora um pequeno script para espelhar o servidor e salvar os nomes dos arquivos em um banco de dados.

você também pode consultar hashes md5, por exemplo, se um nome de arquivo puder ser duplicado

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()
    
por 27.01.2014 / 15:38