CoderCastrov logo
CoderCastrov
Искусство

Чтение манги с помощью Python

Чтение манги с помощью Python
просмотров
3 мин чтение
#Искусство

Что такое манга?

Манга (漫画, manga) - это комиксы или графические романы, созданные в Японии или на японском языке и соответствующие стилю, развитому в Японии в конце 19 века. У них есть долгая и сложная предыстория в раннем японском искусстве.

давайте скажем, что манга - это японские комиксы, которые более популярны и интересны, чем большинство комиксов главного потока.

Парсинг

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

Чтение манги онлайн легко - вы просто заходите на сайт, например, mangapanda.com, ищете комиксы и читаете их. Но что, если вы хотите загрузить весь комикс, сжать каждую главу в отдельный том и читать его офлайн.

Когда мы заходим на mangapanda.com и ищем определенный комикс, например, naruto, вот к какому URL мы переходим

Обратите внимание на naruto в конце URL. Теперь, если мы перейдем к первой главе naruto, URL преобразуется в [http://www.mangapanda.com/naruto/1](http://www.mangapanda.com/naruto/1) - это замечательно для нас. Обратите внимание, что это не происходит на всех манга-сайтах, поэтому будьте внимательны перед тем, как пытаться парсить любой другой манга-сайт. Мы пытаемся загрузить изображения, которые существуют в главе naruto номер 1.

Давайте напишем небольшую функцию для получения изображения по URL.

Хорошо, что здесь происходит. Для _download_image мы даем URL, скажем, mangapanda.com/naruto/1/3. Согласно нашим наблюдениям, мы загружаем изображение номер 3 главы 1 из naruto. Разберем функцию и поймем, что происходит на каждой строке.

  • requests.get загружает исходный код данного URL
  • преобразуем исходный код html-документа в lxml html-дерево, это помогает нам легко разбирать теги
  • получаем теги с img с id='img', выражение ".//img[@id='img']/@src" гарантирует это
  • после получения URL изображения загружаем изображение с помощью requests.get(URL).content

Загрузка всей главы

Хорошо, что главы имеют формат /глава/номер_страницы, поэтому как мы можем загрузить все изображения определенной главы, если мы не знаем номер последней главы. Если мы знаем номер последней главы, то мы можем просто использовать range и выполнить цикл по номерам изображений для загрузки.

Если мы посмотрим на исходный код, там есть интересный тег.

Там написано, что пользователи могут выбирать номер страницы в виде выпадающего списка. Мы можем использовать формат дерева lxml для этого .//*[@id=’pageMenu’]/option[last()]/text(), чтобы получить последнее вхождение идентификатора pageMenu, которое является последней страницей главы.

Давайте обернем это в небольшую функцию

Теперь, когда мы знаем номера страниц глав, которые мы собираемся загрузить, мы можем просто получить все изображения из главы параллельно, отсортировать их, а затем сжать их в один том.

Давайте используем ThreadPoolExecutor и напишем асинхронную функцию для выполнения следующей задачи.

properties = json.load(open("configs.json"))base_url = properties.get("base_url") + "/" + properties.get("manga_name")

Мы можем определить manga_name и base_url в файле configs.json, чтобы нам не приходилось каждый раз указывать название манги при загрузке главы.

Функция download_chapter создает каталоги на основе manga_name и номера главы

➜  naruto git:(master) ✗ tree
.
└── 1
    ├── 1.jpg
    ├── 10.jpg
    ├── 11.jpg

Теперь, когда мы загрузили все страницы главы, давайте сжимать их в формате CBZ и убедимся, что порядок номеров страниц правильно отсортирован.

Мы можем завернуть все это в классический __main__, чтобы если мы указываем номер главы, мы загружаем всю комикс.


В действии

Мы можем запустить скрипт следующим образом

Отказ от ответственности: это предназначено исключительно для образовательных целей. Не используйте это коммерчески для пиратства или для атак на mangapanda.com