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

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

Сценарий 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 
  • Загрузка изображения через urllib и python
  • urllib2 возвращает 404 для веб-сайта, который отлично отображает браузеры
  • urllib2.HTTPError: ошибка HTTP 401 при запросе с использованием нового Bing API (на лазурном рынке)
  • Как вызвать метод urllib2 get_header?
  • Python не может получить форму с urllib или механизировать
  • Python - пример асинхронного / потокового запроса urllib2 с использованием HTTPS
  • открытие сайтов с использованием urllib2 из-за корпоративного брандмауэра - 11004 getaddrinfo не удалось
  • Python urllib2: не может назначить запрошенный адрес
  • Python - лучший язык программирования в мире.