С помощью openpyxl (можно конечно pandas, там это элементарно делается) читаете ваш Эксель, затем с помощью цикла и requests качаете файлы, если файлов очень много попробуйте написать асинхронный загрузчик, раз в 10 быстрее будет качать (поможет aiohttp и aiofiles). Ну а для создания папок вам пригодится os
Вот так можно забрать весь столбец из Эксель
import pandas as pd
from glob import glob
file = glob('*.xlsx')[0]
table = pd.read_excel(file)
urls_list = table['Название столбца'].to_list()
А вот пример загрузчика, писал я (на идеальную правильность не претендую, со своей задачей справляется и хорошо)
import asyncio
import os
from os.path import join as pth_join
import aiofiles
import aiohttp
DWNLD_FLDR = "Download"
async def download_file(session: aiohttp.ClientSession, link: str, file_name: str):
async with session.get(link) as resp:
if resp.status == 200:
f = await aiofiles.open(pth_join(DWNLD_FLDR, file_name), "wb")
await f.write(await resp.read())
await f.close()
else:
print(f"Error: {resp.status}")
async def gather_files(files_urls: list[dict]):
async with aiohttp.ClientSession(headers=HEADERS) as session:
tasks = []
for item in files_urls:
try:
if os.stat(pth_join(DWNLD_FLDR, item["file_name"])).st_size:
continue
except FileNotFoundError:
pass
task = asyncio.create_task(
download_file(session, item["file_link"], item["file_name"])
)
tasks.append(task)
await asyncio.gather(*tasks)
def main(file_list):
os.makedirs(DWNLD_FLDR) if not os.path.exists(DWNLD_FLDR) else None
asyncio.run(gather_files(file_list))
if __name__ == "__main__":
main([{'file_name': 'test.txt', 'file_link': 'http://file_url'}, ])