Получить размер файла с помощью Pycurl

Я хочу написать загрузчик с python, и я использую PycURL в качестве моей библиотеки, но у меня возникла проблема. Я не могу получить размер файла, который хочу скачать. Вот часть моего кода:

import pycurl
url = 'http://www.google.com'
c = pycurl.Curl()
c.setopt(c.URL, url)
print c.getinfo(c.CONTENT_LENGTH_DOWNLOAD)
c.perform()

Когда я тестирую этот код в оболочке Python, это нормально, но когда я пишу его как функцию и запускаю, он дает мне -1 вместо размера. В чем проблема?

(код был отредактирован)

3 ответа

Решение

От pycurl документация по объекту Curl:

Метод getinfo не должен вызываться, пока не будет вызвано выполнение и завершено.

Ты звонишь getinfo прежде чем ты позвонил perform,

Вот упрощенная версия вашего примера, это работает?

import pycurl

url = 'http://www.google.com'
c = pycurl.Curl()
c.setopt(c.URL, url)
c.perform()
print c.getinfo(c.CONTENT_LENGTH_DOWNLOAD)

Вы должны увидеть содержимое HTML, а затем размер.

Этот ответ добавляет недостающие c.setopt(c.NOBODY, 1) и в остальном такой же, как тот, который был дан несколько месяцев назад:

import pycurl

c = pycurl.Curl()
c.setopt(c.URL, 'http://www.alfe.de')
c.setopt(c.NOBODY, 1)
c.perform()
c.getinfo(c.CONTENT_LENGTH_DOWNLOAD)

призвание c.setopt(c.NOBODY, 1) перед звонком c.perform() избегает загрузки содержимого файла ("No Body", но все заголовки).

Попробуйте добавить отладку, чтобы увидеть, что происходит на самом деле. После того, как вы создали curl, сделайте так:

def curl_debug (debug_type, msg):
    print ("debug:% s% s"% (repr (debug_type), repr (msg)))

c.setopt (pycurl.VERBOSE, 1)
c.setopt (pycurl.DEBUGFUNCTION, curl_debug)
Другие вопросы по тегам