从http://mh.jumpcn.com/上下载漫画。
这个网站的防盗链不够强大,添加一个伪造的http referer header就可以了。
但是图片的URL不是特别规范(有好多种),为了省事就采用顺藤摸瓜的办法了——先访问目录页得到章节URL,然后再依次访问各图片页面(本来只需要访问第一张图片页就可以推出后面页码的,但是我发现图片URL命名风格很多种,可能是手动添加的原因吧)。
基本上都用的是标准模块,win xp sp2,py 2.5通过(家里的电脑只有windows……)
使用方法:
python source comicurl comicname
(保存路径为固定的D:\comic,因为我自己写的config和log都在寝室电脑,现在也不想去重复劳动)

贴代码:

#!/usr/bin/env python
#coding=cp936
import urllib,httplib,os,re,sys
from sgmllib import SGMLParser
from urlparse import urlparse
'''
    chuan's comic robot
    '''
comicpath = 'D:\\comic'

'''class SaveLog(object):
    "SaveLog for 'The break point continues the biography ' "
    def __init__(self,path):
        self.f = open(os.path.join(path,'save.log'),'r')'''

class IndexLister(SGMLParser):
    "parser comic chapters"
    def reset(self):                              
        SGMLParser.reset(self)
        self.cpturl = []

def start_a(self, attrs):
        item = []
        if len(attrs) > 2 and attrs[2][0] == 'title' and attrs[0][1].find('/1.html') > 0:
            item = [attrs[0][1],attrs[2][1]]
        if item:
            self.cpturl.append(item)

class ChapterLister(SGMLParser):
    "parser chapter infomation"
    def reset(self):                              
        SGMLParser.reset(self)
        self.pagenum = 0
    
    def start_option(self, attrs):
        # get page num
        if attrs[0][0] == 'value' and attrs[0][1].isdigit() and int(attrs[0][1]) > self.pagenum:
            self.pagenum = int(attrs[0][1])

class PicParser(object):
    "get picture location"
    def __init__(self):
        self.re = re.compile("<td><a href=\"(.+)\"><img src=\"(.+)\" alt=\"(.+)\" border=\"0\" /></a></td>")
    
    def parser(self, attrs):
        self.result = self.re.findall(attrs)
        if self.result:
            return self.result[0][1]
        else:
            return None

class Comic(object):
    "Comic object"
    def __init__(self,url,name='未命名'):
        self.url = url
        self.chaptercnt = 0
        self.idxLister = IndexLister()
        self.chapters = []
        self.currentchapter = None
        self.path = os.path.join(comicpath,name)
        self.makedir()
        
    def save(self,path):
        pass
    def getchapter(self):
        self.idxLister.feed(urllib.urlopen(self.url).read())
        for item in self.idxLister.cpturl:
            self.chapters.append(Chapter(item[0],self.path,item[1]))
    def go(self):
        pass
        #for item in self.chapters:
        #    item.savepic()
    def makedir(self):
        try:
            if not os.path.isdir(self.path):
                os.makedirs(self.path)
        except  Exception, e:
            pass

class Chapter(object):
    "parser,get,save picture sort by chapter"
    def __init__(self,url = '',path = '',name='未知章节'):
        self.url = url
        self.cptLister = ChapterLister()
        self.pic = PicParser()
        self.name = name
        self.pagenum = 0
        self.content = None
        self.picurllist = []
        self.chapterurllist = []
        self.path = os.path.join(path,name)
        
        self.makedir()
        self.getchapternum()
        self.initchapterurl()
        self.getpicurl()
        self.savepic()
        
    def makedir(self):
        try:
            if not os.path.isdir(self.path):
                os.makedirs(self.path)
        except  Exception, e:
            pass
        
    def initchapterurl(self):
        if self.pagenum:
            self.chapterurllist.append(self.url)
            urlhead = self.url[0:-6]
            urltail = self.url[-5:]
            for i in range(2,self.pagenum):
                self.chapterurllist.append(urlhead+str(i)+urltail)
    
    def getpicurl(self):
        if self.pagenum:
            for item in self.chapterurllist:
                self.picurllist.append(self.pic.parser(urllib.urlopen(item).read()))
            
    def savepic(self):
        for i in self.picurllist:
            if os.path.isfile(os.path.join(self.path,i[i.rfind('/')+1:])):
                print i,'exist abort.'
                continue
            url = urlparse(i)
            con = httplib.HTTPConnection(url.hostname)
            con.putrequest('GET',url.path)
            con.putheader('Referer',i)
            con.endheaders()
            r = con.getresponse()
            f = open(os.path.join(self.path,i[i.rfind('/')+1:]),'wb')
            content = r.read()
            f.write(content)
            f.close()
            print 'save',i,'done.'

def getchapternum(self):
        self.content = urllib.urlopen(self.url).read()
        if self.content:
            self.cptLister.feed(self.content)
            self.pagenum = self.cptLister.pagenum
            # print debug info
            print self.cptLister.pagenum,'页',self.name
        else:
            print 'get %s pageinfo fail.' % self.name
    def picparser(self,picurl):
        pass

if __name__ == '__main__':
    if len(sys.argv) != 3:
        print 'usage: [python] [this] [url] [name]'
    else:
        try:
            #mycomic = Comic("http://mh.jumpcn.com/comic-book/708/","史上最强弟子兼一")
            mycomic = Comic(sys.argv[1],sys.argv[2])
            mycomic.getchapter()
            mycomic.go()
        except  Exception, e:
            print e

