首页 编程教程正文

知音漫客爬虫(高清付费都可以)

piaodoo 编程教程 2020-02-22 22:01:10 923 0 python教程

本文来源吾爱破解论坛

本帖最后由 729 于 2019-2-13 22:47 编辑

第一次发这种贴,不会排版。。。可以下载付费的,图片应该属于高清的。至于变量太乱的问题不要纠结。里面很多都没有优化,可能还会出错
纯属练习,因为知音的包太好抓了.
如有违规,管理帮删下呗.或者通知一下呗,毕竟付费也可以下载的。[Python] 纯文本查看 复制代码

import requests
import os
import json
from bs4 import BeautifulSoup
def GetAll():#获取知音漫客的所有漫画书名以及ID
    hearad={#添加请求头,要不请求不会成功
    'Host': 'www.zymk.cn'
            }
    All=requests.get('http://www.zymk.cn/nodeapi/comic/allComic/',headers=hearad)#返回一个json的数据
    data=json.loads(All.text)#进行数据格式化
    data=data['data']#取出有所有漫画的数据
    return data#返回漫画数据
def GetId(Word,m):#关键词搜索,返回漫画名字与ID
    for o in m:#遍历所有漫画数据,含有关键词时输出
        if Word in o['comic_name']:
            print(o['comic_name']+'ID:'+str(o['comic_id']))
def GetCt(demo):#获取所有章节名称与地址,为下面爬取图片的准备地址.
    pt=[]
    soup=BeautifulSoup(demo,'html.parser')
    ct=soup.find(id='chapterList')
    List=ct.find_all(class_='item')
    for l in List :
        a=l.find('a')
        href=a.get('href')
        name=a.string
        pt.append(dict(name=name,href=href))
    return pt#返回一个列表,列表里面每一个元素都是一个字典,每个字典都是一个章节的名字和地址
def Get(name,ID,pt,letter):
    os.mkdir('D:\\'+name)#创建一个目录,为保存漫画做准备
    print('开始进行下载...')
    for p in pt :#进行循环,保存每一个章节.
        #GetM(name,ID,p['href'],p['name'].strip(),letter)
        url=requests.get('https://www.zymk.cn/'+ID+'/'+p['href'])#构建每个章节的url
        soup=BeautifulSoup(url.text,'html.parser')#使用BeautifulSoup分析html页面
        page=soup.find(class_='totalPage').string#查找每章节的最大页数
        #图片的url构建:https://mhpic.zymkcdn.com/comic/漫画名第一个字的首字母/漫画名/章节名+GQ/页数.jpg-zymk.middle.webp
        #有些漫画不一样,比如,斗破苍穹之大主宰....就不一样了,这里只是通用的.
        #然后付费通知啊,url 又是不同的.所以保存的图片也是假的
        html='https://mhpic.zymkcdn.com/comic/'+str(letter)+'/'+name+'/'+p['name'].strip()+'GQ'+'/'#构建爬取图片的地址通用部分
        if requests.get(html+'1.jpg-zymk.middle.webp').status_code==404:#url组合规则有几种,现在试错.这只是其中一个
            html='https://mhpic.zymkcdn.com/comic/'+str(letter)+'/'+name+'/'+p['name'].strip()+'/'
        for i in range(1,int(page)+1):#循环爬取每章节的所有图片,并保存
            imge=requests.get(html+str(i)+'.jpg-zymk.middle.webp')#爬取图片
            with open ('D:\\'+name+'\\'+str(p['name'].strip())+str(i)+'.webp','wb',) as f :
                f.write(imge.content)
        print('保存'+p['name'].strip()+'完成')
    print('全部保存完毕,请注意查看D盘')
#以下代码是从百度找到的,主要用来判断中文的首字母.
def single_get_first(unicode1):
    str1 = unicode1.encode('gbk')
    try:
        ord(str1)
        return str1
    except:
        asc = str1[0] * 256 + str1[1] - 65536
        if asc >= -20319 and asc <= -20284:
            return 'a'
        if asc >= -20283 and asc <= -19776:
            return 'b'
        if asc >= -19775 and asc <= -19219:
            return 'c'
        if asc >= -19218 and asc <= -18711:
            return 'd'
        if asc >= -18710 and asc <= -18527:
            return 'e'
        if asc >= -18526 and asc <= -18240:
            return 'f'
        if asc >= -18239 and asc <= -17923:
            return 'g'
        if asc >= -17922 and asc <= -17418:
            return 'h'
        if asc >= -17417 and asc <= -16475:
            return 'j'
        if asc >= -16474 and asc <= -16213:
            return 'k'
        if asc >= -16212 and asc <= -15641:
            return 'l'
        if asc >= -15640 and asc <= -15166:
            return 'm'
        if asc >= -15165 and asc <= -14923:
            return 'n'
        if asc >= -14922 and asc <= -14915:
            return 'o'
        if asc >= -14914 and asc <= -14631:
            return 'p'
        if asc >= -14630 and asc <= -14150:
            return 'q'
        if asc >= -14149 and asc <= -14091:
            return 'r'
        if asc >= -14090 and asc <= -13119:
            return 's'
        if asc >= -13118 and asc <= -12839:
            return 't'
        if asc >= -12838 and asc <= -12557:
            return 'w'
        if asc >= -12556 and asc <= -11848:
            return 'x'
        if asc >= -11847 and asc <= -11056:
            return 'y'
        if asc >= -11055 and asc <= -10247:
            return 'z'
        return ''
def getPinyin(string):
    if string==None:
        return None
    lst = list(string)
    charLst = []
    for l in lst:
        charLst.append(single_get_first(l))
    return  ''.join(charLst)
def is_Chinese(word):
    for ch in word:
        if '\u4e00' <= ch <= '\u9fff':
            return getPinyin(word)
        else:
            return word

m=GetAll()#获取所有漫画数据
key=input('输入漫画关键词')#
GetId(key,m)
ID=input('输入漫画ID')
name=input('输入漫画精确名字')
letter=is_Chinese(name[0])
r=requests.get('https://www.zymk.cn/'+ID)#访问漫画的首页
pt=GetCt(r.text)
Get(name,ID,pt,letter)

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7305.html

搜索