2014-01-17 4 views
4

Есть ли способ улучшить скорость загрузки URL-адреса на Python?Загрузка python чрезвычайно медленная

У меня есть программа, которую я написал в VB6, которая курит Python, не пытаясь. Я переработал эту вещь, и сейчас я ее пробовал, и в Python (linux) ситуация выглядит намного медленнее, вдвое длиннее. Даже начальная версия программы показалась, что она занимала больше времени, чем то, что я использовал для нее, принимая Windows.

Я пробовал использовать как urllib (2.7), urllib.request (3.3), так и requests. В настоящее время я пытаюсь использовать urllib3, и это не так быстро. То, что обычно занимает 45 минут в Windows, похоже, что для выполнения одной и той же задачи на одном компьютере на одном и том же интернет-соединении потребуется около двух часов. Задача - просто искать в Интернете и загружать файлы, когда поиск находит то, что он ищет ... просто диапазон потенциальных имен файлов.

Я также спрошу, так как это произошло более одного раза до сегодняшнего дня, как мне обнаружить код ошибки 110 (время ожидания подключения). То, что я использую ниже, не работает, и оно все еще убило программу.

import urllib3 

http = urllib3.PoolManager() 

def dl_10(self): 
     self.NxtNum10 = int(self.HiStr10) 
     while self.NxtNum10 < int(self.HiStr10)+9999: 
       url = 'http://www.example.com/videos/encoded/'+str(self.NxtNum10)+'.mp4' 
       r = http.request('GET', url) 
       if r.status==404: 
         self.NxtNum10 +=1 
         continue 
       elif r.status==110: 
         continue 
       else: 
         urllib.request.urlretrieve(url,str(self.NxtNum10)+'_1.mp4') 
         statinfo = os.stat(str(self.NxtNum10)+'_1.mp4') 
         if statinfo.st_size<10000: 
           os.remove(str(self.NxtNum10)+'_1.mp4') 
         else: 
           self.End10 = self.NxtNum10 
       self.NxtNum10 +=1 

     self.counter +=1 
     self.NxtNum10 = 'FINISHED' 

Это выполняется через потоки, я бы не подумал, что это должно иметь значение. Как я уже сказал, начальная запись с использованием urllib (2.7) тоже была медленной, и она не использовала потоки. Я просто запускал программу 10 раз, как и всегда в Windows.

Есть ли более быстрый способ захвата материала из Интернета с помощью Python?

+1

Вы говорите об общем времени, или индивидуальное время? Мне кажется, что вы загружаетесь последовательно, а не параллельно. – Keith

+0

У меня есть 10 отдельных треков через 10 000 файлов последовательно. Каждая программа в Windows (VB6) обычно занимает 45-50 минут, чтобы завершить полный цикл (со всеми 10 запущенными одновременно). В linux/Python за один час я смог получить только более 3000 файлов на поток. Поэтому почему меня шокирует отсутствие скорости. Единственное, что изменилось, - это Windows для Linux и VB6 для Python. Все остальное - то же самое. Вчера вечером я собирался попробовать Python в Windows. Мне надоело пытаться установить модули и сдаться. Linux лучше подходит для использования Python. – confused

+0

Да, я вижу из вашего стиля, что вы более знакомы с VB. ;) Я не могу сказать, что здесь происходит, но вы можете попробовать pycurl (оболочка python для libcurl). – Keith

ответ

3

Я считаю, что вместо того, чтобы использовать urlretrieve непосредственно, используя следующий метод гораздо быстрее:

resp = urllib2.urlopen(url) 
respHtml = resp.read() 
binfile = open(filename, "wb") 
binfile.write(respHtml) 
binfile.close() 

Для записи файлов directly.Hope это может помочь

+0

Так так быстро !!!!!! Я не могу в это поверить! WoW ~~~ – partida

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