2012-01-06 3 views
0

Я пишу программу python для загрузки некоторых фотографий учеников в моей школе.Curl сохранить только если нет 404

Вот мой код: `

import os 
count = 0 
max_c = 1000000 
while max_c >= count: 
    os.system("curl http://www.tjoernegaard.dk/Faelles/ElevFotos/"+str(count)+".jpg > "+str(count)+".jpg") 
    count=count+1 

`

Проблема заключается в том, что я только хочу так сохранить JPG, если изображение существует на сервере (не 404), а так как я не» t все имена изображений на сервере, я должен отправить запрос для всех изображений от 0 до 1000000, но не все изображения между 0 и 1000000 существует. Поэтому я хочу только сохранить изображение, если оно существует на сервере. Как это сделать (ubuntu)?

Спасибо заранее

ответ

4
import urllib2 
import sys 

for i in range(1000000): 
    try: 
    pic = urllib2.urlopen("http://www.tjoernegaard.dk/Faelles/ElevFotos/"+str(i)+".jpg").read() 
    with open(str(i).zfill(7)+".jpg") as f: 
     f.write(pic) 
    print "SUCCESS "+str(i) 
    except KeyboardInterrupt: 
    sys.exit(1) 
    except urllib2.HTTPError, e: 
    print "ERROR("+str(e.code)+") "+str(i) 

должен работать, 404 генерирует исключение

+0

Ugh, не используйте '+', как это, ее непитонический. Используйте '% s' и такие. – ismail

+2

Я нахожу, что синтаксис% является громоздким, а «.format() не делает его лучше. Поэтому я даже не удосужился подчиниться богу, данному закону питоничности в небольших сценариях. – sleeplessnerd

+0

yup, синтаксис «+» обескуражен в основном из-за проблем с производительностью и безопасностью; если ни одна из них не вызывает беспокойства, кого это волнует. –

-1

Самый простой способ, я думаю, было бы использовать wget вместо curl, который будет отбрасывать 404 ответов автоматически.

1

Я хотел бы предложить, используя библиотеку urllib предоставленной питона для вашей цели.

count = 0 
max_c = 1000000 
while max_c >= count: 
    resp = urllib.urlopen("http://www.tjoernegaard.dk/Faelles/ElevFotos/"+str(count)+".jpg") 
    if resp.getcode() == 404: 
     //do nothing 
    else: 
    // do what you got to do. 

    count=count+1 
7

Вы можете использовать "-f" ARG на провал бесшумно (без ошибок outputing HTTP), например:

локон -f site.com/file.jpg

+0

спасибо, что ответили на реальный вопрос! работает угощение. –

+0

Именно то, что я искал! –

0

Это старый, но я обнаружил, что в bash вы можете использовать --fail, и он будет молчал. Если страница является ошибкой, она НЕ будет загружаться ...

Смежные вопросы