Как загрузить несколько больших файлов одновременно в Python?
Я пытаюсь загрузить серию файлов Warc из базы данных CommonCrawl, каждый из которых около 25 МБ. Это мой сценарий:
import json
import urllib.request
from urllib.error import HTTPError
from src.Util import rooted
with open(rooted('data/alexa.txt'), 'r') as alexa:
for i, url in enumerate(alexa):
if i % 1000 == 0:
try:
request = 'http://index.commoncrawl.org/CC-MAIN-2018-13-index?url={search}*&output=json' \
.format(search=url.rstrip())
page = urllib.request.urlopen(request)
for line in page:
result = json.loads(line)
urllib.request.urlretrieve('https://commoncrawl.s3.amazonaws.com/%s' % result['filename'],
rooted('data/warc/%s' % ''.join(c for c in result['url'] if c.isalnum())))
except HTTPError:
pass
В настоящее время он запрашивает ссылку для загрузки файла Warc через CommonCrawl REST API, а затем инициирует загрузку в папку "data / warc".
Проблема в том, что в каждом urllib.request.urlretrieve()
во время вызова программа зависает до тех пор, пока файл не будет полностью загружен, прежде чем выдать следующий запрос на загрузку. Есть ли способ urllib.request.urlretrieve()
Вызов может быть прерван, как только будет начата загрузка, а затем файл, загруженный после, или каким-либо способом раскрутить новую ветку для каждого из этих запросов, и все ли файлы будут загружены одновременно?
Спасибо
1 ответ
Использовать темы, futures
четное:)
jobs = []
with ThreadPoolExecutor(max_workers=100) as executor:
for line in page:
future = executor.submit(urllib.request.urlretrieve,
'https://commoncrawl.s3.amazonaws.com/%s' % result['filename'],
rooted('data/warc/%s' % ''.join(c for c in result['url'] if c.isalnum()))
jobs.append(future)
...
for f in jobs:
print(f.result())
читайте больше здесь: https://docs.python.org/3/library/concurrent.futures.html