整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Python爬取腾讯动漫全站漫画详细教程(附带源码)

Python爬取腾讯动漫全站漫画详细教程(附带源码)

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者:merlin&

操作环境

  • 编译器:pycharm社区版
  • python 版本:anaconda python3.7.4
  • 浏览器选择:Google浏览器

需要用到的第三方模块:requests , lxml , selenium , time , bs4,os

网页分析

  • 明确目标

首先我们打开腾讯动漫首页,分析要抓取的目标漫画。找到腾讯动漫的漫画目录页,简单看了一下目录,发现全站的漫画数量超过了三千部(感觉就是爬下来也会把内存撑爆)

于是我觉得爬取首页的推荐漫画会是一个比较好的选择(爬取全站漫画只需要稍稍改一下网址构造就可以做到了)

  • 提取漫画地址

选定了对象之后,就应该想办法来搞到漫画的地址了右击检查元素,粗略看一遍网页的源代码,这时我发现里面有很多连续的

标签,我猜测每部漫画的地址信息就存储在这些标签里面

随便打开一个《li》标签,点击里面包裹的链接地址会跳转到一个新的网页,这个网页正是我想要找的漫画地址,可以见得我的猜测是正确的,等到实际操作的时候再用表达式提取信息就非常容易了

  • 提取漫画章节地址

进入漫画的目录页,发现一页最多可以展示20章的漫画目录,要想更换显示还需要点击章节名上面的选项卡来显示其他章节的地址

接下来就需要我们来检查网页元素想办法来获取章节地址了,同样右击检查元素在看到了源代码后,我发现了一个非常惊喜的事情,这个源码里面包含着所有的章节链接,而不是通过动态加载来展示的,这就省去了我们提取其他章节链接的功夫,只需要花心思提取漫画图片就可以了

这里每个《p》标签下包含了五个《a》标签,每个《li》标签下包含了四个《p》标签,而每个漫画的链接就存在每个《a》标签中,可以轻松通过语法来提取到每页的链接信息

  • 提取漫画图片

怎么将漫画的图片地址提取出来并保存到本地,这是这个代码的难点和核心先是打开漫画,这个漫画页应该是被加上了某些措施,所以它没办法使用右键查看网页源代码,但是使用快捷键[ctrl + shift +i]是可以看到的

按下[ctrl + shift + i],检查元素

通过第一次检查,可以发现网页的元素中只有前几张图片的地址信息,后面的信息都为后缀.gif的文件表示,这些gif文件就是图片的加载动画

接着向下滑动到底部,等待图片全部显示出来再次检查元素

现在所有的漫画图片全部显示出来,下方并无.gif 的文件,由此可知,腾讯动漫是以js异步加载来显示图片的,要想获取页面的全部图片,就必须要滑动滚动条,将全部的图片加载完成再进行提取,这里我选择selenium模块和chromedriver来帮助我完成这些操作。下面开始进行代码的编写。

编写代码

  • 导入需要的模块
import requests
from lxml import etree
from selenium import webdriver     #selenium模拟操作
from time import sleep
from bs4 import BeautifulSoup
from selenium.webdriver.chrome.options import Options        #谷歌无头浏览器
import os
  • 获取漫画地址

这里我使用的是xpath提取漫画地址信息,在谷歌浏览器中使用xpath helper插件辅助编写xpath表达式

#打开腾讯动漫首页
url='https://ac.qq.com/'
#给网页发送请求
data=requests.get(url).text
#将网页信息转换成xpath可识别的类型
html=etree.HTML(data)
#提取到每个漫画的目录页地址
comic_list=html.xpath('//a[@class="in-rank-name"]/@href')
print(comic_list)

print一下输出的comic_list,提取成功

  • 提取漫画的内容页

内容页的提取也很简单,就像上面的分析一样,使用简单的xpath语法即可提取

然后我们再将漫画的名字提取出来,方便为保存的文件夹命名

#遍历提取到的信息
for comic in comic_list:
    #拼接成为漫画目录页的网址
    comic_url=url + str(comic)
    #从漫画目录页提取信息
    url_data=requests.get(comic_url).text
    #准备用xpath语法提取信息
    data_comic=etree.HTML(url_data)
    #提取漫画名--text()为提取文本内容
    name_comic=data_comic.xpath("//h2[@class='works-intro-title ui-left']/strong/text()")
    #提取该漫画每一页的地址
    item_list=data_comic.xpath("//span[@class='works-chapter-item']/a/@href")
    print(name_comic)
    print(item_list)

