终于到这个时间了
养兵千日,用兵一时
学了这么久python了终于到它用武之地了
/**************************作者高产似母猪*******************************/
本脚本仅作学习交流,不能用于任何侵犯它人权益的行为。侵删!
如果您觉得侵犯您合法权益后,请联系TG:@Core_i0
我会进行删库操作,永不更新。或者您使用过程中遇到某些问题也请联系TG。因为作者经常水TG群,看不见github?
食用方法介绍:
一般开到64线程了,基本可以跑满带宽,下载速度取决于您本地(梯子?)的网速
经测试,网络条件较好的情况下,256张comic images下载速度基本在3s之内。
1、先上运行结果,
2、传入的url介绍:
您应该传入url应为如下举例
或者
https://18comic.org/photo/232758/
!仅支持这两种url!
3、可用pyinstaller打包成exe文件(已兼容支持)
pyinstaller --onefile ****.py
2021/02/08更新 ver2.2:
额,最近又闲的没事上“gayhub”上找罪受。
看到有一位叫做jiekai0629的好朋友(lsp)在github上狂发issue。
玩笑归玩笑。很感谢这位朋友提出的“一系列问题”,比如下载无法实现多章同时下载,多进程的高强度io让cpu扛不住等等。让我看到这个脚本的各种不足。
这些问题其实只要是一个人使用的话是看不出来的。因为样本集太少了,比如我就用着很“爽”,没看见过什么错误。让很多人用就不一样了,真的会有各种错误,和解决过程中的各种不知道的玄学问题?
也许这就是开源吸引人的地方吧。
老规矩,言归正传...
提出下载会闪退报错的问题,而且某人通过tg给了我一个出错的下载链接进行测试。我不试不知道,一试吓一跳。在连续下载30话comic时,我的电脑直接死机了!
???
每一话就不超过10张,我的风扇疯狂转动,电脑直接无响应了。这链接有毒!?
最后大约等待了将近一小时之后无果,最后用8s强制关机大法重启了。
这可不行,这会出这种要人命的问题可怎么用啊。
经不断调试最终确定问题所在:
从结论上说就是cpu太垃圾了。开到64进程就抗不住了,比如你用太湖之光下载就不会出现问题。经测试的一个一个的下载是没有问题的,但是一经在同一程序下,下载次数超过13,我的cpu就扛不住了,io过于密集,导致操作系统调度出现了问题,导致死锁。而且开启多进程下载时还会有一点卡顿。多多权衡利弊,决定用多线程代替多进程下载。并且修改下载算法,使下载速度得到提升。
进行测试:
由此可见下载速度得到进一步提升!
下面是ver2.2程序源码:
from requests import *
from bs4 import BeautifulSoup
from PIL import Image ##调用image库对有反转的图片进行转换
from io import BytesIO
import os #创建文件夹,保存下载好的图片
import re
import threading #多线程支持库,对于这种io密集操作相对于多进程还是换成多线程比较好
import time
'''
基于BeautifulSoup解析库的py爬虫爬取18comic
'''
public_headers = {
'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}
ERROR_PAGE_LIST = [] #声明一个全局变量,用来储存因诸如网络等不可抗元素导致的下载失败,从而进行重新下载!(这个变量只是存储单次下载的错误)
def checkImgConvert(url): #判断图片是否做过反爬机制,比较狂野的使用id分析,没有对前端进行分析来判断
pass
def convertImg(img_url):
img = Image.open(img_url)
img_size = img.size
img_crop_size = int(img_size[1] / 10)
img_crop_size_last = (img_size[1] / 10) - img_crop_size # 解决图片height不能被10整除导致拼接后下方黑条
img_crop_size_last = round(img_crop_size_last, 1)
if img_crop_size_last > 0: # 只有无法整除时才将新建图片进行画布纵向减小
img_crop_size_last_sum = int(img_crop_size_last * 10)
else:
img_crop_size_last_sum = 0
img_width = int(img_size[0])
img_block_list = [] #定义一个列表用来存切割后图片
for img_count in range(10):
img_crop_box = (0, img_crop_size*img_count, img_width, img_crop_size*(img_count+1))
img_crop_area = img.crop(img_crop_box)
img_block_list.append(img_crop_area)
img_new = Image.new('RGB', (img_size[0], img_size[1]-img_crop_size_last_sum))
count = 0
for img_block in reversed(img_block_list):
img_new.paste(img_block, (0, count*img_crop_size))
count += 1
# img_new.show() # 调试显示转化后的图片
img_new.save(img_url)
def get_url_list(url): #得到图片的下载链接
response = get(url, headers=public_headers)
html = response.text
soup = BeautifulSoup(html, 'lxml')
options_list = soup.find_all('select')[2].find_all('option') # 用来取出存放页数select中的option标签数量来计算页数
pages = len(options_list) # 设置一个变量表征页数
comic_page_urls = [] # 设置一个列表用来存储所有的最终url
comic_page1_id = soup.find(id='album_photo_00001.jpg')['data-original'] # 存放每一页page图片 ## 取出第一页的页数根据页数的命名规则来自己计算出后面的页数的url,减少用库进行查的时间
comic_page_url_head_temp = '/'.join(comic_page1_id.split('/')[:-1]) # 取出页数url判断之前的服务器路径
comic_page_id_tail_temp = comic_page1_id.split('/')[-1].split('.')[-1] # 用split取出判断页数的后半段url地址例如jpg?v=1602070382暂存
for page in range(1, pages + 1): # 对url地址后面的判断页数的url进行根据页数递增的规则进行拼接
if page < 10:
comic_page_url = comic_page_url_head_temp + '/0000' + str(page) + '.' + comic_page_id_tail_temp
elif page >= 10 and page < 100:
comic_page_url = comic_page_url_head_temp + '/000' + str(page) + '.' + comic_page_id_tail_temp
elif page >= 100 and page < 1000:
comic_page_url = comic_page_url_head_temp + '/00' + str(page) + '.' + comic_page_id_tail_temp
elif page >= 1000 and page < 10000:
comic_page_url = comic_page_url_head_temp + '/0' + str(page) + '.' + comic_page_id_tail_temp
elif page >= 10000:
comic_page_url = comic_page_url_head_temp + '/' + str(page) + '.' + comic_page_id_tail_temp
#print(comic_page_url + '\n') # 测试每个url是否正正常输出
comic_page_urls.append(comic_page_url) # 将每一个url加入到存储的列表中
# print(comic_page_urls) # 测试存储url的列表是否正常输出
return comic_page_urls
def makeDir(url): # 根据传入的url创建以名称为根据的文件夹,返回文件夹路径
response = get(url, headers=public_headers)
html = response.text
soup = BeautifulSoup(html, 'lxml')
title = soup.title.string
dir_name = title.split('|')[0]
path = r'download/' + dir_name
path = re.sub('[:*?"<>|]', '' ,path) # 去除特殊字符
# print(path)
folder = os.path.exists(path)
if not folder:
os.makedirs(path)
return path
def download_image(url_path):# 下载图片,定义一个方法方便开启多线程,返回下载该图片的相对路径
url = url_path[0]
path = url_path[1]
convert_status = url_path[2]
global ERROR_PAGE_LIST #全局变量
try:
comic_page = get(url, headers=public_headers)
if comic_page.status_code != 200:
# print('!= 200')
ERROR_PAGE_LIST.append(url_path)
pass
except Exception:
# print('Download Error')
ERROR_PAGE_LIST.append(url_path)
pass
comic_name = url.split('/')[-1].split('?')[0]
comic_local_position = path + '/' + comic_name
image_bytes = BytesIO(comic_page.content)
if image_bytes.__sizeof__() >= 1: #防止下载的图片为0kb,玄学?!
image_source = Image.open(image_bytes)
image_source.save(comic_local_position)
else:
# print('content is lost')
ERROR_PAGE_LIST.append(url_path)
pass
if convert_status:
convertImg(comic_local_position) # 对“无耻”的以修改图片的反爬虫机制进行反制!
if url_path in ERROR_PAGE_LIST: # 如果下载成功就再下载列表删除它
ERROR_PAGE_LIST.remove(url_path)
def checkPluralPage(url): #判断是不是有复数章节需要下载,有返回True,无返回False
response = get(url)
html = response.text
soup = BeautifulSoup(html, 'lxml')
switch_btn_class = soup.find_all(name='a', attrs={'class': 'switch_btn'})
if switch_btn_class:
flag = True
else:
flag = False
return flag
# 得到多章节comic所有的url返回一个列表
def getChapterList(url):
response = get(url)
html = response.text
soup = BeautifulSoup(html, 'lxml')
btn_toolbar_class = soup.find_all(name='ul', attrs={'class': 'btn-toolbar'})
pattern = re.compile('<a href="/photo/(.*?)">.*?</a>', re.S)
chapter_find = []
for a in btn_toolbar_class[0].contents:
id = re.findall(pattern, str(a))
if id:
chapter_find.append(id)
last_chapter = []
for chapter in chapter_find: # findall查找的出的是返回列表,"暂时"这么让它返回列表,便于后续操作
last_chapter.append(chapter[0])
return last_chapter
# 调用此方法来判断开启多线程程的个数
def downloadByThread(comic_num, url_path_list):
thread_list = [] # 用于存放线程的列表
print('正在开始多线程下载(线程数量:' + str(comic_num) + ')请稍后......')
start_time = time.time()
for num in range(comic_num):
# 根据页数动态创建线程
thread_one = threading.Thread(target=download_image, name='DownloadPageIs' + str(num), args=(url_path_list[num],))
thread_list.append(thread_one)
for thread in thread_list:
thread.start() # 开始线程
for thread in thread_list:
thread.join() # 同步线程
def main(id):
convert_status = False #设置处理反爬机制的问题,False为未对comic进行切割
id = int(id)
comic_num = 0 # 根据下载的页数决定线程数量
if id >= 220971:# 静态检测检测!!!有必要再改成动态
convert_status = True
url = 'https://18comic.org/photo/' + str(id)
re_download_count = 1 #由于网络等种种原因而重新下载次数
print('解析成功,开始下载',url)
path = makeDir(url)
print('成功创建目录', path)
url_list = get_url_list(url)
url_path_list = [] # 里面加入path等传入下载方法的信息
for url_in_list in url_list:
url_path_list.append((url_in_list, path, convert_status))
comic_num = len(url_path_list)
start_time = time.time() # 开始执行时间
downloadByThread(comic_num, url_path_list)
while ERROR_PAGE_LIST:
print('当前有' + str(len(ERROR_PAGE_LIST)) + '张comic image由于不可抗网络因素下载失败,正在第' + str(
re_download_count) + '次重新下载...')
re_download_count += 1
comic_num = len(ERROR_PAGE_LIST)
downloadByThread(comic_num, ERROR_PAGE_LIST)
download_time = float(time.time() - start_time)
print("所有comic image下载成功,共" + str(len(url_path_list)) + "张,下载用时:%.1fS。enjoy!\n\n" % download_time)
if __name__ == '__main__':
print('18comic.vip Downloader by emptysuns.\n请不要用于任何非法用途,仅作学习交流\n版本:Version 2.2\n下载链接格式请参照:\nhttps://github.com/emptysuns/18comic-Download\thttps://blog.acglove.cloud/?p=35\n')
download_count = 1
while(1):
url = input('第'+str(download_count)+'次下载,请输入您想要下载comic的下载链接:\n')
flag = checkPluralPage(url)
if flag: #有就进行解析,无就直接下载
id = url.split('/')[4]
check_all_download = input('Tips:检测到您输入的链接是包括多个章节的,请判断是否将所有章节都下载:\n输入数字1:下载全部章节\t输入数字0:只下载当前章节\n')
if check_all_download == '1' or check_all_download == '0':
if check_all_download == '1':
chapter_list = getChapterList(url)
# print(chapter_list) # 调试输出是否得到所有下载id
print('当前共有'+str(len(chapter_list))+'话需下载\n')
chapter_count = 1
for id in chapter_list:
print('正在下载第'+str(chapter_count)+'话,请稍后...')
main(id)
chapter_count += 1
print('共'+str(len(chapter_list))+'话下载完毕!\n')
download_count += 1
else:
id = url.split('/')[4]
main(id)
download_count += 1
else:
print("请输入的合法字符")
download_count += 1
continue
else:
id = url.split('/')[4]
main(id)
download_count += 1
/************************以下是老版本*******************************/
2021/01/20更新:
昨天,闲的无聊上了‘GayHub’,看见有人对我的下载脚本提了issue。
???
我写的脚本居然有人看,开心,呵呵呵。
言归正传,查看issue,发现禁漫天堂,居然做了反扒机制。而且,反扒机制非常离谱,居然是将源图直接切片打乱反向顺序排列。前台再用,canvas再进行绘图拼接,我直呼内行...这种方法直接让人无法下载源链接。牛p,真的我这是第一次见这种狂野的反扒机制。但是还是用万能的python解决了。(用了PIL库的Image包,切割拼接,以其人之道,还其人之身)。讲真的,python这个东西真恶心。要是碰见这东西的爬虫,反制有点困难。侵删!
以下是2021/01/20更新源码
准备安装所需包
pip3 install beautifulsoup PIL
from requests import *
from bs4 import BeautifulSoup
from multiprocessing import Pool
from PIL import Image ##调用image库对有反转的图片进行转换
from io import BytesIO
import os #创建文件夹,保存下载好的图片
import re
import multiprocessing
'''
基于BeautifulSoup解析库的py爬虫爬取18comic
'''
public_headers = {
'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}
def checkImgConvert(url): #判断图片是否做过反爬机制,比较狂野的使用id分析,没有对前端进行分析来判断
pass
def convertImg(img_url):
img = Image.open(img_url)
img_size = img.size
img_crop_size = int(img_size[1] / 10)
img_crop_size_last = (img_size[1] / 10) - img_crop_size # 解决图片height不能被10整除导致拼接后下方黑条
img_crop_size_last = round(img_crop_size_last, 1)
if img_crop_size_last > 0: # 只有无法整除时才将新建图片进行画布纵向减小
img_crop_size_last_sum = int(img_crop_size_last * 10)
else:
img_crop_size_last_sum = 0
img_width = int(img_size[0])
img_block_list = [] #定义一个列表用来存切割后图片
for img_count in range(10):
img_crop_box = (0, img_crop_size*img_count, img_width, img_crop_size*(img_count+1))
img_crop_area = img.crop(img_crop_box)
img_block_list.append(img_crop_area)
img_new = Image.new('RGB', (img_size[0], img_size[1]-img_crop_size_last_sum))
count = 0
for img_block in reversed(img_block_list):
img_new.paste(img_block, (0, count*img_crop_size))
count += 1
# img_new.show() # 调试显示转化后的图片
img_new.save(img_url)
def get_url_list(url): #得到图片的下载链接
response = get(url, headers=public_headers)
html = response.text
soup = BeautifulSoup(html, 'lxml')
options_list = soup.find_all('select')[2].find_all('option') # 用来取出存放页数select中的option标签数量来计算页数
pages = len(options_list) # 设置一个变量表征页数
comic_page_urls = [] # 设置一个列表用来存储所有的最终url
comic_page1_id = soup.find(id='album_photo_00001.jpg')['data-original'] # 存放每一页page图片 ## 取出第一页的页数根据页数的命名规则来自己计算出后面的页数的url,减少用库进行查的时间
comic_page_url_head_temp = '/'.join(comic_page1_id.split('/')[:-1]) # 取出页数url判断之前的服务器路径
comic_page_id_tail_temp = comic_page1_id.split('/')[-1].split('.')[-1] # 用split取出判断页数的后半段url地址例如jpg?v=1602070382暂存
for page in range(1, pages + 1): # 对url地址后面的判断页数的url进行根据页数递增的规则进行拼接
if page < 10:
comic_page_url = comic_page_url_head_temp + '/0000' + str(page) + '.' + comic_page_id_tail_temp
elif page >= 10 and page < 100:
comic_page_url = comic_page_url_head_temp + '/000' + str(page) + '.' + comic_page_id_tail_temp
elif page >= 100 and page < 1000:
comic_page_url = comic_page_url_head_temp + '/00' + str(page) + '.' + comic_page_id_tail_temp
elif page >= 1000 and page < 10000:
comic_page_url = comic_page_url_head_temp + '/0' + str(page) + '.' + comic_page_id_tail_temp
elif page >= 10000:
comic_page_url = comic_page_url_head_temp + '/' + str(page) + '.' + comic_page_id_tail_temp
#print(comic_page_url + '\n') # 测试每个url是否正正常输出
comic_page_urls.append(comic_page_url) # 将每一个url加入到存储的列表中
# print(comic_page_urls) # 测试存储url的列表是否正常输出
return comic_page_urls
def makeDir(url): # 根据传入的url创建以名称为根据的文件夹,返回文件夹路径
response = get(url, headers=public_headers)
html = response.text
soup = BeautifulSoup(html, 'lxml')
title = soup.title.string
dir_name = title.split('|')[0]
path = r'download/' + dir_name
path = re.sub('[:*?"<>|]', '' ,path) # 去除特殊字符
# print(path)
folder = os.path.exists(path)
if not folder:
os.makedirs(path)
return path
def download_image(url_path):# 下载图片,定义一个方法方便开启多线程,返回下载该图片的相对路径
url = url_path[0]
path = url_path[1]
convert_status = url_path[2]
try:
comic_page = get(url, headers=public_headers)
if comic_page.status_code != 200:
# print('!= 200')
return url_path
except Exception:
# print('Download Error')
return url_path
comic_name = url.split('/')[-1].split('?')[0]
comic_local_position = path + '/' + comic_name
image_bytes = BytesIO(comic_page.content)
if image_bytes.__sizeof__() >= 1:
image_source = Image.open(image_bytes)
image_source.save(comic_local_position)
else:
# print('content is lost')
return url_path
if convert_status:
convertImg(comic_local_position)
return None # 成功返回None
def main(id):
convert_status = False
id = int(id)
if id >= 220971:
convert_status = True
url = 'https://18comic.org/photo/' + str(id)
print('解析成功,开始下载',url)
path = makeDir(url)
print('成功创建目录', path)
url_list = get_url_list(url)
url_path_list = [] # 这里创建一个列表作为传入map的值,里面加入path,屏蔽map只支持传入一个参数的问题
for url_in_list in url_list:
url_path_list.append((url_in_list, path, convert_status))
print('正在开始多线程下载(默认64线程)请稍后......')
pool = Pool(processes = 64) #改变下载进程数
un_successful_list = pool.map(download_image, url_path_list) # 用于存放未下载成功图片路径
while None in un_successful_list:
un_successful_list.remove(None) #清洗None成功的下载
while un_successful_list:
re_download_count = 1
print('当前有'+str(len(un_successful_list))+'张comic image由于不可抗网络因素下载失败,正在第'+str(re_download_count)+'次重新下载...')
un_successful_list = pool.map(download_image, un_successful_list) #再进行下载
while None in un_successful_list:
un_successful_list.remove(None)
re_download_count += 1
print("所有comic image下载成功,共" + str(len(url_path_list)) + "张。enjoy!\n\n")
if __name__ == '__main__':
multiprocessing.freeze_support() #防止pyinstaller()打包过程中出现由于开启多进程打包错误
print('18comic.vip Downloader by emptysuns.\n请不要用于任何非法用途,仅作学习交流\n版本:Version 2.0\n下载链接格式请参照:\nhttps://github.com/emptysuns/18comic-Download\thttps://blog.acglove.cloud/?p=35\n')
download_count = 1
while(1):
url = input('第'+str(download_count)+'次下载,请输入您想要下载comic的下载链接:\n')
id = url.split('/')[4]
main(id)
download_count += 1
2021/01/20 之前版本(最lj版本,以上是最新版)
最近一直在学python爬虫的相关知识。
爬虫吧,以前也写过一点点,但是写的不够好,最近正在深入学习这一块的内容,正好学到了多线程这部分就把以前的写的代码拿出来了,改了改加上了多进程。但是也并没有优化的多么好,因为把这个脚本当作version 1.0来看。
请食用...
下面是代码部分:
from requests import *
from bs4 import BeautifulSoup
from multiprocessing import Pool
'''
基于BeautifulSoup解析库的py爬虫爬取18comic
'''
def get_url_list(url):
response = get(url)
# print(response.text)
html = response.text
# 用BeautifulSoup解析
soup = BeautifulSoup(html, 'lxml')
# 用来取出存放页数select中的option标签数量来计算页数
options_list = soup.find_all('select')[2].find_all('option')
# 设置一个变量表征页数
pages = len(options_list)
# 设置一个列表用来存储所有的最终url
comic_page_urls = []
# 存放每一页page图片
# 取出第一页的页数根据页数的命名规则来自己计算出后面的页数的url,减少用库进行查的时间
comic_page1_id = soup.find(id='album_photo_00001.jpg')['data-original']
# 取出页数url判断之前的服务器路径
comic_page_url_head_temp = '/'.join(comic_page1_id.split('/')[:-1])
# 用split取出判断页数的后半段url地址例如jpg?v=1602070382暂存
comic_page_id_tail_temp = comic_page1_id.split('/')[-1].split('.')[-1]
# 对url地址后面的判断页数的url进行根据页数递增的规则进行拼接
for page in range(1, pages + 1):
if(page < 10):
comic_page_url = comic_page_url_head_temp + '/0000' + str(page) + '.' + comic_page_id_tail_temp
elif (page >= 10 and page < 100):
comic_page_url = comic_page_url_head_temp + '/000' + str(page) + '.' + comic_page_id_tail_temp
elif (page >= 100 and page < 1000):
comic_page_url = comic_page_url_head_temp + '/00' + str(page) + '.' + comic_page_id_tail_temp
elif (page >= 1000 and page < 10000):
comic_page_url = comic_page_url_head_temp + '/0' + str(page) + '.' + comic_page_id_tail_temp
elif (page >= 10000):
comic_page_url = comic_page_url_head_temp + '/' + str(page) + '.' + comic_page_id_tail_temp
# 测试每个url是否正正常输出
#print(comic_page_url + '\n')
# 将每一个url加入到存储的列表中
comic_page_urls.append(comic_page_url)
# 测试存储url的列表是否正常输出
print(comic_page_urls)
return comic_page_urls
'''
# 普通下载方式
# for comic_page_url in comic_page_urls:
# # comic_page = get(comic_page_url)
# print(comic_page_url,'\n')
# comic_page = get(comic_page_url)
# comic_name = comic_page_url.split('/')[-1].split('?')[0]
# comic_local_position = r'./img download/' + comic_name
# with open(comic_local_position, 'wb') as comic_img:
# comic_img.write(comic_page.content)
# comic_img.close()
# print(comic_name + " This image DownLoad Successfully\n")
# print("\n*******DownLoad Successfully*******\n")
'''
# 下载图片,定义一个方法方便开启多线程
def download_image(url):
comic_page = get(url)
comic_name = url.split('/')[-1].split('?')[0]
comic_local_position = r'./img download/' + comic_name
with open(comic_local_position, 'wb') as comic_img:
comic_img.write(comic_page.content)
comic_img.close()
def main():
url = '在这个里面输入您想要下载部分的地址'
url_list = get_url_list(url)
pool = Pool(processes = 64)
pool.map(download_image, url_list)
print("image DownLoad Successfully\n")
if __name__ == '__main__':
main()
声明一下
这里的main方法里的url是指的,观看界面的url,其实也可以设置成别的,但是没有去找,毕竟现在我暂时没有这方面的要求。而且很多地方没有修改,没有去加上判断异常的操作什么的,这能看到就只有下载这个东西。
传入的url例如
在使用前你应该创建一个文件夹名为
img download
将它和脚本放在同一个目录
就先这样吧,如果有别的需求我再更新吧。
Comments 15 条评论
Σ(゚д゚;)
这博客就这个阅读量高,就离谱就这个阅读量高证明LSP多啊。
顺便问下,大佬,有32位版本吗?
@liangjianfeng 32位版本的话没有特别提供,可以自行用pyinstaller进行打包使用。
或者下载一个python3.7安装好依赖后直接运行就行了,不比运行打包好的30mb的exe香么?
如果还有任何不能解决的问题,欢迎在github内的issue提出,我会尝试提供打包好的32位的版本exe可执行文件。
(╬゚д゚)▄︻┻┳═一
老哥这个脚本给力。只能崇拜了。然后,提两个小建议,如果老哥还会继续改进的话。我使用中发现的,能不能让脚本检测下已经下载过的章节然后跳过?不然要么重复下载之前的章节,要么手动一个个下,对于那些没完结的大长篇还是很累的哈。另一个下载的比较少还没有遇到,只是个疑问:所有章节都在download文件夹下面,那如果漫画章节名一样的话是不是图片会被覆盖?比如两个章节名字都是02?
@nakami
(有改进的建议的话还是发issue比较好吧,毕竟博客这种东西我也不会天天跑过来看评论吧)其实这个脚本实现的原理很简单的,就是得到源地址然后请求而已。因为它的源网站,在前端也暂时没有做反爬,就是处理一下图片而已,没什么技术含量。如果你有一点爬虫基础,写出这个脚本其实一点都不难的。
对于所指出的改进建议:
1、检测下载章节。这个是我之前没有想到的功能,但是这个暂时不会影响到大部分正常的的使用,就放在下次重大bug修复更新时,再稍带把这个功能加进去吧。
绝不是为了偷懒当然这个功能的实现无非就是检测一下以前是否下载过,或者在下载多章节时进行手动输入需要下载的章节什么的。实现的逻辑就这么简单,有兴趣可以自己试一试,没什么技术要求。
2、覆盖的问题。其实吧,这个目录的创建是基于它每一章节的title的,不过它没有完全一样的title,这个网站设计时就是这种逻辑,不用担心覆盖问题。
谢谢使用反馈!
网页异常数据引起的下载问题已经修复了。还添加了一些(我需要的)功能。
现在我这边修改的分支已经比较稳定了。大佬可以审查Pull request了。
@81628947 感谢您的Pull request!不过请查看最新的github readme。因为昨天被营运找了。我觉得还是不要再更新了,请谅解
现在反扒不是简单的等分十份再重组了QAQ
禁漫是不是不能爬了,需要反反爬蟲?
你这个博客好卡啊
图全部裂开了
现在禁漫图片的反爬从分割为10分改成了分割为16份…
不对,分割份数似乎是随机的