这里写目录标题

  • 漫画爬虫之动态加载(外部加载)——以知音漫客为例
    • 思路
    • 提取目录及其URL
    • 获取漫画目录真正的URL
    • 获取每话的漫画内容
    • 保存图片
    • 综合代码

漫画爬虫之动态加载(外部加载)——以知音漫客为例

本文皆以《第一话上》为例
目标网站:知音漫客(请点击这里)
目标漫画:元尊(请点击这里)
链接失效就自己上网搜吧~
最后有详细代码和解释

思路

  1. 找到漫画目录并且拿到文字标题及其URL
  2. 找到每章节漫画的内容
  3. 保存漫画

提取目录及其URL

  1. 首先打开知音漫客找到元尊,然后检查页面元素(F12),找到目录的body:

  2. 写代码把目录及其URL取出来

import requests
from bs4 import BeautifulSoup
import osclass downloader(object):  # 定义全局变量def __init__(self):self.url = 'https://www.zymk.cn/1966/'self.list_names = []self.list_urls = []# 提取目录def get_name_url(self):req = requests.get(url=self.url)req.encoding = req.apparent_encodingreqhtml = BeautifulSoup(req.text, features='lxml')  reqhtml = reqhtml.find_all('ul', class_='chapter-list clearfix')  # 相当于正则表达式的效果bf = BeautifulSoup(str(reqhtml), features='lxml')a = bf.find_all('a')for one in a[::-1]:  # 结果是倒序的,要顺序的self.list_names.append(one.string)self.list_urls.append(self.url + one.get('href'))return self.list_urls, self.list_namesif __name__ == '__main__':down = downloader()down.get_name_url()

代码结果:

获取漫画目录真正的URL

可以点击上面我们找到的URL,验证我们是否正确。
以第一话漫画为例:

这时我很高兴,我以为我找到了我想要的URL,获取该网页的源码:

import requests
from bs4 import BeautifulSoup
import os
import json
req = requests.get(url='https://www.kanman.com/105855/1hs.html')
print(req.text)

代码部分截图:

我们用Element里的图片URL和代码获取网页源码的图片URL是对应不上的,也访问不了,直接显示403,加上headers和from data也不行,这说明了我们要的内容URL不在这里。没有在HTML里找到的图片URL,那么它应该是动态加载的。
Network里找:

接下来是体力活了,只能一个个找,也不知道哪个才是我们想要的,最终我们锁定这个文件,它让我们看到了熟悉的东西,也可以实现访问,返回图片,这就是我们想要的:

就找第一张图片的URL去验证一下:

状态码:200,说明返回联通。现在我们找到了真正的URL:

URL里"?"之后的都是参数,给服务器检索信息等用的,这些参数可以在General这列最后可以找到:

观察多章漫画URL发现规律:只有“chapter_newid”这个参数是变化的,其它均不变,这个参数也正好对应“第几话”。这里有个陷阱,这部漫画的每一话又分上下话,特别到了后面的付费章节(可以爬付费章节,这我也没想到,居然没做反爬……),id更是千奇百怪,这是踩坑的经验,所以要拿到“chapter_newid”这个参数,我们只能回到Element那里寻找,也可以requests请求返回的content里找:

然后把这些章节的id抠出来替换URL里的就得到了每一话的漫画URL了。

获取每话的漫画内容

import requests
from bs4 import BeautifulSoup
import os
import json
import pprintreq = requests.get(url='https://www.kanman.com/api/getchapterinfov2?product_id=1&productname=kmh&platformname=pc&comic_id=105855&chapter_newid=1hs&isWebp=1&quality=middle')
pprint.pprint(req.json())  # json文件格式化输出
json_data = req.json()
pic_url = json_data["data"]["current_chapter"]["chapter_img_list"]  # 提得每话漫画里的每张图片url
name = json_data["data"]["current_chapter"]["chapter_name"]  # 提得每话漫画的题目
print(pic_url)
print(name)

如果不知道json文件的定义和怎么提取它里面的数据,自己找一下吧。


这样子我们就可以直接从请求图片url保存图片。

保存图片

for循环就可以了,具体看后面详细代码。值得注意的是图片格式不是常用的.jpg和.png等等,是.webp。这有点坑……

综合代码

