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

Table Of Content
Что такое манга?
Манга (漫画, 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
