1. 程式人生 > >python 知音漫客所有漫畫下載,付費漫畫又如何?

python 知音漫客所有漫畫下載,付費漫畫又如何?

 

重點,付費的漫畫可免費下載哦。算不算福利

我已經打包好exe,沒有安裝環境的同學也可以使用了。

 
https://pan.baidu.com/s/1TrUZHgMQ3rg2mPi-FieXpQ 提取碼:2te7 

 

本程式可以下載知音漫客所有漫畫:

只需要執行程式輸入相應的漫畫名字就可以了

 

 

第一次嘗試做這個下載漫畫的程式碼

5天時間,遇到了各種問題,

終於作品出來了,

目前還有點瑕疵,後續再修改

 
[list=1] [*]#注意,要用到谷歌無頭瀏覽器哦,,可以自己去安裝, [*]import os [*]import re [*]import requests [*]from tkinter import * [*]from lxml import etree [*] [*]# 匯入chrome無頭瀏覽器 [*]from selenium import webdriver [*]from selenium.webdriver.chrome.options import Options [*] [*]''' [*]下面的函式作用及功能: [*]1,獲取到要下載書籍的最新(最大)章節,以便後面遍歷章節需要。 [*]2,獲取到每一章節的名字與url, [*]3,遍歷每一章節的url,獲取到每一章節一共有多少分頁(話) [*]4,呼叫函式【url_key(url) # 獲取到最新章節圖片的url,分析規則。】 [*]5,呼叫函式【save_img(ZhangJie, pn_high, book_names, html) # 進行圖片儲存】 [*]''' [*] [*] [*]def all_all(url, book_names): [*] headers = { [*] 'User-Agent': 'Mozilla/5.0(Windows NT 10.0; Win64; x64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/70.0.3538.77Safari/537.36', [*] } [*] req = requests.get(url, headers=headers) # .content#proxies= [*] html = etree.HTML(req.text) [*] [*] pn_list = [] # 獲取最新章節,或者是最大的章節 [*] url_keys = [] [*] for i in range(1, 5): # 獲取前5個章節 [*] pn2 = html.xpath('//*[@id="chapterList"]/li[{}]/a/@title'.format(i)) [*] pn2 = re.findall('\d+', str(pn2)) [*] if len(pn2) > 0: [*] # print(pn2[0],333333333333) [*] url_k = html.xpath('//*[@id="chapterList"]/li[{}]/a/@href'.format(i)) # 獲取到最大章節的url [*] url_keys.append(url_k[0]) # 將最大章節URL 返回 [*] pn_list.append(pn2[0]) # 將最大章節 返回 [*] pn = max(pn_list) # 返回最大的章節 [*] [*] confirmLabel.delete(0, END) # 清空文字框 [*] confirmLabel.insert(END, '{}一共有{}章'.format(book_names, pn), '\n', ) # 列印到GUI介面 [*] confirmLabel.insert(END, '圖片將儲存在本程式執行的資料夾,請注意檢視哦', '\n') # 列印到GUI介面 [*] window.update() # 重新整理文字框顯示內容 [*] [*] htmls = url_key(url + url_keys[pn_list.index(pn)]) # 查詢pn在列表裡面的第幾個,相應的取第幾個URL [*] [*] save_img(int(pn), url, book_names, htmls, html) [*] [*] [*]# 獲取到最新章節圖片的url,分析規則。 [*]def url_key(url): [*] chrome_options = Options() [*] chrome_options.add_argument("--headless") [*] driver = webdriver.Chrome(chrome_options=chrome_options) [*] [*] driver.get(url) [*] webpage = driver.page_source [*] driver.close() [*] return webpage # 返回最新一章的頁面內容,用作檢視url規則 [*] [*] [*]# 儲存圖片函式 [*]def save_img(ZhangJie, url, book_names, htmls, html): [*] htmlsf = etree.HTML(htmls) [*] req = htmlsf.xpath('/html/body/div[1]/div[1]/div[2]/div[1]/img/@src') [*] urls = str(req) [*] s = re.findall('%E8%AF%9D.*%2F1', urls) [*] url_key = re.sub('%E8%AF%9D|%2F1|\[\'|\'|\]', '', str(s)) [*] url_tou = re.sub('2F\d+\S+|\[\'', '', urls) [*] for i in range(1, ZhangJie + 1): [*] # for pn in range(1, int(pn_high[i - 1]) + 1): [*] # 獲取到每一章節的名字與url [*] pnx = html.xpath( [*] '//*[@id="chapterList"]/li[{}]/a/@title|//*[@id="chapterList"]/li[{}]/a/@href'.format(i, i)) [*] if str(pnx).find('話') >= 0: [*] req = requests.get(url + pnx[0]) [*] htmlsa = etree.HTML(req.text) [*] url_f = htmlsa.xpath('//*[@class="totalPage"]') # 獲取到章節最大頁碼 [*] # pn_high.append(url_f[0].text) [*] pnp = url_f[0].text [*] [*] for pn in range(1, int(pnp) + 1): [*] [*] # 加key不加.webp [*] urlz = 'https:{}2F{}%E8%AF%9D{}%2F{}.jpg-zymk.middle'.format(url_tou, ZhangJie + 1 - i, url_key, pn) [*] # 加key 加.webp [*] urlz1 = 'https:{}2F{}%E8%AF%9D{}%2F{}.jpg-zymk.middle.webp'.format(url_tou, ZhangJie + 1 - i, url_key,pn) [*] # 不加key 加.webp [*] urlz2 = 'https:{}2F{}%E8%AF%9D{}%2F{}.jpg-zymk.middle.webp'.format(url_tou, ZhangJie + 1 - i, '', pn) [*] # 不加key 不加.webp [*] url_s = 'https:{}2F{}%E8%AF%9D%2F{}.jpg-zymk.middle'.format(url_tou, ZhangJie, pn) [*] [*] # print(ZhangJie + 1 - i, url_key) [*] # print(urlz) [*] req_baocun = requests.get(urlz) [*] [*] if req_baocun.status_code == 200: [*] # print(url) [*] [*] with open('{}\第{}話-{}節.jpg'.format(book_names, ZhangJie + 1 - i, pn), 'wb') as f: [*] f.write(req_baocun.content) [*] # print('第{}話-{}節-儲存完成'.format(ZhangJie+1-i, pn)) [*] confirmLabel.insert(END, '{}第{}話-第{}節-儲存完成'.format(book_names, ZhangJie + 1 - i, pn)) [*] confirmLabel.see(END) # 游標移動到最後顯示 [*] window.update() # 重新整理文字框顯示內容 [*] [*] elif requests.get(urlz1).status_code == 200: [*] [*] req_baocun = requests.get(urlz1) [*] # print(urlz1) [*] with open('{}\第{}話-{}節.jpg'.format(book_names, ZhangJie + 1 - i, pn), 'wb') as f: [*] f.write(req_baocun.content) [*] # print('第{}話-{}節-儲存完成'.format(ZhangJie+1-i, pn)) [*] confirmLabel.insert(END, '{}第{}話-第{}節-儲存完成'.format(book_names, ZhangJie + 1 - i, pn)) [*] confirmLabel.see(END) # 游標移動到最後顯示 [*] window.update() # 重新整理文字框顯示內容 [*] [*] elif requests.get(urlz2).status_code == 200: [*] [*] req_baocun = requests.get(urlz2) [*] # print(urlz2) [*] with open('{}\第{}話-{}節.jpg'.format(book_names, ZhangJie + 1 - i, pn), 'wb') as f: [*] f.write(req_baocun.content) [*] # print('第{}話-{}節-儲存完成'.format(ZhangJie+1-i, pn)) [*] confirmLabel.insert(END, '{}第{}話-第{}節-儲存完成'.format(book_names, ZhangJie + 1 - i, pn)) [*] confirmLabel.see(END) # 游標移動到最後顯示 [*] window.update() # 重新整理文字框顯示內容 [*] [*] elif requests.get(url_s).status_code == 200: [*] [*] # print("失敗,重新拼接URL") [*] req_baocun_s = requests.get(url_s).content [*] print(url_s) [*] with open('{}\第{}話-{}節.jpg'.format(book_names, ZhangJie + 1 - i, pn), 'wb') as f: [*] f.write(req_baocun_s) [*] # print('第{}話-{}節-儲存完成'.format(ZhangJie+1-i, pn)) [*] confirmLabel.insert(END, '{}第{}話-第{}節-儲存完成'.format(book_names, ZhangJie + 1 - i, pn)) [*] confirmLabel.see(END) # 游標移動到最後顯示 [*] window.update() # 重新整理文字框顯示內容 [*] print('已經全部儲存完成') [*] confirmLabel.insert(END, '已經全部儲存完成') [*] confirmLabel.see(END) # 游標移動到最後顯示 [*] window.update() # 重新整理文字框顯示內容 [*] [*] [*]# 查詢書籍的id函式 [*]def book_name(namee): [*] n = namee [*] url = 'https://www.zymk.cn/api/getsortlist/?callback=getsortlistCb&key={}&topnum=20&client=pc'.format(n) [*] req = requests.get(url) # .content [*] res = re.findall('"comic_id":\d+', str(req.text)) [*] res = re.findall('\d+', str(res)) [*] res1 = re.findall('"comic_name":"\s*?\S*?"', str(req.text)) [*] res1 = re.findall(':"\s*\S*"', str(res1)) [*] res2 = re.sub(r'[\/\\\:\*\?"\<\>\|\[\]\.]', '', str(res1)) [*] res2 = re.findall(r"'(.+?)'", res2) [*] [*] zidian = dict(zip(res, res2)) [*] # print('查詢到以下內容:', '\n', zidian) [*] return zidian [*] [*] [*]# 選擇要現在的書籍函式 [*]def namee(): [*] confirmLabel.delete(0, END) # 清空文字框 [*] namee = namee_Entry.get() [*] zidian = book_name(namee) # 調用搜索書名函式 [*] [*] if len(zidian) != 0: # 返回的字典為空,提示重新輸入,否則正常執行 [*] confirmLabel.insert(END, '\t', ' 請雙擊要下載的漫畫:', '\t') [*] [*] for i in zidian.items(): [*] confirmLabel.insert(END, i) [*] # confirmLabel.see(END) # 游標移動到最後顯示 [*] [*] else: [*] # print('請輸入要下載的漫畫:') [*] confirmLabel.insert(END, '請輸入要下載的漫畫:' + '\t') [*] [*] [*]def xuanze(event): # 選擇要下載的漫畫 [*] zidian = confirmLabel.get(confirmLabel.curselection()) [*] # print(zidian) [*] if type(zidian) == tuple: # 判斷點選是否為搜尋的內容, [*] confirmLabel.delete(0, END) # 清空文字框 [*] confirmLabel.insert(END, '開始下載:', '\n', zidian[1]) [*] [*] # print('開始下載 {}'.format(zidian[1])) [*] isExists = os.path.exists('./{}'.format(zidian[1])) [*] if not isExists: [*] os.mkdir(zidian[1]) [*] [*] # print('https://www.zymk.cn/{}/'.format(zidian[0]), zidian[1]) [*] all_all('https://www.zymk.cn/{}/'.format(zidian[0]), zidian[1]) [*] [*] [*]window = Tk() [*]window.geometry('600x600+500+200') # 視窗大小 [*]window.title('漫畫下載--本程式將搜尋知音漫客網站資訊') [*] [*]taitouLabel = Label(window, text="請輸入要下載的漫畫: ", height=4, width=30, font=("Times", 20, "bold"), fg='red') [*] [*]namee_Entry = Entry(window, width=25, font=("Times", 20, "bold")) [*] [*]button = Button(window, text="搜尋", command=namee, ) # .grid_location(33,44) [*]GunDongTiao = Scrollbar(window) # 設定滑動塊元件 [*]confirmLabel = Listbox(window, height=15, width=55, font=("Times", 15, "bold"), fg='red', bg='#EEE5DE', [*] yscrollcommand=GunDongTiao.set) # Listbox元件新增Scrollbar元件的set()方法 [*]# window.iconbitmap('timg.ico')#設定視窗圖示 [*]confirmLabel.bind('<Double-Button-1>', xuanze) # 雙擊選擇文字框的內容 [*] [*]GunDongTiao.config(command=confirmLabel.yview) # 設定Scrollbar元件的command選項為該元件的yview()方法 [*] [*]taitouLabel.grid(column=1) [*]namee_Entry.grid(row=1, column=1, sticky=N + S) [*]button.grid(row=1, column=1, sticky=E) [*] [*]confirmLabel.grid(row=3, column=1, sticky=E) [*]GunDongTiao.grid(row=3, column=2, sticky=N + S + W) # 設定垂直滾動條顯示的位置 [*]window.mainloop() [*] [*] [*] [*] [/list]