Скачать все файлы в массиве — python

Итак, в настоящее время я пытаюсь загрузить все файлы .png в каталоге определенного веб-сайта. Все имена файлов представляют собой числа от 1 до 311, поэтому я создал массив для 1-311. Я сделал переменную, хранящую URL-адрес и форматирование, чтобы переменная заменялась числом из массива. По какой-то причине он проходит и пытается загрузить каждый отдельный символ URL-адреса и терпит неудачу, он не загружает указанные номера файлов.

import requests
from multiprocessing.pool import ThreadPool
 
def download_url(url):
  print("downloading: ",url.format(*skins))
  # assumes that the last segment after the / represents the file name
  # if url is abc/xyz/file.txt, the file name will be file.txt
  file_name_start_pos = url.rfind("/") + 1
  file_name = url[file_name_start_pos:]
 
  r = requests.get(url.format(*skins), stream=True)
  if r.status_code == requests.codes.ok:
    with open(file_name, 'wb') as f:
      for data in r:
        f.write(data)
  return url.format(*skins)
 
skins = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100', '101', '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', '115', '116', '117', '118', '119', '120', '121', '122', '123', '124', '125', '126', '127', '128', '129', '130', '131', '132', '133', '134', '135', '136', '137', '138', '139', '140', '141', '142', '143', '144', '145', '146', '147', '148', '149', '150', '151', '152', '153', '154', '155', '156', '157', '158', '159', '160', '161', '162', '163', '164', '165', '166', '167', '168', '169', '170', '171', '172', '173', '174', '175', '176', '177', '178', '179', '180', '181', '182', '183', '184', '185', '186', '187', '188', '189', '190', '191', '192', '193', '194', '195', '196', '197', '198', '199', '200', '201', '202', '203', '204', '205', '206', '207', '208', '209', '210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '220', '221', '222', '223', '224', '225', '226', '227', '228', '229', '230', '231', '232', '233', '234', '235', '236', '237', '238', '239', '240',  '241', '242', '243', '244', '245', '246', '247', '248', '249', '250',  '251', '252', '253', '254', '255', '256', '257', '258', '259', '260',  '261', '262', '263', '264', '265', '266', '267', '268', '269', '270',  '271', '272', '273', '274', '275', '276', '277', '278', '279', '280',  '281', '282', '283', '284', '285', '286', '287', '288', '289', '290',  '291', '292', '293', '294', '295', '296', '297', '298', '299', '300',  '301', '302', '303', '304', '305', '306', '307', '308', '309', '310',  '311'] 
url = 'https://test-site.com/skins/{0}.png'
#urls = ["https://test-site.com/skins/*.png"]
 
# Run 5 multiple threads. Each call will take the next element in urls list
for x in skins:
    results = ThreadPool(5).imap_unordered(download_url, url.format(*skins))
    for r in results:
        print(r)

Я думаю, что проблема в url.format(*skins). Это сглаживает весь массив скинов и передает каждый элемент в качестве аргумента url.format. Я думаю, вы намеревались url.format(x).

Oliver Dain 05.04.2023 20:48
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В итоге полностью переделал эту идею с нуля. Этот код работал:

import requests

skins = [str(i) for i in range(1, 312)]
url = 'https://test.com/skins/'

for item in skins:
    filename = item + '.png'
    file_url = url + filename
    try:
        r = requests.get(file_url, allow_redirects=True)
        open(filename, 'wb').write(r.content)
        print(f'{filename} downloaded successfully!')
    except Exception as e:
        print(f'Error downloading {filename}: {e}')

Другие вопросы по теме