懒人的漫画下载工具[基本能用版]
这个网站的防盗链不够强大,添加一个伪造的http referer header就可以了。
但是图片的URL不是特别规范(有好多种),为了省事就采用顺藤摸瓜的办法了——先访问目录页得到章节URL,然后再依次访问各图片页面(本来只需要访问第一张图片页就可以推出后面页码的,但是我发现图片URL命名风格很多种,可能是手动添加的原因吧)。
基本上都用的是标准模块,win xp sp2,py 2.5通过(家里的电脑只有windows……)
使用方法:
python source comicurl comicname
(保存路径为固定的D:\comic,因为我自己写的config和log都在寝室电脑,现在也不想去重复劳动)
贴代码:
#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
懒人的漫画下载工具[基本能用版]相关推荐
- cad小插件文字刷_小懒人CAD插件管理工具
小懒人cad插件管理工具是一款CAD插件管理软件,可以帮助用户管理CAD插件,不需要单个安装,支持一键加载,小懒人CAD插件管理软件不需要安装,下载即可使用.有需要的小伙伴欢迎来西西下载. 软件特征: ...
- 迅雷漫画下载工具II 故障日志09.04.12
博客上很多的同学都来反映说是程序一打开就自动停止工作,经过分析发现程序出错很有可能发生在自动更新的过程中. 于是趁着返回学校前的十几分钟,决定抓虫试试. 根据网友们的反映,前几天尚未出现故障,说明软件 ...
- (IDM)史上最快的多线程下载工具,绿色稳定版
应用简介 最快的下载器,没有之一!!!多线程下载文件从而提升下载速度,最大支持32线程,还可以自动嗅探下载网页视频,配合脚本还可以实现百度网盘不限速下载,超级牛逼. Internet Download ...
- 懒人长尾词挖掘工具,适合懒人的3个长尾词挖掘工具
适合"懒人"的.操作简单的.挖掘速度较快的3个长尾词挖掘工具: 1.IIS7长尾词挖掘工具 IIS7长尾关键词挖掘工具提供在线挖掘长尾词.关键词.操作简单,可以看到挖词进度 ...
- 京东商品图片下载工具1.0 springboot版
说明:需要JAVA环境,自己安装,不会?百度:jdk安装 下载图片全部高清原图,这种工具网上都是收费的 傻瓜式点击一键启动.bat 加载完毕即可使用 浏览器访问 http://127.0.0.1:16 ...
- 恢复IE为默认下载工具
有的人的默认下载工具可能是迅雷,但有时下载一个小文件想使用IE的原始下载功能时,不知该如何恢复. 步骤 1:打开迅雷,点击配置-监视,去掉浏览器复选框. 2.IE的工具-管理加载项-工具栏和扩展里 t ...
- 一看就会,Intel 芯片的Mac电脑PD虚拟机懒人win10和win11安装教程
Parallels Desktop虚拟机破解版如何快速安装Win系统,Intel mac如何快速安装Win+虚拟机.为大家带来Parallels Desktop虚拟机破解版如何安装win系统教程. 请 ...
- 小 V 视频号下载工具(可下载所有视频号中的视频+公众号中的部分视频、音频)
这个视频下载软件名叫小 V 视频号下载工具,为PC版,所以得用微信PC版配合操作. 如何下载微信视频号中的视频 使用小 V 视频号下载工具来下载视频非常的简单,只需轻松两步即可下载视频. 首先我们在微 ...
- Mac多线程下载工具Neat Download Manager Mac免费版
Neat Download Manager Mac版是Mac上一款免费好用的多线程下载工具.NeatDownloadManager Mac版使用动态分段算法下载文件,支持HTTP,HTTPS和FTP协 ...
最新文章
- 架构师之路 — 分布式系统 — CAP 定理
- Android edittext 属性inputtype详解
- 【C 语言】数组 ( 验证二维数组内存是线性的 | 打印二维数组 | 以一维数组方式打印二维数组 | 打印二维数组值和地址 )
- C#——《C#语言程序设计》实验报告——继承与多态——电视和电灯委托
- 自定义设置一个屏保程序
- 双11过后张勇感谢快递小哥:再大的纪录都是靠大协作来完成的
- Python爬取千条相亲数据,看看单身率90%的中国男女都在挑剔什么
- C#中Abstract和Virtual
- 优化UITableViewCell高度计算的那些事
- ie6和W3C的盒子模型
- Hibernate中创建Session(会话)接口的方法
- 教材寻找 下载系列1
- Java常见设计模式
- VM技术(一)NES模拟器VM综述
- TS + vue3.2 + vite2 + element-plus 通用弹框组件封装
- 如何在简历中使用STAR法则
- dede织梦后台页面及功能修改及精简操作方法
- plt.legend 图例放在外面 子图会挤在一起 子图压缩 压扁
- java的深浅拷贝_Java中深浅拷贝
- 科林明伦杯哈尔滨理工大学第八届程序设计竞赛——Hrbust-2378 小H的问题(模拟)
热门文章
- exp00091 oracle,EXP-00091错误的说明和解决方法
- 第77届奥斯卡金像奖完全获奖名单 [附完全提名名单]
- HTML个人简历表制作
- flow hive 新型蜂箱_流动的蜂蜜盛宴:Flow Hive蜂箱获数百万美元众筹款
- ZOJ 3380 Patchouli's Spell Cards
- C/C++中的指针*是靠近数据类型还是靠近数据变量书写?
- 转载--文章(感谢陈晨博主分享) 关于 Json.net
- 字母不同类型_只是我的类型跟踪字母的演变,第2部分
- SharedPreferences 使用方法详解
- 【持续更新】SDN Software Defined Networks(Thomas D.Nadeau Ken Gray)翻译