miroslavmirm 07 мая 2020

Как с помощью Python скачать все бесплатные учебники Springer Nature

Короткий туториал о том, как скачать 390 учебников с помощью 10 строчек кода на Python 📕🐍. Список книг содержит издания по математике, статистике, электронике и Computer Science.
3
9670

Издательская компания Springer Nature выложила в открытый доступ более 500 учебников. При помощи скрипта, написанного на Python, мы скачаем все англоязычные книги, указанные в соответствующей таблице Excel.

1. Установка библиотек

Воспользуемся мощью библиотек Python:

  • pandas – обработка и анализ данных.
  • wget – инструмент загрузки файлов.
  • requests – отправка HTTP-запросов.
  • xlrd – обработка экселевских файлов (используется библиотекой pandas).
            pip3 install xlrd pandas wget requests
        

2. Изучение списка учебников

Скачаем таблицу Free+English+textbooks.xlsx, содержащую 390 учебников (все списки и актуальные ссылки находятся здесь). Создадим файл download_textbooks.py и папку download, в которую будут скачиваться файлы.

В таблице Excel нас интересуют столбцы Book Title (название учебника), Edition (год издания) и OpenURL для получения ссылки на скачивание (Рис. 1).

Рис. 1. Столбцы, участвующие в работе скрипта
Рис. 1. Столбцы, участвующие в работе скрипта

Добавим в download_textbooks.py следующие строчки:

Содержимое download_textbooks.py: импорт необходимых модулей, загрузка таблицы эксель в массив pandas и вывод первых десяти строчек массива
            import requests
import wget
import pandas as pd
df = pd.read_excel("Free+English+textbooks.xlsx")
print(df.head(10))

        

Запустим скрипт и получим первые десять строчек из списка (Рис. 2):

Рис. 2. Вывод первых десяти строчек массива pandas
Рис. 2. Вывод первых десяти строчек массива pandas

3. Выбор правильного URL

Напишем цикл для скачивания файлов:

Содержимое download_textbooks.py
            for index, row in df.iterrows():
    file_name = f"{row.loc['Book Title']}_{row.loc['Edition']}"
    url = f"{row.loc['OpenURL']}"
    wget.download(download_url, f"./download/{file_name}.pdf")

        

Неплохо, но работает некорректно: столбец OpenUrl содержит ссылку на страницу с описанием книги, а не на конечный PDF-файл. Рассмотрим подробнее устройство ссылок на сайте издательства:

  • Возьмем какую-нибудь ссылку из столбца OpenUrl, например, http://link.springer.com/openurl?genre=book&isbn=978-0-306-48048-5
  • Она перенаправляет на https://link.springer.com/book/10.1007%2Fb100747
  • На странице есть кнопка для скачивания PDF-файла https://link.springer.com/content/pdf/10.1007%2F0-387-36274-6.pdf

Таким образом, в цикл for нужно добавить 3 шага:

  • Открыть ссылку из столбца OpenURL.
  • Получить перенаправленный URL.
  • Переформатировать структуру строки URL в конечный URL для загрузки PDF-файла.

В итоге код выглядит следующим образом:

Содержимое download_textbooks.py
            import requests, wget
import pandas as pd
df = pd.read_excel("Free+English+textbooks.xlsx")
for index, row in df.iterrows():
        file_name = f"{row.loc['Book Title']}_{row.loc['Edition']}".replace('/','-').replace(':','-')
        url = f"{row.loc['OpenURL']}"
        r = requests.get(url)
        download_url = f"{r.url.replace('book','content/pdf')}.pdf"
        wget.download(download_url, f"./download/{file_name}.pdf")
        print(f"downloading {file_name}.pdf Complete ....")

        

4. Скачивание учебников

Запустим скрипт download_textbooks.py (Рис. 3), откроем папку download и проследим за результатом работы (Рис. 4).

Рис. 3. Пример работы скрипта python, скачивающий файлы из списка Excel
Рис. 3. Пример работы скрипта python, скачивающий файлы из списка Excel
Рис. 4. Скачанные учебники в папке с помощью pandas, wget, requests и xlrd
Рис. 4. Скачанные учебники в папке с помощью pandas, wget, requests и xlrd
***

Вот и всё. Мы освободились от ненужной рутины, автоматизировав процесс скачивания всего за 10 строчек кода, используя библиотеки pandas, wget, requests и xlrd. Приятного чтения!

Источники

РУБРИКИ В СТАТЬЕ

МЕРОПРИЯТИЯ

Комментарии 3

ВАКАНСИИ

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

BUG