Python丨听说这个地方的漫画不错,只用40行代码,给它全部爬下来 ...

打印 上一主题 下一主题

主题 1030|帖子 1030|积分 3090

前因后果

公司新来的小姐姐,超级喜欢看漫画,天天给我介绍,好烦~
现在是2022年9月15日16点30,于是我决定, 五点下班前写个代码把她说的漫画全部爬下来,应付一下~
再发篇文章揭露她的罪恶,嘿嘿~

准备事项

环境使用
  1. Python 3.8
  2. Pycharm 2021.2版本
复制代码
 
模块使用
  1. import requests >>> # 数据请求模块  pip install requests
  2. import re  # 正则模块
  3. import os   #  文件操作模块
复制代码
 
基本流程思路
一. 数据来源分析
  1. 1. 确定自己需求:
  2.     采集那个网站上面什么数据内容
  3.     https://www.dongmanmanhua.cn 网址自己补全一下,实在不知道的话文末见。
  4. 正常访问流程:
  5.     1. 选中漫画 ---> 目录页面 <请求列表页面 获取所有章节链接>
  6.     2. 选择一个漫画内容 ---> 漫画页面 <请求章节链接, 获取所有漫画内容url>
  7.     3. 看漫画内容 <保存数据, 漫画图片内容保存下来>
复制代码
分析流程:
  1.     1. 查看漫画图片url地址, 是什么样子
  2.         https://cdn.dongmanmanhua.cn/166052717362315191169.jpg?x-oss-process=image/quality,q_90
  3.     2. 分析url地址在哪里
  4.         通过搜索功能 <开发者工具>  166052717362315191169
  5.         https://www.dongmanmanhua.cn/BOY/moutianchengweimoshen/116-%E7%AC%AC43%E7%AB%A0-%E5%A2%9E%E5%8A%A0%E6%88%98%E6%96%97%E5%8A%9B%E5%90%A73/viewer?title_no=1519&episode_no=116
复制代码
F12打开开发者工具, 进行刷新网页
点击Img
通过对比分析请求url地址变化 —> 漫画内容都是来于章节链接里面
二. 代码实现步骤过程
  1. 1. 发送请求 ---> 对于目录页面发送请求
  2. 2. 获取数据 ---> 服务器返回响应数据 <网页源代码数据>
  3. 3. 解析数据 ---> 提取想要章节链接 / 漫画名字 / 章节名字
  4. 4. 发送请求 ---> 对于章节链接发送请求
  5. 5. 获取数据 ---> 服务器返回响应数据 <网页源代码数据>
  6. 6. 解析数据 ---> 提取想要图片链接
  7. 7. 保存数据 ---> 保存到本地
复制代码
效果展示

不知不觉都四千多张图了,大家别一窝蜂去爬了,等下网站崩了就不好了~

代码展示

发送请求
def 自定义函数关键字
get_response: 自定义函数名字
模拟浏览器对于url地址发送请求
param html_url: 自定义形式参数
return: 响应对象
  1. def get_response(html_url):
  2.     # 请求头 headers 模拟浏览器 ---> 字典数据类型, 构建完整键值对 <伪装请求头可以复制粘贴>
  3.     headers = {
  4.         # referer 防盗链 告诉服务器请求url地址 是从哪里跳转过来
  5.         'referer': 'https://www.dongmanmanhua.cn/',
  6.         # User-Agent  浏览器基本身份信息
  7.         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
  8.     }
  9.     # 通过数据请求模块 去发送请求
  10.     response = requests.get(url=html_url, headers=headers)
  11.     # return 返回 ---> 在代码里面 调用 get_response  函数 这个函数, 会给我们返回 response 这个数据
  12.     return response
复制代码
 
获取章节链接 / 漫画名字 / 章节名字
  1. def get_info(html_url):
  2.     # 调用发送请求函数
  3.     html_data = get_response(html_url).text
  4.     # re正则提取数据
  5.     name = re.findall("title_title: '(.*?)',", html_data)[0]  # 提取漫画名字
  6.     chapter_url_list = re.findall('data-sc-name="PC_detail-page_related-title-list-item".*?href="(.*?)"', html_data, re.S)
  7.     title_list = re.findall('<span ><span>(.*?)</span></span>', html_data)
  8.     return name, chapter_url_list, title_list
复制代码
 
获取漫画url地址
  1. def get_img_url(chapter_url):
  2.     # 调用发送请求函数
  3.     chapter_data = get_response(chapter_url).text
  4.     # re获取所有漫画图片内容
  5.     img_url_list = re.findall('alt="image"  data-url="(.*?)"', chapter_data)
  6.     # 403 Forbidden 没有访问权限  ---> 通过代码得到数据 请求头里面加防盗链
  7.     return img_url_list
复制代码
 
保存数据
  1. def save(name, title, img_url):
  2.     """
  3.     :param name: 漫画名
  4.     :param title: 图片名
  5.     :param img_url: 图片链接
  6.     :return:
  7.     """
  8.     # 自动创建文件夹
  9.     file = f'img\\{name}\\'
  10.     # 如果没有这个文件夹的话
  11.     if not os.path.exists(file):
  12.         # 自动创建文件夹
  13.         os.makedirs(file)
  14.     # 对于图片链接发送请求 获取二进制数据
  15.     img_content = get_response(img_url).content
  16.     # file + title  保存地方以及保存文件名 mode 保存方式
  17.     with open(file + title, mode='wb') as f:
  18.         # 写入数据
  19.         f.write(img_content)
  20.     print(name, title)
复制代码
 
主函数
整合上面所有内容
  1. def main(page):
  2.     """
  3.     完整源码及视频讲解再这个群 279199867 自取即可
  4.     :param page:
  5.     :return:
  6.     """
  7.     # 目录页面
  8.     link = f'https://www.dongmanmanhua.cn/BOY/moutianchengweimoshen/list?title_no=1519&page={page}'
  9.     # 调用获取章节链接 / 漫画名字 / 章节名字 函数
  10.     name, chapter_url_list, title_list = get_info(link)
  11.     # for循环遍历 提取数据
  12.     for chapter_url, chapter_title in zip(chapter_url_list, title_list):
  13.         # 字符串拼接
  14.         chapter_url = 'https:' + chapter_url
  15.         # 获取漫画内容
  16.         img_url_list = get_img_url(chapter_url)
  17.         # for循环遍历 提取数据
  18.         num = 1
  19.         for img_url in img_url_list:
  20.             title = chapter_title + str(num) + '.jpg'
  21.             # 调用保存数据函数
  22.             save(name, title, img_url)
  23.             # 每次循环 +1
  24.             num += 1
复制代码
 
函数入口, 当你代码被当作模块调用的时候, 下面的代码不执行。
  1. if __name__ == '__main__':
  2.     for page in range(12, 0, -1):
  3.         main(page)
复制代码
 
好了,今天的分享就到这喽,完整源码及视频讲解下方名片自取即可~
最后分享一套Python教程:Python实战100例
希望对你有所帮助哈~

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表