import requests  # 请求url用的
from bs4 import BeautifulSoup  # 提取信息用的
import os  # 文件操作用的
import json
import pprint  # json文件格式化输出用的库class downloader(object):  # 定义全局变量def __init__(self):self.url = 'https://www.zymk.cn/1966/'  self.unique = 1  # 防止文件名重复,作为序号使用,每次+1self.i = 0  # 遍历章节题目用的self.list_names = []  # 所有章节题目self.list_urls = []  # 所有章节urlself.true_urls = []  # 所有章节真正的url# 提取目录def get_name_url(self):req = requests.get(url=self.url)req.encoding = req.apparent_encoding  # 解决返回网页乱码问题reqhtml = BeautifulSoup(req.text, features='lxml')reqhtml = reqhtml.find_all('ul', class_='chapter-list clearfix')  # 定位章节url位置bf = BeautifulSoup(str(reqhtml), features='lxml')a = bf.find_all('a')  # 精确提取章节urlfor one in a[::-1]:  # 章节目录是倒序的,要顺序的self.list_names.append(one.string)  # 添加到名字列表里去self.list_urls.append(self.url + one.get('href'))  # 添加url# print(self.list_urls)# print(self.list_names)print("已完成目录提取")return self.list_urls, self.list_names# 获取内容def get_content(self):filename = '元尊'os.mkdir(filename)  # 创建父目录print("已完成父目录创建")for net in self.list_urls:  # 遍历章节urlrequrl = requests.get(url=net)requrl.encoding = requrl.apparent_encodingreqhtml = BeautifulSoup(requrl.text, features='lxml')reqhtml = reqhtml.find_all('link', rel='prefetch prerender')  # 提取章节id,chapter_newid# print(str(str(reqhtml).replace('[<link href="', '')).replace('.html" rel="prefetch prerender"/>]', ''))self.true_urls.append('https://www.kanman.com/api/getchapterinfov2?product_id=1&productname=kmh&platformname=pc&comic_id=105855&'+'chapter_newid='+str(str(reqhtml).replace('[<link href="', '')).replace('.html" rel="prefetch prerender"/>]', '')+'&isWebp=1&quality=middle')  # 这才是真正的章节urlprint("已完成{}真正的图片URL爬取".format(self.list_names[self.i]))self.i += 1print("已完成真正的漫画图片目录提取")for url in self.true_urls:  # 遍历真正的url,开始保存图片n = 1if requests.get(url=url).status_code == 200:  # 状态码200避免不必要的错误导致程序停止req = requests.get(url=url)json_data = req.json()  # json文件加载pic_url = json_data["data"]["current_chapter"]["chapter_img_list"]  # 提取图片urlname = json_data["data"]["current_chapter"]["chapter_name"]  # 提取图片名字if os.path.exists(filename + '/' + name):  # 防止文件名重复dirname = filename + '/' + name + 'self.unique'os.mkdir(dirname)self.unique += 1else:dirname = filename + '/' + nameos.mkdir(dirname)for pic in pic_url:  # 保存图片n += 1with open(dirname + '/' + str(n) + '.webp', 'wb') as file:  # 特别注意图片格式file.write(requests.get(url=pic).content)print("已完成{}爬取".format(name))else:print("第{}话爬取失败".format(name))continueif __name__ == '__main__':down = downloader()down.get_name_url()down.get_content()