print打印的信息:

  • 提取章节名

刚刚我们输出的是漫画页的地址字段,但是通过这些字段并不能请求到信息,还需在前面加上域名才可以构成一个完整的网址提取章节名是为了在漫画名的文件夹下再为每个章节创建一个文件夹保存漫画图片

    for item in item_list:
        #拼接每一章节的地址
        item_url=url + str(item)
        #print(item_url)
        #请求每一章节的信息
        page_mes=requests.get(item_url).text
        #准备使用xpath提取内容
        page_ming=etree.HTML(page_mes)
        #提取章节名
        page_name=page_ming.xpath('//span[@class="title-comicHeading"]/text()')
        print(page_name)

打印章节名:

  • 获取漫画源网页代码

这个部分的代码是这个代码的核心部分,也是花费时间最久的部分首先我们知道通过正常的方式没有办法请求到所有的图片地址信息,若是使用抓包方法会变得非常难分析,所以我采用的是模拟浏览器滑动的方法来获得图片的地址信息为了方便看到结果,先将webdriver设置为有界面模式,等到实现想要的功能之后,再将它隐藏起来

        #webdriver位置
        path=r'/home/jmhao/chromedriver'
        #浏览器参数设置
        browser=webdriver.Chrome(executable_path=path)
        #开始请求第一个章节的网址
        browser.get(item_url)
        #设置延时,为后续做缓冲
        sleep(2)
        #尝试执行下列代码
        try:
            #设置自动下滑滚动条操作
            for i in range(1, 100):
                #滑动距离设置
                js='var q=document.getElementById("mainView").scrollTop=' + str(i * 1000)
                #执行滑动选项
                browser.execute_script(js)
                #延时,使图片充分加载
                sleep(2)
            sleep(2)
            #将打开的界面截图保存,证明无界面浏览器确实打开了网页
            browser.get_screenshot_as_file(str(page_name) + ".png")
            #获取当前页面源码
            data=browser.page_source
            #在当前文件夹下创建html文件,并将网页源码写入
            fh=open("dongman.html", "w", encoding="utf-8")
            #写入操作
            fh.write(data)
            #关掉浏览器
            fh.close()
        # 若上述代码执行报错(大概率是由于付费漫画),则执行此部分代码
        except Exception as err:
            #跳过错误代码
            pass

运行之后会自动打开漫画的内容页,并拖动右侧的滑动条(模拟了手动操作,缓慢拖动是为了让图片充分加载),其中的sleep方法和网速有一定的关系,网速好的可以适当减少延时的时间,网速差可适当延长在写拖动滑动条的代码时,我尝试了非常多种拖动写法,也模拟了按下方向键的操作,可是只有这一种方法使用成功了。我认为失败的原因可能是刚打开界面的时候会有一个导航条挡住滑块,导致无法定位到滑块的坐标(因为我用其他网页测试的时候都是可以拖动的)

使用的try是为了防止有一些章节会弹出付费窗口,导致程序报错,使后续无法运行,即遇到会报错的情况就跳过此段代码,执行except中的选项

这段程序运行完之后有一个dongman.html文件保存在当前文件夹下,里面就包含了所有图片的url,接下来只要读取这个文件的内容就可以提取到所有的漫画地址了

  • 下载漫画图片

当我们保存完网页的源代码之后,接下来的操作就变得简单了 我们要做的就是提取文件内容,将图片下载到本地

