729 发表于 2019-2-13 22:00

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

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

第一次发这种贴,不会排版。。。可以下载付费的,图片应该属于高清的。至于变量太乱的问题不要纠结。里面很多都没有优化,可能还会出错
纯属练习,因为知音的包太好抓了.
如有违规,管理帮删下呗.或者通知一下呗,毕竟付费也可以下载的。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 * 256 + str1 - 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)
r=requests.get('https://www.zymk.cn/'+ID)#访问漫画的首页
pt=GetCt(r.text)
Get(name,ID,pt,letter)

729 发表于 2019-2-18 14:08

kirito_xing 发表于 2019-2-17 22:26
楼主
.webp格式为啥在谷歌浏览器打开也是黑色的,试了一下斗破苍穹这个漫画的

可能是比较老的漫画不行吧,其实不一样的就是图片的url规则不一样而已, 你可以自己去爬一下,很容易抓到包的 我只是学习一下而已{:1_907:}懒得更新了{:1_896:}

729 发表于 2019-2-14 14:16

DukeAss 发表于 2019-2-14 13:02
下载下来都是.webq的文件 而且很小只有几百字节

.webq也是图片格式啊,然后小还不好啊{:1_907:}

729 发表于 2019-2-13 22:51

忘记多进程了,多进程可能快点。。。

ZHXZHX 发表于 2019-2-14 00:41

难道是我打开的姿势不对吗?测试了一下,付费不能下载,

ZHXZHX 发表于 2019-2-14 00:55

谢谢分享,问题已解决

liberrun 发表于 2019-2-14 04:42

谢谢分享

多幸运遇见baby 发表于 2019-2-14 08:27

用心讨论,共获提升!

5register 发表于 2019-2-14 09:23

谢谢分享!

lzj1314 发表于 2019-2-14 09:29

谢谢分享!!!

looading 发表于 2019-2-14 11:44

这些代码怎么用啊。小白发问{:1_924:}

729 发表于 2019-2-14 11:49

本帖最后由 729 于 2019-2-14 12:02 编辑

looading 发表于 2019-2-14 11:44
这些代码怎么用啊。小白发问
下载python 下载相关的库 复制代码运行就行了
页: [1] 2
查看完整版本: 知音漫客爬虫(高清付费都可以)