Mit wget herunterladen, ohne den Endindex zu kennen

1

Ich lade einige Messungen mit wget herunter, die in Form von

http://www.somewhere.com/sub-somewhere052/image0001.jpg  
http://www.somewhere.com/sub-somewhere052/file0001.txt  

bis zu

http://www.somewhere.com/sub-somewhere052/image0099.jpg  
http://www.somewhere.com/sub-somewhere052/file0099.txt  

Das Problem ist, dass sich diese beiden Nummern von Test zu Test ändern (das war Test 052 ) und jeder Test eine unbekannte (mir im Voraus bekannte) Anzahl von Dateien hat. Sie werden jedoch alle gleich genannt (sie werden natürlich nicht irgendwo genannt ) und das ist bekannt.

Wie kann ich wget dazu bringen, sub-somewhere001 / image0001.jpg bis imagexxxx.jpg "durchzugehen" (wobei xxxx unbekannt ist), bis es die eine Datei erreicht, die nicht mehr existiert, und dann zu (nach filexxxx.txt's) zu gehen ) nach irgendwo002 / ... und so weiter?

Kurz gesagt, wie gehe ich mit der Situation um, dass nichts mehr da ist?

Turm
quelle
1
Oh, wow ... die Domain "Irgendwo" existiert tatsächlich !?
Rook
1
Du solltest für solche Dinge wirklich example.com verwenden - es ist eine reservierte Adresse.
Bob
@ Bob - Ja, nun ... der Punkt ist, glaube ich, klar und ich bezweifle, dass irgendjemand hingehen wird, um zu sehen, ob es irgendwo da draußen eine file0099.txt gibt (ohne Wortspiel) :)
Rook

Antworten:

3

Daran man wgetkönnen Sie erkennen, dass die übliche Unix-Rückgabewertkonvention verwendet wird - 0 bedeutet keinen Fehler, alles andere ist ein Fehler. Vorausgesetzt, Sie erwarten keine anderen Arten von Fehlern (z. B. Netzwerkfehler oder ähnliches), dh Sie erwarten, dass Sie Folgendes verwenden können, wenn nichts heruntergeladen wird, was bedeutet, dass keine Datei vorhanden ist:

get_tf_simulated() {
  t=$1
  if [ $t -lt 3 ]; then
    f=$3
    s=$((2 * $t))
    if [ $f -lt $s ]; then
      return 0
    fi
  fi
  return 1
}

get_tf_real() {
  tp=$2
  fp=$4
  inf=$5
  ext=$6
  # Get http://example.com/test<test number>/<image or file><file number>.<jpg or txt>
  wget -Otest$tp_file$fp_$inf.$ext http://example.com/test$tp/$inf$fp.$ext
}

get_tf() {
  echo --- Getting $*
  get_tf_simulated $*
  #get_tf_real $*
}

get_all() {
  get_tf $t $tp $f $fp image jpg
  ret_val=$?
  if [ $ret_val -ne 0 ]; then
    return $ret_val
  fi
  get_tf $t $tp $f $fp file txt
}

for t in {1..999}; do
  tp=`printf %3.3d $t`
  got_one=no
  for f in {1..9999}; do
    fp=`printf %4.4d $f`
    get_all $t $tp $f $fp
    if [ $? -ne 0 ]; then
      echo Failed, going next
      break
    fi
    got_one=yes
  done
  if [ $got_one == 'no' ]; then
    echo Nothing more
    break
  fi 
done

Kommentieren Sie die richtige Zeile in get_allFunktion. Derzeit wird es simuliert und die Ausgabe sieht folgendermaßen aus (vorausgesetzt, Sie haben das oben Gesagte in gespeichert mkt.sh):

