拷贝漫画是一个神奇的网站,他的服务器在新加坡,所以可以规避一些风险。资源也丰常丰富,但可惜的是目前还没有ios的客户端,直接看网页端的体验比较一般。所以就萌生出写一个爬虫来下到本地观看的想法。
# 制作时间 2021/9/2 10:36
#此为搜索功能模块提供,拷贝漫画搜索资源库,回报搜索结果和提供详情页的功能
import requests,os
from urllib import parse
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time
'''测试连接'''
print('欢迎使用不可名状的漫画下载器v1\n软件版本 V2 更新时间2021-9-2 有问题加\n正在连接境外服务器请稍后....\n注意安装浏览器驱动chromedriver.exe')
utl1='https://www.copymanga.com/'
text1=str(requests.get(utl1))
text2="<Response [200]>"
'''联网检测函数'''
'''向下滑动函数'''
def slide1():
for wert in range(300):
ActionChains(diverex).key_down(Keys.PAGE_DOWN).key_up(Keys.PAGE_DOWN).perform()
time.sleep(0.2)
if wert%15==0:
time.sleep(2)
def slide2(qqq):
for wert in range(qqq):
ActionChains(diverex).key_down(Keys.PAGE_UP).key_up(Keys.PAGE_UP).perform()
time.sleep(0.2)
try:
if text1==text2:
print('服务器连接成功!')
'''开始抓包'''
headers={'User-Agent':
'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.'
'4515.159 Mobile Safari/537.36 Edg/92.0.902.84'}
need_name=input('请输入你想要搜索的漫画名称\n在此输入:')
need_name2=parse.quote(need_name)
utl=f'https://www.copymanga.com/api/kb/web/searchs/comics?offset=0&platform=2&limit=12&q={need_name2}&q_type='
sosuoweb=requests.get(utl)
wer_er=sosuoweb.json()
'''这里输出一个带有所有缩影漫画的内容的列表'''
wer_er2=wer_er['results']['list']
'''遍历元祖的项目'''
dic_link={}
name2={}#这里存储所哟序号对应的漫画名称
for list_name in wer_er2:#
look = list_name['path_word']
'''导出所有元祖里面的name属性'''
face_link = f'https://api.copymanga.com/api/v3/comic/' + look + f'/group/default/chapters?limit='
'''导出所有元组里面对应的 抓包链接'''
dic_link[i] = face_link
'''吧序号和连接绑定,准备后面引用'''
print(i, list_name['name'])
name2[i]=list_name['name']
i += 1
'''将输入的序号和字典内容匹配提取utl'''
name1=int(input('请输入下载漫画的序号,以回车结束\n:'))
out_link1=dic_link[name1]
print('正在解析')
list2=[]
for yema in range(100,500,100):
out_link2=out_link1+f'{yema}&offset=0'
over_link=requests.get(out_link2).json()
list2+=over_link['results']['list']
print('正在解析')
list_i=1
second_dic={}
myh_list={}
for last_name2 in list2:
meiyihua=last_name2['name']+'--'
mg_id='https://www.copymanga.com/comic/'+look+'/chapter/'+last_name2['uuid']
second_dic[list_i]=mg_id
if list_i%5==0:
abd='\n'
else:
abd = ' '
print(meiyihua,f'下载序号-{list_i} ',end=abd)
myh_list[list_i]=last_name2['name']
list_i+=1
'''print(myh_list.items()) 这个是显示 每个下载序列是那个名字'''
'''获取每一话的漫画界面'''
lalb=input('\n请输入下载序号星号不要,以回车结束\n若是想进行区间下载可以输入开始和结束下载序号,中间用一个空格分隔,例:1 5\n:')
print(lalb)
la=int(lalb.split()[0])
lb=int(lalb.split()[-1])
list_last=[]
'''创建漫画文件夹'''
if os.path.isdir(name2[name1]):
else:
os.mkdir(name2[name1])
'''打开浏览器'''
diverex = webdriver.Chrome(executable_path='./chromedriver.exe')
diverex.set_window_size(480, 800)
'''打开漫画阅读界面准备爬取'''
for inin in range(la,lb+1):
last_link = second_dic[inin]
print(last_link)
'''创建每一话的下载目录'''
if os.path.isdir(f"{name2[name1]}/{myh_list[inin]}"):
os.makedirs(f"{name2[name1]}/{myh_list[inin]}(1)")
if os.path.isdir(f"{name2[name1]}/{myh_list[inin]}(1)"):
os.makedirs(f"{name2[name1]}/{myh_list[inin]}(2)")
if os.path.isdir(f"{name2[name1]}/{myh_list[inin]}(2)"):
os.makedirs(f"{name2[name1]}/{myh_list[inin]}(3)")
if os.path.isdir(f"{name2[name1]}/{myh_list[inin]}(3)"):
os.makedirs(f"{name2[name1]}/{myh_list[inin]}(4)")
else:
os.makedirs(f"{name2[name1]}/{myh_list[inin]}")
'''浏览器打开漫画阅读界面准备爬取'''
diverex.get(last_link)
'''滚轮到最下的函数'''
slide1()
'''这里是一共有几张图片'''
lixt_shuzi = len(diverex.find_elements_by_xpath('html/body/div[1]/div/ul/li'))
'''print(lixt_shuzi,'图片数目')'''
'''缓冲时间'''
if lixt_shuzi>30:
slide2(120)
elif lixt_shuzi>50:
slide2(200)
elif lixt_shuzi>80:
slide2(320)
elif lixt_shuzi>120:
slide2(480)
elif lixt_shuzi>200:
slide2(800)
elif lixt_shuzi > 300:
slide2(1200)
'''创建每一张的名字和其对应的图片链接'''
for ex in range(1,lixt_shuzi+1):
lixt_down=diverex.find_elements_by_xpath(f"html/body/div[1]/div/ul/li[{int(ex)}]/img")[0].get_attribute("src")
print(lixt_down)
xiazai=requests.get(lixt_down)
'''开始写入漫画'''
with open(f"{name2[name1]}/{myh_list[inin]}/第{ex}页.jpg",'wb') as f:
f.write(xiazai.content)
f.close()
else:
print("连接失败!请检查网络连接并重启软件")
input('按任意键退出')
except:
print("老兄你有参数输错了,软件重开试试吧\n"
"可能出现的问题:\n"
"1.选择漫画的时候输入的是最前面的序号。\n"
"2.下载的时候单独下载一话只要输入一个下载序号即可\n"
"3.区间下载先写开始的序号然后是空格(只有一个)然后写结束的序号")
input('按任意键退出')
比喻的修辞手法
微信小程序