下载(有严重错误,停止下载)
ccr.py

2008年2月1日更新:发现一个重大BUG,111行应为
for i in range(2,self.pagenum+1):
否则每一章会少一页。
2008年2月6日更新:另一个BUG,最后一页的正则抓取与前面页数不一样,修改见第二版。

转载于:https://www.cnblogs.com/melorain/archive/2008/01/31/1059540.html

懒人的漫画下载工具[基本能用版]相关推荐

  1. cad小插件文字刷_小懒人CAD插件管理工具

    小懒人cad插件管理工具是一款CAD插件管理软件,可以帮助用户管理CAD插件,不需要单个安装,支持一键加载,小懒人CAD插件管理软件不需要安装,下载即可使用.有需要的小伙伴欢迎来西西下载. 软件特征: ...

  2. 迅雷漫画下载工具II 故障日志09.04.12

    博客上很多的同学都来反映说是程序一打开就自动停止工作,经过分析发现程序出错很有可能发生在自动更新的过程中. 于是趁着返回学校前的十几分钟,决定抓虫试试. 根据网友们的反映,前几天尚未出现故障,说明软件 ...

  3. (IDM)史上最快的多线程下载工具,绿色稳定版

    应用简介 最快的下载器,没有之一!!!多线程下载文件从而提升下载速度,最大支持32线程,还可以自动嗅探下载网页视频,配合脚本还可以实现百度网盘不限速下载,超级牛逼. Internet Download ...

  4. 懒人长尾词挖掘工具,适合懒人的3个长尾词挖掘工具

    适合"懒人"的.操作简单的.挖掘速度较快的3个长尾词挖掘工具: 1.IIS7长尾词挖掘工具     IIS7长尾关键词挖掘工具提供在线挖掘长尾词.关键词.操作简单,可以看到挖词进度 ...

  5. 京东商品图片下载工具1.0 springboot版

    说明:需要JAVA环境,自己安装,不会?百度:jdk安装 下载图片全部高清原图,这种工具网上都是收费的 傻瓜式点击一键启动.bat 加载完毕即可使用 浏览器访问 http://127.0.0.1:16 ...

  6. 恢复IE为默认下载工具

    有的人的默认下载工具可能是迅雷,但有时下载一个小文件想使用IE的原始下载功能时,不知该如何恢复. 步骤 1:打开迅雷,点击配置-监视,去掉浏览器复选框. 2.IE的工具-管理加载项-工具栏和扩展里 t ...

  7. 一看就会,Intel 芯片的Mac电脑PD虚拟机懒人win10和win11安装教程

    Parallels Desktop虚拟机破解版如何快速安装Win系统,Intel mac如何快速安装Win+虚拟机.为大家带来Parallels Desktop虚拟机破解版如何安装win系统教程. 请 ...

  8. 小 V 视频号下载工具(可下载所有视频号中的视频+公众号中的部分视频、音频)

    这个视频下载软件名叫小 V 视频号下载工具,为PC版,所以得用微信PC版配合操作. 如何下载微信视频号中的视频 使用小 V 视频号下载工具来下载视频非常的简单,只需轻松两步即可下载视频. 首先我们在微 ...

  9. Mac多线程下载工具Neat Download Manager Mac免费版

    Neat Download Manager Mac版是Mac上一款免费好用的多线程下载工具.NeatDownloadManager Mac版使用动态分段算法下载文件,支持HTTP,HTTPS和FTP协 ...

最新文章

  1. 架构师之路 — 分布式系统 — CAP 定理
  2. Android edittext 属性inputtype详解
  3. 【C 语言】数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )
  4. C#——《C#语言程序设计》实验报告——继承与多态——电视和电灯委托
  5. 自定义设置一个屏保程序
  6. 双11过后张勇感谢快递小哥:再大的纪录都是靠大协作来完成的
  7. Python爬取千条相亲数据,看看单身率90%的中国男女都在挑剔什么
  8. C#中Abstract和Virtual
  9. 优化UITableViewCell高度计算的那些事
  10. ie6和W3C的盒子模型
  11. Hibernate中创建Session(会话)接口的方法
  12. 教材寻找 下载系列1
  13. Java常见设计模式
  14. VM技术(一)NES模拟器VM综述
  15. TS + vue3.2 + vite2 + element-plus 通用弹框组件封装
  16. 如何在简历中使用STAR法则
  17. dede织梦后台页面及功能修改及精简操作方法
  18. plt.legend 图例放在外面 子图会挤在一起 子图压缩 压扁
  19. java的深浅拷贝_Java中深浅拷贝
  20. 科林明伦杯哈尔滨理工大学第八届程序设计竞赛——Hrbust-2378 小H的问题(模拟)

热门文章

  1. exp00091 oracle,EXP-00091错误的说明和解决方法
  2. 第77届奥斯卡金像奖完全获奖名单 [附完全提名名单]
  3. HTML个人简历表制作
  4. flow hive 新型蜂箱_流动的蜂蜜盛宴:Flow Hive蜂箱获数百万美元众筹款
  5. ZOJ 3380 Patchouli's Spell Cards
  6. C/C++中的指针*是靠近数据类型还是靠近数据变量书写?
  7. 转载--文章(感谢陈晨博主分享) 关于 Json.net
  8. 字母不同类型_只是我的类型跟踪字母的演变,第2部分
  9. SharedPreferences 使用方法详解
  10. 【持续更新】SDN Software Defined Networks(Thomas D.Nadeau Ken Gray)翻译