$ ./mkt.sh 
--- Getting 1 001 1 0001 image jpg
--- Getting 1 001 1 0001 file txt
--- Getting 1 001 2 0002 image jpg
Failed, going next
--- Getting 2 002 1 0001 image jpg
--- Getting 2 002 1 0001 file txt
--- Getting 2 002 2 0002 image jpg
--- Getting 2 002 2 0002 file txt
--- Getting 2 002 3 0003 image jpg
--- Getting 2 002 3 0003 file txt
--- Getting 2 002 4 0004 image jpg
Failed, going next
--- Getting 3 003 1 0001 image jpg
Failed, going next
Nothing more

Hinweis: Ich habe das nicht getestet wget, aber Sie können dies verwenden, um einige Dateien zu testen:

wget -Otest$tp_file$fp_$inf.$ext http://example.com/test$tp/$inf$fp.$ext; echo $?

Ersetzen Sie einfach $tp, $fp, $infund $extnach Bedarf, zB für ähnliches Beispiel zu dem, was Sie haben:

wget -Otest052_file0001_file.txt http://www.example.com/sub-somewhere052/file0001.txt; echo $?

Dies sollte 8für 404 aus dem Echo man wget:

8   Server issued an error response.

Wenn dies funktioniert, sollte das Skript funktionieren und hoffen, dass in dieser einen Zeile keine Tippfehler enthalten sind. :)

icyrock.com
quelle
Ich werde versuchen, das in Windows zu kopieren. Ich benutze eine Portierung von Wget auf WinXP, daher habe ich keine Manpages.
Rook
@Idigas: Hier, armer Kerl, deine eigene Kopie von wget, nur für dich: gnu.org/software/wget/manual/wget.html :)
Akira
@akira - Ich habe bereits eine Kopie von wget. Was ich nicht habe, ist eine * nix-Shell ...
Rook
@Idigas: yah, ich meinte MANUAL of wget .. aber ich habe den Witz verdorben :)
Akira
@Idigas Sie können Cygwin installieren . Es hat eine Bash-Shell und Wget, so dass Sie in der Lage sein sollten, die oben genannten ohne Probleme auszuführen.
icyrock.com
0

Wenn die Site eine 404Antwort zurückgibt , wgetwird die $?Variable auf einen Wert ungleich Null gesetzt (insbesondere 8, aber wen interessiert das?). Das können Sie testen.

Ich finde bash ziemlich verwirrend, also hier ist eine in Python (2.7.2). Es sollte funktionieren, aber ich kann nicht direkt ohne eine handliche Website testen. Dies hängt davon ab, ob der Server eine ordnungsgemäße 404-Antwort zurückgibt.

#! /usr/bin/python

basepath = "http://www.somewhere.com/sub-somewhere"
imgpre = "/image"
imgpost = ".jpg"
txtpre = "/txt"
txtpost = ".txt"

import os
import urllib2

directorynum = 1
filenum = 1

while True:
    pathdir = basepath + str(directorynum).zfill(3)

    if filenum == 1:
        try:
            os.makedirs(pathdir[7:])
        except OSError, e:
            print "Error creating directory: " + e.strerror

    pathimg = pathdir + imgpre + str(filenum).zfill(4) + imgpost
    pathtxt = pathdir + txtpre + str(filenum).zfill(4) + txtpost
    try:        
        print "Getting " + pathimg
        resp = respimg = urllib2.urlopen(pathimg)
        with open(pathimg[7:], "wb") as f:
            f.write(respimg.read())

        print "Getting " + pathtxt
        resp = resptxt = urllib2.urlopen(pathtxt)
        with open(pathtxt[7:], "w") as f:
            f.write(resptxt.read())

        filenum += 1

        continue
    except urllib2.HTTPError, e:
        if e.code == 404:
            print "Error: 404"
            print "Got " + str(filenum - 1) + " from directory " + str(directorynum) + ", incrementing directory."
            directorynum += 1
            filenum = 1
            continue
        else:
            print "An unexpected error (" + resp.code + resp.msg + ") has occurred."
            break

Es sollte auch unter Windows einwandfrei laufen (einfach loswerden #! /usr/bin/pythonund als .pyDatei speichern, obwohl ein Python-Interpreter installiert sein muss)

Bob
quelle