Чтение манги с помощью 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