当前位置:   article > 正文

python | 女神喜欢看漫画?看我大展神通采集下它所有漫画_import os def display_comics(comics_folder): # 获取漫

import os def display_comics(comics_folder): # 获取漫画文件夹中的所有文

前言

大家早好、午好、晚好吖 ❤ ~

公司新来了一个小姐姐,看她的第一眼!

我就确定,是我女神没错了~嘿嘿嘿

最近,我发现她超级喜欢看漫画,于是!

我决定,写个代码把漫画全部获取下来~

献给我亲爱的女神~哈哈哈哈哈哈哈哈

准备事项

环境使用

  • Python 3.8

  • Pycharm 2021.2版本

第三方模块

  • import requests >>> 数据请求模块

如果安装python第三方模块:

  1. win + R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests)回车

  2. 在pycharm中点击Terminal(终端) 输入安装命令

基本流程思路

一. 数据来源分析
  1. 确定自己需求:

    获取什么数据内容

正常访问流程:

  1. 选中漫画

    —> 目录页面 <请求列表页面 获取所有章节链接>

  2. 选择一个漫画内容

    —> 漫画页面 <请求章节链接, 获取所有漫画内容url>

  3. 看漫画内容 <保存数据, 漫画图片内容保存下来>

分析流程: <开发者工具进行抓包分析>

  1. 查看漫画图片url地址, 是什么样子

  2. 分析url地址在哪里

    通过搜索功能 <开发者工具>

F12打开开发者工具, 进行刷新网页

点击Img

通过对比分析请求url地址变化 —> 漫画内容都是来于章节链接里面

二. 代码实现步骤过程
  1. 发送请求

    —> 对于目录页面发送请求

  2. 获取数据

    —> 服务器返回响应数据 <网页源代码数据>

  3. 解析数据

    —> 提取想要章节链接 / 漫画名字 / 章节名字

  4. 发送请求

    —> 对于章节链接发送请求

  5. 获取数据

    —> 服务器返回响应数据 <网页源代码数据>

  6. 解析数据

    —> 提取想要图片链接

  7. 保存数据

    —> 保存到本地

效果展示

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

代码展示

导入模块

import requests >>> # 数据请求模块  pip install requests
import re  # 正则模块
import os   #  文件操作模块
  • 1
  • 2
  • 3

发送请求

def 自定义函数关键字
get_response: 自定义函数名字

模拟浏览器对于url地址发送请求

param html_url: 自定义形式参数

return: 响应对象

def get_response(html_url):
    # 请求头 headers 模拟浏览器 ---> 字典数据类型, 构建完整键值对 <伪装请求头可以复制粘贴>
    headers = {
        # referer 防盗链 告诉服务器请求url地址 是从哪里跳转过来
        'referer': 'https://www.****.cn/',
        # User-Agent  浏览器基本身份信息
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.0.0 Safari/537.36'
    }
    # 通过数据请求模块 去发送请求
    response = requests.get(url=html_url, headers=headers)
    # return 返回 ---> 在代码里面 调用 get_response  函数 这个函数, 会给我们返回 response 这个数据
    return response
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

获取章节链接 / 漫画名字 / 章节名字

def get_info(html_url):
    # 调用发送请求函数
    html_data = get_response(html_url).text
    # re正则提取数据
    name = re.findall("title_title: '(.*?)',", html_data)[0]  # 提取漫画名字
    chapter_url_list = re.findall('data-sc-name="PC_detail-page_related-title-list-item".*?href="(.*?)"', html_data, re.S)
    title_list = re.findall('<span class="subj"><span>(.*?)</span></span>', html_data)
    return name, chapter_url_list, title_list
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

获取漫画url地址

def get_img_url(chapter_url):
    # 调用发送请求函数
    chapter_data = get_response(chapter_url).text
    # re获取所有漫画图片内容
    img_url_list = re.findall('alt="image" class="_images _centerImg" data-url="(.*?)"', chapter_data)
    # 403 Forbidden 没有访问权限  ---> 通过代码得到数据 请求头里面加防盗链
    return img_url_list
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

保存数据

def save(name, title, img_url):
    """
    :param name: 漫画名
    :param title: 图片名
    :param img_url: 图片链接
    :return:
    """
    # 自动创建文件夹
    file = f'img\\{name}\\'
    # 如果没有这个文件夹的话
    if not os.path.exists(file):
        # 自动创建文件夹
        os.makedirs(file)
    # 对于图片链接发送请求 获取二进制数据
    img_content = get_response(img_url).content
    # file + title  保存地方以及保存文件名 mode 保存方式
    with open(file + title, mode='wb') as f:
        # 写入数据
        f.write(img_content)
    print(name, title)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

主函数

整合上面所有内容

def main(page):

    # 目录页面
    link = f'https://地址我删了,会被屏蔽.cn/BOY/moutianchengweimoshen/list?title_no=1519&page={page}'
    # 调用获取章节链接 / 漫画名字 / 章节名字 函数
    name, chapter_url_list, title_list = get_info(link)
    # for循环遍历 提取数据
    for chapter_url, chapter_title in zip(chapter_url_list, title_list):
        # 字符串拼接
        chapter_url = 'https:' + chapter_url
        # 获取漫画内容
        img_url_list = get_img_url(chapter_url)
        # for循环遍历 提取数据
        num = 1
        for img_url in img_url_list:
            title = chapter_title + str(num) + '.jpg'
            # 调用保存数据函数
            save(name, title, img_url)
            # 每次循环 +1
            num += 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

函数入口, 当你代码被当作模块调用的时候, 下面的代码不执行。

if __name__ == '__main__':
    for page in range(12, 0, -1):
        main(page)
  • 1
  • 2
  • 3

好了,今天的分享就到这喽,完整源码及视频讲解下方名片自取即可~

尾语
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/55503

推荐阅读
相关标签