前言
大家早好、午好、晚好吖 ❤ ~欢迎光临本文章
如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码
环境使用:
-
Python 3.10
-
Pycharm
模块使用:
-
requests >>> pip install requests 数据请求模块
-
parsel >>> pip install parsel 数据解析模块
第三方模块安装:
win + R 输入cmd 输入安装命令 pip install 模块名
(如果你觉得安装速度比较慢, 你可以切换国内镜像源)
爬虫流程: 从单个数据到多个数据
一. 数据来源分析
-
明确需求: 明确采集的网站以及数据内容
网址: https://www.mkzhan.com/214062/1025745.html
数据: 漫画内容 38张漫画内容
-
抓包分析: 请求那个网址, 能够得到这38张图
-
打开开发者工具: F12 / 右键点击检查选择 network (网络)
-
刷新网页
-
找到漫画图片链接: 点击Img (图片)
单张地址: https://content.mkzcdn.com/image/20230804/64cccfe2ae025-800x1508.jpg!page-800-x?auth_key=1701173492-0-0-392b7f3719571ef0c99ca254a635aea2
-
通过关键字去搜索, 找到所有图片对应链接地址
单章漫画数据包地址: https://comic.mkzcdn.com/chapter/content/v1/?chapter_id=1025745&comic_id=214062&format=1&quality=1&sign=653488115409d382ed7ce4ad472e2074&type=1&uid=67916915
-
二. 代码实现步骤:
-
发送请求 -> 模拟浏览器对于url发送请求
-
获取数据 -> 获取服务器返回响应数据 <整个响应数据>
-
解析数据 -> 提取所有漫画图片链接
-
保存数据 -> 获取漫画内容, 保存本地文件夹中
多章数据采集: 基本的思路流程差不多
核心: 对比请求链接参数变化规律
-
最终话: https://comic.mkzcdn.com/chapter/content/v1/?chapter_id=1025745&comic_id=214062&format=1&quality=1&sign=653488115409d382ed7ce4ad472e2074&type=1&uid=67916915
-
630话: https://comic.mkzcdn.com/chapter/content/v1/?chapter_id=1025744&comic_id=214062&format=1&quality=1&sign=653488115409d382ed7ce4ad472e2074&type=1&uid=67916915
chapter_id
: 章节ID
获取到整本漫画内容章节ID, 就可以获取整本漫画内容
多个数据采集 -> 某某ID的改变
都可以在目录页面获取到
数据包链接地址: https://www.mkzhan.com/214062/
-
发送请求 -> 模拟浏览器对于url发送请求
-
获取数据 -> 获取服务器返回响应数据 <整个响应数据>
-
解析数据 -> 提取漫画名字 / 章节名字 / 章节ID
整站漫画内容采集: 获取到所有漫画ID即可
代码展示
# 导入数据请求模块 < 第三方 pip install requests >
import requests
# 导入数据解析模块 < 第三方 pip install parsel >
import parsel
# 导入文件操作模块
import os
“”"
发送请求 -> 模拟浏览器对于url发送请求
- 模拟浏览器
- 请求网址
- 发送请求
- requests.get() 表示使用get请求方法
“”"
- requests.get() 表示使用get请求方法
# 模拟浏览器: 请求头 (字典) <复制>
headers = {
# User-Agent 用户代理 表示浏览器基本身份信息
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}
# 请求链接
link = 'https://www.mkzhan.com/214062/'
# 发送请求
html_data = requests.get(url=link, headers=headers).text
“”"
解析数据 -> 提取漫画名字 / 章节名字 / 章节ID
-
css选择器 根据标签属性提取数据内容
-
xpath 根据标签节点提取数据内容
复制可以使用, 但是不能纯依赖复制 <需要系统学习css和xpath>
“”"
selector = parsel.Selector(html_data)
# 提取漫画名字
name = selector.css('.comic-title::text').get()
# 提取章节ID 章节名字 获取所有li标签
lis = selector.css('.j-chapter-item')
# 自动创建文件夹
filename = f'img\\{name}\\'
if not os.path.exists(filename):
os.makedirs(filename)
for li in list(reversed(lis)):
# 提取具体数据 a::attr(data-chapterid) 表示提取A标签里面 data-chapterid 属性
chapter_id = li.css('a::attr(data-chapterid)').get()
# a::text 表示提取A标签里面文本内容
title = li.css('a::text').getall()[-1].strip()
print(title)
# 请求网址 <复制>
url = f'https://comic.mkzcdn.com/chapter/content/v1/?chapter_id={chapter_id}&comic_id=214062&format=1&quality=1&sign=653488115409d382ed7ce4ad472e2074&type=1&uid=67916915'
# 发送请求 <Response [200]> 响应对象
response = requests.get(url=url, headers=headers)
“”"
获取数据 -> 获取服务器返回响应数据
-
response.text 获取响应文本数据 <字符串>
-
response.json() 获取响应json数据 <字典>
数据是花括号包裹 json() 一定要是完整json数据格式
-
response.content 获取响应二进制数据
图片 视频 音频 特定格式文件… <保存数据>
“”"
json_data = response.json()
“”"
解析数据 -> 提取所有漫画图片链接
字典取值: 键值对取值
根据冒号左边的内容[键], 提取冒号右边的内容[值]
“”"
# 提取图片所在列表
pages = json_data['data']['page']
print(pages)
num = 1
# for循环遍历, 提取每一个图片链接
for page in pages:
img = page['image']
“”"
保存数据 -> 获取漫画内容, 保存本地文件夹中
获取漫画内容: 对于漫画图片链接, 发送请求获取二进制数据
“”"
img_content = requests.get(url=img, headers=headers).content
# file: 文件路径 文件名字 文件格式 字符串格式化方法
with open(file=f'{filename}{title}{num}.jpg', mode='wb') as f:
# w 写入的字符串
# img_content 二进制数据
f.write(img_content)
print(img)
num += 1
尾语
好了,今天的分享就差不多到这里了!
对下一篇大家想看什么,可在评论区留言哦!看到我会更新哒(ง •_•)ง
喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!