#用beautifulsoup打开本地文件
            html_new=BeautifulSoup(open('dongman.html', encoding='utf-8'), features='html.parser')
            #提取html文件中的主体部分
            soup=html_new.find(id="mainView")
            #设置变量i,方便为保存的图片命名
            i=0
            #提取出主体部分中的img标签(因为图片地址保存在img标签中)
            for items in soup.find_all("img"):
                #提取图片地址信息
                item=items.get("src")
                #请求图片地址
                comic_pic=requests.get(item).content
                #print(comic_pic)
                #尝试提取图片,若发生错误则跳过
                try:
                    #打开文件夹,将图片存入
                    with open('comic/' + str(name_comic) + '/' + str(page_name) + '/' + str(i + 1) + '.jpg', 'wb') as f:
                        #print('正在下载第 ', (i + 1), ' 张图片中')
                        print('正在下载' , str(name_comic) , '-' , str(page_name) , '- 第' , (i+1) , '张图片')
                        #写入操作
                        f.write(comic_pic)
                        #更改图片名,防止新下载的图片覆盖原图片
                        i +=1
                #若上述代码执行报错,则执行此部分代码
                except Exception as err:
                    #跳过错误代码
                    pass

  • 下载结果

到了这里代码就写完了,来看一下运行结果:

打开文件夹看到:

完整代码

今年的5月1日起,国内全网的《海贼王》漫画都进入了收费模式。虽然大部分的观众都很支持正版收费,不过版权方会不会因为《海贼王》的人气而狮子大开口也是很多观众担心的话题,而接下来,小编就给大家对比一下国内《海贼王》漫画和其他地区的收费对比。

在国内,《海贼王》漫画的正版代理有两家,分别是腾讯漫画和B站。其中,腾讯漫画每一话的价格是49点券,折合人民币是0.49元(非活动价格),而B站《海贼王》漫画的价格是49漫币,同样是0.49元(非活动价格)。

然后我们来看看《海贼王》官网上的价格,在官网上,想阅读一话《海贼王》漫画需要花费30日元,折合成人民币是1.98元。并且,官网上购买的《海贼王》漫画是有阅读期限限制的,时间是2天。

接下来我们再来看看《少年JUMP周刊》的电子版,电子版《少年JUMP》每期的价格是290日元,换算成人民币是19.15元。由于每本《少年JUMP》上面都有多部漫画连载,所以这个具体价格还是要看你追多少部漫画,如果你追十部,那么每一部一话的价格是1.9元

当然,《少年JUMP》电子版也有包月的模式,包月的价格是980日元一个月,换成人民币就是64.7元,按照每个月有4期来算,每期的价格是16.1元,比不包月便宜了3块钱。如果你同样是追里面的十部漫画,那么每部漫画每一话是1.61元

紧接着,我们再来看看《海贼王》集英社单行本的价格(实体书和电子版价格一样),集英社的单行本是每卷460日元,折合人民币30.3元。而每卷单行本一般有9-11话,我们按11话来算,也就是每一话大约2.75元

说完了日本地区的价格,我们再来看看台湾省的价格。台湾东立出版的单行本(实体书)价格是105新台币,换成人民币大概24.8元。然后我们依旧按照每一卷单行本有11话来算,每一话的价格大约是2.25元

另外,东立出版的单行本也有电子版,不过它的电子版价格会比实体书便宜一点,每卷是55新台币,换成人民币大概13元。按照每一卷有11话来算,东立的单行本电子版每一话也需要1.18元

这么看下来,国内《海贼王》漫画每一话0.49元的价格已经是最低的了,看来这次腾讯真的良心发现了。最后,对于国内《海贼王》漫画的收费标准,你有什么看法呢?你会掏钱去看吗?欢迎在下方评论区留言。

│ 骨朵国漫

与音乐付费、视频付费相同,漫画付费的方式对年轻用户来说是很容易接受的一件事。今天骨朵国漫(ID:guduoguoman)将对小明太极、快看漫画、腾讯动漫这三家漫画平台付费内容和免费内容的相关数据展开分析。

小明太极付费与免费作品表现

从《小明太极付费收费作品收藏数top30》的榜单中,我们发现该平台平均每部作品付费集数占总集数的百分比是82.2%。然而当我们分析该榜单的具体名单后发现,小明太极平台收费作品大多数为男性向作品。以前10名为例,均为男性向漫画作品。

如《斗破苍穹》《斗罗大陆》《绝世唐门》《斗罗大陆3龙王传说》《武动乾坤》等作品,都是男性向大IP网文改编漫画,这些头部IP漫画在小明太极平台的收费效果非常好。

在《小明太极付费作品收藏数top30独家/非独家作品对比》的图表当中,独家作品数量为5部,非独家作品数为25部。

从《小明太极免费作品收藏数top30》的榜单中,我们发现该榜单top10作品中男性向作品和女性向作品占比较为平均。