爬虫实战之爬虫漫画(有意外发现哦~嘿嘿)相关推荐

  1. 爬虫实战之爬虫漫画(复现)

    目录 爬虫实战---动态网页内部加载 复现爬虫漫画 思路 所有章节的标题和URL 找到所有章节漫画内容 保存漫画 爬虫实战-动态网页内部加载 动态网页的爬取和静态网页的爬取不一样,静态网页我们想要的资 ...

  2. python爬虫实战,爬虫之路,永无止境

    python爬虫实战 好久没给大家跟新爬虫文章了,抱歉抱歉,这期给大家带来一篇小爬虫,希望大家喜欢,喜欢的来个关注,支持一下博主,谢谢各位了. 写代码了各位宝宝们 这里要注意一点就是要记得提前登录,c ...

  3. 入门小远学爬虫(二)(四)简单GET型网页爬虫实战——“前程无忧”爬虫岗位信息的爬取之正则概念以及Python中re库的简单应用

    文章目录 前言 一.正则表达式是什么? 二.正则表达式语法 1.简介 2.干货分享 三.re库 1.安装 2.用法 四.终于进入正题 小结 前言 这是本系列第一个实战项目的第四课,有关前三课相关的内容 ...

  4. 爬虫实战:爬虫加数据分析,重庆电气小哥一文带你分析重庆所有旅游景点

    寒假已经到了,玩是要玩的,作为一个地地道道的重庆电网小哥,今天想用python爬虫+数据分析 的方式告诉你重庆哪些地方好玩. 先上一张最后景区地点分布结果图 数据来源:去哪儿旅行 网址:去哪儿旅行-重 ...

  5. python微博爬虫实战_爬虫实战(一):爬取微博用户信息

    前言 最近做课设,是一个有关个人隐私安全的课题,在网上找了很多论文,最后上海交通大学的一篇硕士论文<面向社会工程学的SNS分析和挖掘>[1] 给了我很多灵感,因为是对个人隐私安全进行评估, ...

  6. scrapy框架开发爬虫实战——反爬虫策略与反反爬虫策略

    反爬虫.反反爬虫 简单低级的爬虫有一个很大的优点:速度快,伪装度低.如果你爬取的网站没有反爬机制,爬虫们可以非常简单粗暴地快速抓取大量数据,但是这样往往就导致一个问题,因为请求过多,很容易造成服务器过 ...

  7. nodejs爬虫实战_nodejs爬虫项目实战

    这篇文章主要介绍了NodeJS制作爬虫的全过程,包括项目建立,目标网站分析.使用superagent获取源数据.使用cheerio解析.使用eventproxy来并发抓取每个主题的内容等方面,有需要的 ...

  8. python爬虫实战-python爬虫实战一:分析豆瓣中最新电影的影评

    简介 刚接触python不久,做一个小项目来练练手.前几天看了<战狼2>,发现它在最新上映的电影里面是排行第一的,如下图所示.准备把豆瓣上对它的影评(短评)做一个分析. 目标总览 主要做了 ...

  9. python微博爬虫实战_Python爬虫实战演练:爬取微博大V的评论数据

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于IT共享之家 ,作者: IT共享者 理论篇 试想一个问题,如果我们要抓取某个微博大V ...

最新文章

  1. keras 的 example 文件 imdb_bidirectional_lstm.py 解析
  2. CrackMe_001
  3. vue页面自适应屏幕宽高_Vue+Element UI 高度实时自适应
  4. linux 命令输出保存为文件的三种方式
  5. python中怎么比较两个列表的大小_Python:找到两个列表中存在的给定长度的公共子列表...
  6. Linux复习资料——MySQL-client-5.6.50-1.el7.x86_64与MySQL-server-5.6.50-1.el7.x86_64包安装MySQL全过程
  7. 如何使用_如何使用Excel播放音乐
  8. 成本预算的四个步骤_全网推广步骤有哪些?
  9. windows7用VMware workstation安装ubuntu server 16.04 虚拟机
  10. Oracle数据库通过创建触发器实现自增功能
  11. 数据结构C++ 复旦大学
  12. aspnetpager 详解
  13. 一、高并发秒杀API简介与业务分析
  14. UML动态模型图简单介绍
  15. 2022年忍者必须死3到达无双纪念
  16. 一文搞定贷款利息计算
  17. 基于动态阈值、灰色世界、镜面法的自动白平衡
  18. React类组件的两种写法
  19. 浅议Linq和MoreLinq
  20. 揭秘狂热的支付宝红包“薅羊毛”套路赚钱法

热门文章

  1. 学习使用PN532来复制IC门禁卡
  2. 微信支付公的众号支付和扫码支付
  3. 全栈工程师开发实战之从入门到技术实战之02--vue指令
  4. 世界互联网大会展示前沿技术热议创新方向
  5. pdf添加书签操作介绍
  6. Linux文件与目录的复制、删除与移动(cp、rm、mv)
  7. X Window系统
  8. maven-resources-plugin报红
  9. 8瓶水和3只小老鼠的故事(python解决)思路
  10. 程序框图与计算机程序,_算法与程序框图_ppt.ppt