想看某一部漫画,但是用手机看感觉屏幕太小,用电脑看吧有太不方面。正好有一部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)