其中,《X龙时代》《苍穹榜之圣灵纪》《逆天邪神》《雪鹰领主》等为男性向作品;而《王牌校草》《暗夜新娘》《哦,我的宠妃大人》《倾国妖宠》等为女性向作品。

从《小明太极免费作品收藏数top30独家/非独家作品对比》的图表当中,独家作品数量为11部,非独家作品数为19部。

从《小明太极作品收藏数top50》的榜单当中,我们发现小明太级漫画平台等大部分头部作品都需要付费,甚至到榜单的前14名作品全部为付费内容。

从《小明太极作品收藏数top50 》当中,付费作品数量有48部,免费作品数仅有2部。

从《小明太极作品收藏数top50 独家/非独家作品对比》的图表当中,独家作品数量有6部,非独家作品数为44部。

看漫画付费与免费作品表现

从《快看漫画付费收费作品收藏数top30》的榜单中,我们发现该平台平均每部作品付费集数占总集数的百分比是64.3%。分析该榜单的具体名单后我们发现,前十作品中大多数为女性向作品,如第一名《你的血很甜》等。

值得一提的是第二名《魔道祖师》,仅有4%的付费集数与总集数的百分比。而该作品在快看漫画本平台的销量榜为第四名,作为全网收费章节最少的作品,该漫画的追新用户最高。

从《快看漫画付费作品收藏数top30独家/非独家作品对比》的图表当中,独家作品数量为20部,非独家作品数为10部。

从《快看漫画免费作品收藏数top30》的榜单中,我们发现该榜单top10的作品当中,大部分为该独家平台头部IP,如《怦然心动》《甜美的咬痕》《朝花惜时》等。由此可见,快看漫画作品转付费收费的上升空间更高。

从《快看漫画免费作品收藏数top30独家/非独家作品对比》的图表当中,独家作品数量为26部,非独家作品数为4部。

其中,这26部独家作品大部分为快看漫画头部IP,这也从侧面说明该目前的战略布局以吸引流量为主。

从《快看漫画作品收藏数top50》的榜单当中,我们发现快看漫画大部分头部作品并未免费付费内容,甚至到榜单的前10部作品全部为免费付费内容。

而前20名作品中仅有《你的血很甜》和《魔道祖师》两部作品为付费作品。而这两部作品在本榜单的排名为第13、14名,却是付费榜的冠军和亚军。

从《快看漫画作品收藏数top50 付费/免费作品对比》的图表当中,付费作品数量仅有6部,免费作品数为44部。

从《快看漫画作品收藏数top50独家/非独家作品对比》的图表当中,独家作品数量为42部,非独家作品数为8部。

讯动漫付费与免费作品表现

从《腾讯动漫付费作品收藏数top30》的榜单中,我们发现该平台付费集数的平均百分比是50.7%。

分析该榜单的具体名单后我们发现,该平台前10名的作品当中,除《绑架明星做男票》外均为该平台老IP。

从《腾讯动漫付费作品收藏数top30独家/非独家作品对比》的图表当中,独家作品数量为23部,非独家作品数为7部。

从《腾讯动漫免费作品收藏数top30》的榜单中,我们发现该榜单top10男性向作品和女性向作品的数量占比所差不多。

其中包括以《中国惊奇先生》《尸兄》(我叫白小飞)等独家男性向作品,以及《王爷不要啊》等独家女性向作品。

从腾讯视频将《中国惊奇先生》《尸兄》(我叫白小飞)两部头部作品作为免费付费作品来看,该平台当前的战略布局还处于吸引用户、拉拢流量的阶段。

从《腾讯动漫免费作品收藏数top30独家/非独家作品对比》的图表当中,独家作品数量为25部,非独家作品数为5部。

从《腾讯动漫作品收藏数top50》的榜单当中,我们发现腾讯动漫付费作品数量占比达到了74%,免费作品数量占比为26%。

值得注意的是,本榜单前五名与付费榜的排名相同。

从《腾讯动漫作品收藏数top50 付费/免费作品对比》的图表当中,付费作品数量仅有37部,免费作品数为13部。

从《腾讯动漫作品收藏数top50 独家/非独家作品对比》的图表当中,独家作品数量有37部,非独家作品数为13部。