用Python抓取漫画并制作mobi格式电子书

  想看某一部漫画,但是用手机看感觉屏幕太小,用电脑看吧有太不方面。正好有一部Kindle,决定写一个爬虫把漫画爬取下来,然后制作成 mobi 格式的电子书放到kindle里面看。

  一、编写爬虫程序

  用Chrome浏览器打开目标网站,按下F12 启动“开发者人员工具”,分析目标网站的代码,看漫画存放的真实地址。现在网站的防护措施都做的很好,基本不会出现“右键”——“图片另存为” 然后保存漫画这种情况的。分析漫画页面 “下一章” 按钮对应的元素,通过使用 Python + selenium + Chrome浏览器 的组合,让爬虫自动化遍历该漫画所有章节并下载漫画:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import requests
import os



def mkdir(path):
    '''
    防止目录存在
    :param path:
    :return:
    '''
    if not os.path.exists(path):
        os.mkdir(path)


def SavePic(filename,url):
    '''
    图片的保存
    :param filename: 
    :param url: 
    :return: 
    '''
    content = requests.get(url).content
    with open(filename,'wb') as f:
        f.write(content)

def get_TOF(index_url):
    url_list = []
    chrome_options = Options()
    chrome_options.add_argument('--headless')#启用Chrome浏览器“无头模式”,提高抓取速率
    browser = webdriver.Chrome(chrome_options=chrome_options)    
    browser.get(index_url)
    browser.implicitly_wait(3)

    title = browser.title.split(',')[0]#获取漫画标题
    mkdir(title)#创建目录

    comics_lists = browser.find_elements_by_class_name('comic_Serial_list')#找到漫画章节
    for part in comics_lists:#找到每一章节所在的标签信息
        links = part.find_elements_by_tag_name('a')
        for link in links:
            url_list.append(link.get_attribute('href'))#获取每个单独章节链接
    browser.quit()
    Comics = {'name':title,'urls':url_list}
    return Comics

def get_pic(Comics):
    comic_list = Comics['urls']
    basedir = Comics['name']
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    browser = webdriver.Chrome(chrome_options=chrome_options)    for url in comic_list:
        browser.get(url)
        browser.implicitly_wait(3)
        dirname = basedir+'/'+browser.title.split('-')[1]
        mkdir(dirname)
        #找到漫画一共有多少页
        pageNum = len(browser.find_elements_by_tag_name('option'))
        #找到下一页按钮
        nextpage = browser.find_element_by_xpath('//*[@id="AD_j1"]/div/a[4]')
        for i in range(pageNum):
            pic_url = browser.find_element_by_id('curPic').get_attribute('src')
            filename = dirname+'/'+str(i)+'.png'
            SavePic(filename,pic_url)
            nextpage.click()
        print('当前章节\t{}  下载完毕'.format(browser.title))
    browser.quit()
    print('所有章节下载完毕!')


if __name__ == '__main__':
    url = str(input('请输入漫画首页地址:\n'))
    Comics = get_TOF(url)
    
#print(Comics)
    get_pic(Comics)

 

  二、整理文件夹顺序

  漫画下载完之后,按照章节顺序将漫画的文件夹排列好。确保 “按文件夹名称排列” 得到的顺序和漫画章节顺序相同。(这里可以用Python写一个重命名脚本或者用文件夹批量命名软件来完成),方便电子书的制作。

  

  三、制作电子书

  这里使用软件 Kindle Comic Converter (具体用法可见 https://bookfere.com/post/164.html )来制作。需要注意的是,Kindle Comic Converter 生成 MOBI 文件依赖 KindleGen,如果没有找到的话,在安装完成以及运行时都会有提示。请点击这里 ( https://bookfere.com/tools#KindleGen )下载 KindleGen 并放到相应位置:Windows 系统把 kindlegen.exe 放到 KCC 安装目录中;Mac OS X 下需要把 kindlegen 程序放置到路径“/usr/local/bin”下。再继续进行转换步骤。

   另外,网上说的制作过程是

  1. 把所有图片集中在一个文件夹内;
  2. 点击【Add directory】把文件夹添加到列表[注1]
  3. 选择 Kindle 设备型号、输出格式(可选 MOBI、EPUB 和 CBZ);
  4. 根据需要添加参数,如“Horizontal mobi(横屏模式)”等;
  5. 点击【Convert】开始转换。生成的电子书文件和所添加文件夹在同一目录。

  【后记】

  经我测试,最方便的做法是不把所有图片集中在一个文件夹。而是在 “三、制作电子书” 的步骤1 中,按照以下方式进行处理:建立一个《'漫画名字'》文件夹,然后这个文件夹下是类似“第1章”  “第2章”……等文件夹。然后每个章节文件夹里面放入按顺序存放的漫画图片。(具体排序要求参见本文的 “二、整理文件夹顺序” )。然后点击【Add directory】把《'漫画名字'》文件夹添加到列表,再进行转换,这样转换出来的电子书就带有目录和书签效果了!

  请注意版权!仅供自己的编程学习与测试,不要将制作好的mobi电子书进行传播,更不要牟利!尊重原作和内容提供商!

posted @ 2018-07-27 14:45  Stuxnet  阅读(2843)  评论(0编辑  收藏