init
This commit is contained in:
commit
499cb29fa3
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
COMICOUT/
|
||||||
|
**/__pycache__/**
|
||||||
72
main.py
Normal file
72
main.py
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
from utils.HtmlUtils import htmlUtils
|
||||||
|
from utils.comic.ComicStr import comicStr
|
||||||
|
from utils.FileUtils import fileUtils
|
||||||
|
import json,os
|
||||||
|
from utils.NetUtils import netUtils
|
||||||
|
from utils.ImageUtils import imageUtils
|
||||||
|
from utils.ComicUtils import comicUtils
|
||||||
|
|
||||||
|
comic_chapter_path = "COMICOUT"
|
||||||
|
|
||||||
|
def oneComic(c_url):
|
||||||
|
global comic_chapter_path
|
||||||
|
# #漫画名
|
||||||
|
data = htmlUtils.xpathData(comicStr.result,
|
||||||
|
'//script[@id="__NEXT_DATA__"]/text()',url=c_url)
|
||||||
|
# #
|
||||||
|
data = json.loads(data[0])
|
||||||
|
data = data.get("props")
|
||||||
|
data = data.get("pageProps")
|
||||||
|
print(data)
|
||||||
|
fileUtils.saveConfComicChapterInfo("1話 親子餐廳的媽媽們",data,"親子餐廳的媽媽們")
|
||||||
|
x = fileUtils.getInfoConfComicChapter("1話 親子餐廳的媽媽們","親子餐廳的媽媽們")
|
||||||
|
bookName = x.get("bookName")
|
||||||
|
alias = x.get("alias")
|
||||||
|
chapterName = x.get("chapterName")
|
||||||
|
description = x.get("description")
|
||||||
|
images = x.get("images")
|
||||||
|
chapterAPIPath = x.get("chapterAPIPath")
|
||||||
|
print(chapterAPIPath)
|
||||||
|
if not chapterAPIPath == None:
|
||||||
|
base_url = comicUtils.getBaseUrl(c_url)
|
||||||
|
chapterAPIUrl = base_url+chapterAPIPath
|
||||||
|
data = htmlUtils.getJSON(chapterAPIUrl)
|
||||||
|
data = data.get("chapter")
|
||||||
|
chapterName = data.get("name")
|
||||||
|
images = data.get("images")
|
||||||
|
print("test")
|
||||||
|
if images == None:
|
||||||
|
print("fsf")
|
||||||
|
totalChapter = x.get("totalChapter")
|
||||||
|
tags = x.get("tags")
|
||||||
|
x = tags
|
||||||
|
print(x)
|
||||||
|
count_image = 1
|
||||||
|
list_img = []
|
||||||
|
list_scramble = []
|
||||||
|
for image in images:
|
||||||
|
image_src = image.get("src")
|
||||||
|
scramble = image.get("scramble")
|
||||||
|
print("count=",count_image)
|
||||||
|
list_img.append(image_src)
|
||||||
|
list_scramble.append(scramble)
|
||||||
|
print(image_src)
|
||||||
|
print(scramble)
|
||||||
|
count_image+=1
|
||||||
|
print(count_image)
|
||||||
|
print(list_img)
|
||||||
|
print(totalChapter)
|
||||||
|
netUtils.downloadComicChapterImages(bookName,chapterName,list_img,scrambles=list_scramble)
|
||||||
|
comic_chapter_path = os.path.join("COMICOUT",bookName,chapterName)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
oneComic("https://rm01.xyz/books/f08668a4-0cbc-488e-95a7-3c71de0c7a31/23")
|
||||||
|
# oneComic()
|
||||||
|
# path = "COMICOUT\好友的私生活\第1話 好友的私生活"
|
||||||
|
path = comic_chapter_path
|
||||||
|
dirs = os.listdir(path)
|
||||||
|
for dir in dirs:
|
||||||
|
isScramble = str(dir).startswith("scramble=")
|
||||||
|
if isScramble:
|
||||||
|
c_path = os.path.join(path, dir)
|
||||||
|
imageUtils.getScrambleImage(c_path)
|
||||||
88
utils/ComicUtils.py
Normal file
88
utils/ComicUtils.py
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
from fake_useragent import UserAgent
|
||||||
|
import requests, os, shutil,re,json
|
||||||
|
from lxml import html
|
||||||
|
from utils.comic.ComicStr import comicStr
|
||||||
|
from utils.FileUtils import fileUtils
|
||||||
|
|
||||||
|
class comicUtils:
|
||||||
|
comic_title = None
|
||||||
|
temp_url = ""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setKeyValue(cls,name, c_value,bool_list=None):
|
||||||
|
count = 0
|
||||||
|
len_value = len(c_value)
|
||||||
|
if bool_list:
|
||||||
|
count += 1
|
||||||
|
if cls.comics.get(count) == None:
|
||||||
|
cls.comics[count] = {name: c_value}
|
||||||
|
else:
|
||||||
|
cls.comics[count].update({name: c_value})
|
||||||
|
else:
|
||||||
|
for x in range(0, len_value):
|
||||||
|
value = c_value[x]
|
||||||
|
count += 1
|
||||||
|
if cls.comics.get(count) == None:
|
||||||
|
cls.comics[count] = {name: value}
|
||||||
|
else:
|
||||||
|
cls.comics[count].update({name: value})
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def listImgDownload(cls,save_dir_name, links):
|
||||||
|
print("save_dir_name:", save_dir_name)
|
||||||
|
print("list_link:", links)
|
||||||
|
len_links = len(links)
|
||||||
|
count = 1
|
||||||
|
for link in links:
|
||||||
|
print("link:",count,":", link)
|
||||||
|
file_cout = ("{:0>3d}".format(count))
|
||||||
|
file_path = os.path.join("Comic", save_dir_name,str(file_cout)+".jpg")
|
||||||
|
netUtils.download(link, file_path)
|
||||||
|
count += 1
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def downloadComic(cls,comic_name):
|
||||||
|
comic = fileUtils.read_comic(comic_name)
|
||||||
|
list_img = comic.get(comicStr.list_img)
|
||||||
|
len_list_img = len(list_img)
|
||||||
|
icon = comic.get(comicStr.icon)
|
||||||
|
for x in range(0, len_list_img):
|
||||||
|
chapter_img = list_img[x]
|
||||||
|
keys = chapter_img.keys()
|
||||||
|
for key in keys:
|
||||||
|
if not icon == None:
|
||||||
|
icon = netUtils.downloadComicIcon(comic_name,key,icon)
|
||||||
|
else:
|
||||||
|
print("icon已跳过")
|
||||||
|
netUtils.downloadComicChapterImages(comic_name, key, chapter_img[key])
|
||||||
|
|
||||||
|
'''
|
||||||
|
传入 comic_name读取配置文件中的各类信息
|
||||||
|
输出 "ComicInfo.xml" 并将图片打包成CBZ
|
||||||
|
'''
|
||||||
|
@classmethod
|
||||||
|
def packComicCBZ(cls,comic_name):
|
||||||
|
data = fileUtils.read_comic(comic_name)
|
||||||
|
title = data.get(comicStr.title)
|
||||||
|
author = data.get(comicStr.author)
|
||||||
|
author = str(author).replace("/",",").replace(" ","")
|
||||||
|
dep = data.get(comicStr.dep)
|
||||||
|
chapters = data.get(comicStr.chapters)
|
||||||
|
tags = "韩漫"
|
||||||
|
c_publisher = "韩漫"
|
||||||
|
print("title:", title,"author=",author,"dep=",dep,"chapters:",chapters)
|
||||||
|
for chapter in chapters:
|
||||||
|
CBZUtils.writeComicInfoXML(title, chapter, dep, author,
|
||||||
|
tags, c_publisher)
|
||||||
|
CBZUtils.packComicCBZ(title,chapter)
|
||||||
|
|
||||||
|
'''
|
||||||
|
获取网站主页
|
||||||
|
'''
|
||||||
|
@classmethod
|
||||||
|
def getBaseUrl(cls,url):
|
||||||
|
num = 3
|
||||||
|
index = 0
|
||||||
|
for x in range(0, num):
|
||||||
|
index = str(url).find("/",index)+1
|
||||||
|
return url[0:index-1]
|
||||||
77
utils/FileUtils.py
Normal file
77
utils/FileUtils.py
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
import json
|
||||||
|
import requests,os
|
||||||
|
|
||||||
|
class fileUtils:
|
||||||
|
base_path = "COMIC_OUT"
|
||||||
|
conf_path = os.path.join(base_path,".conf")
|
||||||
|
comic_path = os.path.join(base_path,".conf","comic")
|
||||||
|
comic_name = ""
|
||||||
|
|
||||||
|
#文件保存
|
||||||
|
@classmethod
|
||||||
|
def file_save(cls,path,data,mode=None):
|
||||||
|
result = {}
|
||||||
|
f = {}
|
||||||
|
dir_name = os.path.dirname(path)
|
||||||
|
if not os.path.exists(dir_name):
|
||||||
|
os.makedirs(dir_name)
|
||||||
|
save_path = os.path.join(path)
|
||||||
|
data = json.dumps(data)
|
||||||
|
if mode == None:
|
||||||
|
mode = "w+"
|
||||||
|
try:
|
||||||
|
f = open(save_path, mode, encoding="utf-8")
|
||||||
|
f.write(data)
|
||||||
|
f.close()
|
||||||
|
print("data=",data)
|
||||||
|
result = path + "文件写入成功"
|
||||||
|
except:
|
||||||
|
result = path + "文件写入失败"
|
||||||
|
return result
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def save_conf(cls,file, data, mode=None):
|
||||||
|
file = os.path.join(cls.conf_path,file)
|
||||||
|
cls.file_save(file,data,mode)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def save_comic(cls,name, data, mode=None):
|
||||||
|
print("comic_save=", name)
|
||||||
|
cls.file_save(cls.get_utl_save_comic(name),data,mode)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def saveConfComicChapterInfo(cls,chapter,data,comic_name=None,mode=None):
|
||||||
|
cls.file_save(cls.getPathConfComicChapterInfo(chapter,comic_name), data,mode)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def getPathConfComicChapterInfo(cls,chapter,comic_name=None):
|
||||||
|
if comic_name == None:
|
||||||
|
comic_name = cls.comic_name
|
||||||
|
return os.path.join(cls.comic_path,comic_name,"info_"+chapter)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def getInfoConfComicChapter(cls,chapter,comic_name=None):
|
||||||
|
data = None
|
||||||
|
path = cls.getPathConfComicChapterInfo(chapter,comic_name)
|
||||||
|
with open(path,"r",encoding="utf-8") as fs:
|
||||||
|
data = json.loads(fs.read())
|
||||||
|
return data
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def read_comic(cls,name):
|
||||||
|
file = os.path.join(cls.comic_path,name)
|
||||||
|
data = None
|
||||||
|
try:
|
||||||
|
with open(file,"r",encoding="utf-8") as fs:
|
||||||
|
data = json.loads(fs.read())
|
||||||
|
except:
|
||||||
|
print("文件出错了 file=", file)
|
||||||
|
return data
|
||||||
|
|
||||||
|
'''
|
||||||
|
返回漫画保存路径
|
||||||
|
'''
|
||||||
|
@classmethod
|
||||||
|
def get_utl_save_comic(cls,name):
|
||||||
|
file = os.path.join(cls.comic_path,name)
|
||||||
|
return file
|
||||||
54
utils/HtmlUtils.py
Normal file
54
utils/HtmlUtils.py
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
from fake_useragent import UserAgent
|
||||||
|
import requests
|
||||||
|
from lxml import html
|
||||||
|
from utils.comic.ComicStr import comicStr
|
||||||
|
|
||||||
|
class htmlUtils:
|
||||||
|
headers = {'User-Agent': UserAgent().random}
|
||||||
|
url_data = {}
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def getHTML(cls, curl):
|
||||||
|
rstr = r"[\/\\\:\*\?\"\<\>\|\.]" # '/ \ : * ? " < > |'
|
||||||
|
#file_url = re.sub(rstr, "_", curl)
|
||||||
|
keys = cls.url_data.keys()
|
||||||
|
url_text = cls.url_data.get(curl)
|
||||||
|
#数据为空则获取数据
|
||||||
|
if url_text == None:
|
||||||
|
print("请求地址:",curl)
|
||||||
|
res = requests.get(curl, headers=cls.headers)
|
||||||
|
url_text = html.fromstring(res.text)
|
||||||
|
data = { curl : url_text}
|
||||||
|
cls.url_data.update(data)
|
||||||
|
return url_text
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def getJSON(cls,curl):
|
||||||
|
res = requests.get(curl, headers=cls.headers)
|
||||||
|
data_json = res.json()
|
||||||
|
return data_json
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def xpathData(cls,c_title, c_xpath,url=None,num=None,type=None,not_eq=None):
|
||||||
|
if url == None:
|
||||||
|
url = cls.temp_url
|
||||||
|
else:
|
||||||
|
cls.temp_url = url
|
||||||
|
result = []
|
||||||
|
#获取html实体数据
|
||||||
|
et = cls.getHTML(url)
|
||||||
|
#比对数据
|
||||||
|
count = 1
|
||||||
|
xpaths = et.xpath(c_xpath)
|
||||||
|
for x in xpaths:
|
||||||
|
if not x == not_eq:
|
||||||
|
result.append(x)
|
||||||
|
count +=1
|
||||||
|
data = {c_title : result}
|
||||||
|
if not num == None:
|
||||||
|
data = {c_title : result[num]}
|
||||||
|
if not type == None:
|
||||||
|
data = { type : result }
|
||||||
|
if c_title == comicStr.result:
|
||||||
|
data = result
|
||||||
|
return data
|
||||||
115
utils/ImageUtils.py
Normal file
115
utils/ImageUtils.py
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
import base64,hashlib,os,shutil
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
|
class imageUtils:
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def encodeImage(cls,enStr):
|
||||||
|
print("en",enStr)
|
||||||
|
enc = base64.b64decode(enStr)
|
||||||
|
print("解密:",enc)
|
||||||
|
m = hashlib.md5()
|
||||||
|
m.update(enc)
|
||||||
|
md5 = m.digest()
|
||||||
|
d = md5[-1]
|
||||||
|
print(md5)
|
||||||
|
try:
|
||||||
|
blocks = d % 10 + 5
|
||||||
|
except:
|
||||||
|
blocks = 0 %10 + 5
|
||||||
|
print("blocks=",blocks)
|
||||||
|
return blocks
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def scrambleImage(cls,file_path):
|
||||||
|
file_str = str(file_path).split("=")
|
||||||
|
#10_29.jpg
|
||||||
|
baseDir = file_str[0].replace("scramble","")
|
||||||
|
baseName = file_str[-1]
|
||||||
|
baseFN = baseName.split("_")
|
||||||
|
save_name = baseFN[1]
|
||||||
|
save_name_delesu = baseName.split(".")[0]
|
||||||
|
blocks = int(baseFN[0])
|
||||||
|
save_file_path = os.path.join(baseDir,save_name)
|
||||||
|
print("sva",save_file_path)
|
||||||
|
if os.path.exists(save_file_path):
|
||||||
|
print("图片已解密,已跳过:", save_file_path)
|
||||||
|
return None
|
||||||
|
image_su = str(file_path).split(".")[-1]
|
||||||
|
img = Image.open(file_path)
|
||||||
|
width = img.width
|
||||||
|
height = img.height
|
||||||
|
#blocks = cls.encodeImage(enStr)
|
||||||
|
print("blocks=",blocks)
|
||||||
|
blockHeight = int(height / blocks)
|
||||||
|
blockWidth = int(width / blocks)
|
||||||
|
print("blockHeight=",blockHeight)
|
||||||
|
su = str(file_path).split(".")[-1]
|
||||||
|
split_path = os.path(baseDir,save_name_delesu+"split")
|
||||||
|
cls.splitimage(file_path,blocks,1,split_path)
|
||||||
|
cls.image_compose(split_path+"/",blocks,1,save_file_path,blockHeight,width)
|
||||||
|
#完成后清空
|
||||||
|
return file_path
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def splitimage(cls,src,rownum,colnum,dstpath):
|
||||||
|
img=Image.open(src)
|
||||||
|
w,h=img.size
|
||||||
|
if rownum<= h and colnum<=w:
|
||||||
|
s=os.path.split(src)
|
||||||
|
if dstpath=='':
|
||||||
|
dstpath = s[0]
|
||||||
|
if not os.path.exists(dstpath):
|
||||||
|
os.makedirs(dstpath)
|
||||||
|
fn=s[1].split('.')
|
||||||
|
basename=fn[0]
|
||||||
|
ext=fn[-1]
|
||||||
|
num=0
|
||||||
|
rowheight=h//rownum
|
||||||
|
colwidth=w//colnum
|
||||||
|
for r in range(rownum):
|
||||||
|
for c in range(colnum):
|
||||||
|
box=(c*colwidth,r*rowheight,(c+1)*colwidth,(r+1)*rowheight)
|
||||||
|
file_path = os.path.join(dstpath,basename+'_'+str(num)+'.'+ext)
|
||||||
|
print("file_path=",file_path)
|
||||||
|
img.crop(box).save(file_path)
|
||||||
|
num=num+1
|
||||||
|
else:
|
||||||
|
print('不数!')
|
||||||
|
img.close
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def image_compose(cls,src,row,column,save_path,image_height,image_width):
|
||||||
|
image_size = image_height
|
||||||
|
#image_height = 376
|
||||||
|
#image_width = 720
|
||||||
|
images_format = ['.png','.jpg']
|
||||||
|
image_names = [name for name in os.listdir(src) for item in images_format if
|
||||||
|
os.path.splitext(name)[1] == item][::-1]
|
||||||
|
# 简单的对于参数的设定和实际图片集的大小进行数量判断
|
||||||
|
if len(image_names) < row * column:
|
||||||
|
raise ValueError("合成图片的参数和要求的数量不能匹配!")
|
||||||
|
|
||||||
|
to_image = Image.new('RGB', (column * image_width, row * image_height)) #创建一个新图
|
||||||
|
# 循环遍历,把每张图片按顺序粘贴到对应位置上
|
||||||
|
for y in range(1, row + 1):
|
||||||
|
for x in range(1, column + 1):
|
||||||
|
#1 * (row=1 -1) col=1 -1
|
||||||
|
image_path = src + image_names[column * (y - 1) + x - 1]
|
||||||
|
print("split_image=",image_path)
|
||||||
|
from_image = Image.open(image_path)
|
||||||
|
#保持原图片大小
|
||||||
|
#.resize(
|
||||||
|
# (image_size, image_size),Image.ANTIALIAS)
|
||||||
|
to_image.paste(from_image, ((x - 1) * image_size, (y - 1) * image_size))
|
||||||
|
to_image.save(save_path)
|
||||||
|
print("图片合并完成:", save_path)
|
||||||
|
shutil.rmtree(src)
|
||||||
|
# 保存新图
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def getScrambleImage(cls,path):
|
||||||
|
scrambleFileCache = cls.scrambleImage(path)
|
||||||
|
if not scrambleFileCache == None:
|
||||||
|
os.remove(str(scrambleFileCache))
|
||||||
|
|
||||||
86
utils/NetUtils.py
Normal file
86
utils/NetUtils.py
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
import os.path,shutil
|
||||||
|
import requests
|
||||||
|
from concurrent.futures import ThreadPoolExecutor,wait,ALL_COMPLETED
|
||||||
|
import time
|
||||||
|
import imghdr
|
||||||
|
from utils.comic.PathStr import pathStr
|
||||||
|
from utils.ImageUtils import imageUtils
|
||||||
|
|
||||||
|
class netUtils:
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
# 定义下载函数
|
||||||
|
def download(cls,url,path,fileType=None):
|
||||||
|
if os.path.exists(path):
|
||||||
|
if imghdr.what(path):
|
||||||
|
msg = "已存在同路径文件,已跳过:"+path
|
||||||
|
print(msg)
|
||||||
|
return msg
|
||||||
|
else:
|
||||||
|
print("文件已损坏,已重试:"+path)
|
||||||
|
tmp_file = path+".downloads"
|
||||||
|
if os.path.exists(tmp_file):
|
||||||
|
os.remove(tmp_file)
|
||||||
|
print("存在缓存文件,已删除:",tmp_file)
|
||||||
|
repair_count = 1
|
||||||
|
res = requests.get(url, stream=True)
|
||||||
|
while res.status_code != 200 and repair_count <= 5:
|
||||||
|
res = requests.get(url, stream=True)
|
||||||
|
print(f'重试:第{repair_count}次 {url}')
|
||||||
|
repair_count += 1
|
||||||
|
#判断是否为图片
|
||||||
|
if fileType == "image":
|
||||||
|
if 'image' not in res.headers.get("content-type",""):
|
||||||
|
print(f"url= {url} Error: URL doesnot appear to be an image")
|
||||||
|
basedir= os.path.dirname(path)
|
||||||
|
if not os.path.exists(basedir):
|
||||||
|
os.makedirs(basedir)
|
||||||
|
with open(tmp_file, 'wb') as f:
|
||||||
|
for ch in res:
|
||||||
|
f.write(ch)
|
||||||
|
f.close()
|
||||||
|
shutil.move(tmp_file, path)
|
||||||
|
print(f"url={url} 保存至:{path}")
|
||||||
|
return path
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def threadDownload(cls,url,path,fileType=None):
|
||||||
|
executor = ThreadPoolExecutor(max_workers=3)
|
||||||
|
tasks = executor.submit(cls.download, url,path,fileType)
|
||||||
|
#wait(tasks, return_when=ALL_COMPLETED)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def downloadComicChapterImages(cls,comic_name, chapter_name, imgs,scrambles=None):
|
||||||
|
file_path = os.path.join(pathStr.base_comic_out, comic_name, chapter_name)
|
||||||
|
print("files=",file_path)
|
||||||
|
|
||||||
|
count_img = 1
|
||||||
|
for img in imgs:
|
||||||
|
count = ("{:0>3d}".format(count_img))
|
||||||
|
file_name = count + os.path.splitext(img)[-1]
|
||||||
|
save_file_path = os.path.join(file_path, file_name)
|
||||||
|
if scrambles[count_img -1]:
|
||||||
|
su = "."+str(img).split(".")[-1]
|
||||||
|
de_str = str(img).split("/")[-1].replace(su,"==")
|
||||||
|
blockInt = imageUtils.encodeImage(de_str)
|
||||||
|
save_file_path = os.path.join(file_path,"scramble="+str(blockInt)+"_"+file_name)
|
||||||
|
cls.threadDownload(img, save_file_path, fileType="image")
|
||||||
|
time.sleep(0.1)
|
||||||
|
count_img += 1
|
||||||
|
return os.path.dirname(save_file_path)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def downloadComicIcon(cls,comic_name,chapter,img):
|
||||||
|
file_su = os.path.splitext(img)[-1]
|
||||||
|
icon_name = "cover"+ file_su
|
||||||
|
save_file_path = os.path.join(cls.save_comic_img_basePath,comic_name,icon_name)
|
||||||
|
if os.path.exists(save_file_path):
|
||||||
|
"已存在,跳过下载"
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
cls.download(img,save_file_path,fileType="image")
|
||||||
|
target_dir = os.path.join(cls.CBZ_path,comic_name)
|
||||||
|
target_file = os.path.join(target_dir,chapter+file_su)
|
||||||
|
if not os.path.exists(target_dir):
|
||||||
|
os.makedirs(target_dir)
|
||||||
|
shutil.copy(save_file_path,target_file)
|
||||||
37
utils/comic/ComicInfo.py
Normal file
37
utils/comic/ComicInfo.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
from xml.dom.minidom import Document
|
||||||
|
|
||||||
|
document = Document()
|
||||||
|
|
||||||
|
class comicInfoXmlNode():
|
||||||
|
chapter = "Title"
|
||||||
|
comic_name = "Series"
|
||||||
|
dep = "Summary"
|
||||||
|
author = "Writer"
|
||||||
|
tags = "Genre"
|
||||||
|
cbs = "Publisher"
|
||||||
|
lang = "LanguageISO"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setNodeAndValue(cls,node,value):
|
||||||
|
node = document.createElement(node)
|
||||||
|
node_text = document.createTextNode(value)
|
||||||
|
node.appendChild(node_text)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setChapter(cls,value):
|
||||||
|
cls.setNodeAndValue(cls.chapter,value)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setComicName(cls,value):
|
||||||
|
cls.setNodeAndValue(cls.comic_name, value)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def getComicInfoXML(cls):
|
||||||
|
cls.setChapter()
|
||||||
|
class comicInfo():
|
||||||
|
|
||||||
|
#输出xml
|
||||||
|
@classmethod
|
||||||
|
def writeComicInfoXML(cls,c_title,chapter,dep,author,tags="韩漫",c_publisher="韩漫",language="zh"):
|
||||||
|
#file 预期 CBZ/"comic_name"/chapter
|
||||||
|
print()
|
||||||
28
utils/comic/ComicStr.py
Normal file
28
utils/comic/ComicStr.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
class comicStr:
|
||||||
|
url = "url"
|
||||||
|
xpath = "xpath"
|
||||||
|
title = "title"
|
||||||
|
icon = "icon"
|
||||||
|
author = "author"
|
||||||
|
dep = "dep"
|
||||||
|
chapters = "chapters"
|
||||||
|
homepage = "homepage"
|
||||||
|
chapter_href = "chapter_href"
|
||||||
|
list_img = "list_img"
|
||||||
|
img = "img"
|
||||||
|
last_update = "last_update"
|
||||||
|
alias = "alias"
|
||||||
|
tags = "tags"
|
||||||
|
action = "action"
|
||||||
|
chapters_href = "chapters_href"
|
||||||
|
base_url = ""
|
||||||
|
data = "data"
|
||||||
|
result = "result"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setBaseUrl(cls,url):
|
||||||
|
cls.base_url = url
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def getBaseUrl(cls):
|
||||||
|
return cls.base_url
|
||||||
6
utils/comic/PathStr.py
Normal file
6
utils/comic/PathStr.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
class pathStr:
|
||||||
|
base_comic_out = "COMICOUT"
|
||||||
|
base_CBZ = os.path.join(base_comic_out,"CBZ")
|
||||||
|
base_comic_img = os.path.join(base_comic_out,"outputComic")
|
||||||
63
utils/entity/RouMan.py
Normal file
63
utils/entity/RouMan.py
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import json,os
|
||||||
|
from utils.comic.ComicStr import comicStr
|
||||||
|
from utils.ComicUtils import comicUtils
|
||||||
|
from utils.FileUtils import fileUtils
|
||||||
|
|
||||||
|
class comicEntityRM:
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def oneComic(cls,c_url):
|
||||||
|
#漫画名
|
||||||
|
title = comicUtils.xpathData(comicStr.title,
|
||||||
|
'//div[@class="col"]/h5/text()',url=c_url,num=0)
|
||||||
|
#别名
|
||||||
|
alias = comicUtils.xpathData(comicStr.alias,
|
||||||
|
'//span[contains(@class,"bookid_alias")]/text()',num=1)
|
||||||
|
icon = comicUtils.xpathData(comicStr.icon,
|
||||||
|
'//img[@class="img-thumbnail"]/@src')
|
||||||
|
|
||||||
|
author = comicUtils.xpathData(comicStr.author,
|
||||||
|
'//div[contains(@class,"bookid_bookInfo")]/p[1]/text()',num=1)
|
||||||
|
tags = comicUtils.xpathData(comicStr.tags,
|
||||||
|
'//div[contains(@class,"bookid_bookInfo")]/p[3]/b/text()')
|
||||||
|
action = comicUtils.xpathData(comicStr.action,
|
||||||
|
'//div[contains(@class,"bookid_bookInfo")]/p[2]/text()',num=1)
|
||||||
|
dep = comicUtils.xpathData(comicStr.dep,
|
||||||
|
'//div[contains(@class,"bookid_bookInfo")]/p[4]/text()',num=1)
|
||||||
|
update_date = comicUtils.xpathData(comicStr.last_update,
|
||||||
|
'//div[contains(@class,"bookid_bookInfo")]/p[5]/small/text()',num=1)
|
||||||
|
chapters = comicUtils.xpathData(comicStr.chapters,
|
||||||
|
'//div[contains(@class,"bookid_chapterBox")]//div[contains(@class,"bookid_chapter")]/a/text()')
|
||||||
|
chapter_href = comicUtils.xpathData(comicStr.chapter_href,
|
||||||
|
'//div[contains(@class,"bookid_chapterBox")]//div[contains(@class,"bookid_chapter")]/a/@href')
|
||||||
|
|
||||||
|
comicUtils.setComic(title,alias,icon,author,tags,action,dep,update_date,chapters,chapter_href)
|
||||||
|
|
||||||
|
#{'title': ['社區重建協會']}
|
||||||
|
#主页
|
||||||
|
#homepage = {comicStr.homepage : [c_url] }
|
||||||
|
#图片
|
||||||
|
#comicUtils.setComic(titles,homepage,icons,authors,deps,chapters, chapter_hrefs,last_update)
|
||||||
|
comicData = comicUtils.getComic()
|
||||||
|
print(comicData)
|
||||||
|
wait = input("数据暂停查看y/n")
|
||||||
|
if not wait == "y":
|
||||||
|
exit()
|
||||||
|
return comicData
|
||||||
|
|
||||||
|
'''
|
||||||
|
|
||||||
|
读取某章节下所有图片
|
||||||
|
'''
|
||||||
|
@classmethod
|
||||||
|
def comicChapter(cls,c_url,chapter):
|
||||||
|
xpath_str = '//img[contains(@class,"id_comicImage")]/@src'
|
||||||
|
not_eq = "/loading.jpg"
|
||||||
|
#章节下所有图片链接
|
||||||
|
list_img = comicUtils.xpathData(comicStr.list_img,
|
||||||
|
xpath_str,url=c_url,type=chapter,not_eq=not_eq)
|
||||||
|
print(list_img)
|
||||||
|
wait = input("暂停查看数据y/n")
|
||||||
|
if not wait == "y":
|
||||||
|
exit()
|
||||||
|
return list_img
|
||||||
Loading…
Reference in New Issue
Block a user