爬虫基础之爬取 某漫画网站
网站: 漫画大全_漫画分类检索_好看的漫画 - 漫客栈
本案列中所使用的模块:
- requests
- re
- lxml from lxml import etree
分析步骤:
1.选择一本漫画打开
2.接着打开我们的开发者工具 F12 or 右击鼠标
因为漫画是图片形式存在的 点击 过滤图片数据
在左下角数据报中 找到我们的漫画图片 有很多都是左侧栏中的图片
发现这两个比较长的是漫画数据
3.接着我们将图片的url地址复制一段去搜索包含整个章节的漫画地址
Ctrl+F 快速打开搜索框 输入复制的一段链接 可以看到返回出来的两个接口 最后一个为漫画接口
可以复制里面的url到浏览器查看是否为漫画图片 图片的数量也可以对得上
5.接着点击标头就可以看到基本的请求信息 包括请求头 请求体 url地址
采集步骤:
一. 发送请求 模拟浏览器向服务器发送请求
#使用第三方模块requests
#在pycharm终端 执行如下指令即可 安装
#pip install requests
#复制标头里面的url地址 后面的参数可以不用复制
url = 'https://comic.mkzcdn.com/chapter/content/v1/?chapter_id=476064&comic_id=207622&format=1&quality=1&type=1'
#模拟浏览器向服务器发送请求
headers = {
'user-agent': #用户代理 表示浏览器基本的身份信息
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0'
}
# 之前看到预览中的数据格式为JSON 因此直接获取JSON 格式即可
resp = requests.get(url,headers=headers).json
pprint.pprint(resp)
带花括号的为JSON 格式的数据
我们返回的数据是JSON 格式的 有个模块可以进行json 格式的格式化使其代码方便观看
import pprint
运行完就可以看到我们想要的数据了
二. 解析数据 通过图片所在的page列表 键值对取值
# 提取图片所在的page列表
json_data = resp['data']['page']
# 循坏遍历
for page in json_data:
# 对图片链接进行取值
img = page['image']
print(img)
运行后的结果图
三. 保存数据 请求图片的URL地址保存二进制数据
#定义一个变量方便后续保存图片
num = 1
for page in json_data:
img = page['image']
# 对图片的地址发送请求
img_content = requests.get(url=img,headers=headers).content
# 保存数据 以二进制形式
with open('img\\'+str(num)+'.jpg','wb') as f:
f.write(img_content)
num+=1
print(f"第{num}张图片正在保存")
运行结果
对此 单个章节的数据采集完毕
批量数据的采集:
分析变化的数据:
不同的章节参数对比图 可以发现就第一个参数不一样 章节的id
之前的数据包中有我们所需要的page_id 请求此数据包拿到id
直接搜索id 在返回的接口中找到想要的id
all_url = 'https://comic.mkzcdn.com/chapter/v1/?comic_id=207622'
# 发送请求
# 得到json 数据
resp = requests.get(url=all_url, headers=headers).json()
# 提取数据
link_json = resp['data']
# for循坏遍历数据 把之前的for循坏嵌套进来
for link in link_json:
# 提取章节ID
ID = link['chapter_id']
# 提取章节名字
Name = link['title']
pprint.pprint(link_json)
# 将里面的参数进行替换
url = f'https://comic.mkzcdn.com/chapter/content/v1/?chapter_id={ID}&comic_id=207622&format=1&quality=1&type=1'
#这样就可以进行 多个章节的爬取了
可能在爬取个别章节的时候 章节名中可能出现特殊字符 将会报错 这时候我们可以使用re 正则来替换
#导入re
import re
fi_name = re.sub(r'[\\/:*?<>|]','',Name)
最后的结果 正本的章节内容都可以爬取
至于多本漫画的爬取
可以在根目录 打开开发者工具 搜索漫画的名字对比 不同点
做法:
获取该数据包的url地址 向此地址发送请求 拿到所有的书id
采用正则 去提取静态页面中的数据
# 拿到地址
init_url = 'https://www.mkzhan.com/category/'
# 发送请求
re_text = requests.get(url=init_url, headers=headers).text
# 获取数据
html_text = etree.HTML(re_text)
# 提取数据
all_href = html_text.xpath("//*[@class='cover']/@href")
for href in all_href:
# 处理数据 转换成字符串类型数据 替换多余的字符 只要纯数字
fi_href = ''.join(href).replace('/','')
print(fi_href)
再嵌套一层循坏就可以啦 选中后面的数据 按Tab键 缩进代码 后面再改个参数就完成咯
本次的案例分享就到这里 感谢大家的观看!
后续会持续更新 点个关注不迷路 谢谢