Многопоточность для более быстрой загрузки

Как загрузить несколько ссылок одновременно? Мой скрипт ниже работает, но загружает только по одному, и он очень медленный. Я не могу понять, как включить многопоточность в мой скрипт.

Сценарий Python:

from BeautifulSoup import BeautifulSoup import lxml.html as html import urlparse import os, sys import urllib2 import re print ("downloading and parsing Bibles...") root = html.parse(open('links.html')) for link in root.findall('//a'): url = link.get('href') name = urlparse.urlparse(url).path.split('/')[-1] dirname = urlparse.urlparse(url).path.split('.')[-1] f = urllib2.urlopen(url) s = f.read() if (os.path.isdir(dirname) == 0): os.mkdir(dirname) soup = BeautifulSoup(s) articleTag = soup.html.body.article converted = str(articleTag) full_path = os.path.join(dirname, name) open(full_path, 'w').write(converted) print(name) 

HTML-файл с именем links.html :

 <a href="http://www.youversion.com/bible/gen.1.nmv-fas">http://www.youversion.com/bible/gen.1.nmv-fas</a> <a href="http://www.youversion.com/bible/gen.2.nmv-fas">http://www.youversion.com/bible/gen.2.nmv-fas</a> <a href="http://www.youversion.com/bible/gen.3.nmv-fas">http://www.youversion.com/bible/gen.3.nmv-fas</a> <a href="http://www.youversion.com/bible/gen.4.nmv-fas">http://www.youversion.com/bible/gen.4.nmv-fas</a> 

2 Solutions collect form web for “Многопоточность для более быстрой загрузки”

Мне кажется, что проблема потребителя – производителя – см. Wikipedia

Вы можете использовать

 import Queue, thread # create a Queue.Queue here queue = Queue.Queue() print ("downloading and parsing Bibles...") root = html.parse(open('links.html')) for link in root.findall('//a'): url = link.get('href') queue.put(url) # produce def thrad(): url = queue.get() # consume name = urlparse.urlparse(url).path.split('/')[-1] dirname = urlparse.urlparse(url).path.split('.')[-1] f = urllib2.urlopen(url) s = f.read() if (os.path.isdir(dirname) == 0): os.mkdir(dirname) soup = BeautifulSoup(s) articleTag = soup.html.body.article converted = str(articleTag) full_path = os.path.join(dirname, name) open(full_path, 'wb').write(converted) print(name) thread.start_new(thrad, ()) # start 1 threads 

Я использую multiprocessing для распараллеливания вещей – по какой-то причине мне это нравится лучше, чем threading

 from BeautifulSoup import BeautifulSoup import lxml.html as html import urlparse import os, sys import urllib2 import re import multiprocessing print ("downloading and parsing Bibles...") def download_stuff(link): url = link.get('href') name = urlparse.urlparse(url).path.split('/')[-1] dirname = urlparse.urlparse(url).path.split('.')[-1] f = urllib2.urlopen(url) s = f.read() if (os.path.isdir(dirname) == 0): os.mkdir(dirname) soup = BeautifulSoup(s) articleTag = soup.html.body.article converted = str(articleTag) full_path = os.path.join(dirname, name) open(full_path, 'w').write(converted) print(name) root = html.parse(open('links.html')) links = root.findall('//a') pool = multiprocessing.Pool(processes=5) #use 5 processes to download the data output = pool.map(download_stuff,links) #output is a list of [None,None,...] since download_stuff doesn't return anything 
  • Urllib2 & BeautifulSoup: Хорошая пара, но слишком медленная - urllib3 и темы?
  • Загрузка файла в Python
  • Устройство urllib2, которое не соответствует кодировке
  • Я загружаю файл, используя Python urllib2. Как проверить размер файла?
  • Как отладить запрос urllib2, который использует базовый обработчик проверки подлинности
  • Открытие фрейма сайта или изображения в python
  • Загрузка видео в формате flv с youtube.
  • AppEngine urlfetch validate_certificate = False / Нет, не соблюдается
  • Проблема с большими запросами: GET не выпускает / не перезапускает TCP-соединения, сбои цикла
  • Как аутентифицировать скрипт urllib2 для доступа к веб-службам HTTPS с сайта Django?
  • Используя модуль certifi с urllib2?
  • Python - лучший язык программирования в мире.