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

前因后果

公司新来的小姐姐,超级喜欢看漫画,天天给我介绍,好烦~

现在是2022年9月15日16点30,于是我决定, 五点下班前写个代码把她说的漫画全部爬下来,应付一下~

再发篇文章揭露她的罪恶,嘿嘿~

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

; 准备事项

环境使用

Python 3.8
Pycharm 2021.2版本

模块使用

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

基本流程思路

一. 数据来源分析

1. 确定自己需求:
    采集那个网站上面什么数据内容
    https://www.dongmanmanhua.cn 网址自己补全一下,实在不知道的话文末见。
正常访问流程:
    1. &#x9009;&#x4E2D;&#x6F2B;&#x753B; ---> &#x76EE;&#x5F55;&#x9875;&#x9762; <请求列表页面 获取所有章节链接>
    2. &#x9009;&#x62E9;&#x4E00;&#x4E2A;&#x6F2B;&#x753B;&#x5185;&#x5BB9; ---> &#x6F2B;&#x753B;&#x9875;&#x9762; <请求章节链接, 获取所有漫画内容url>
    3. &#x770B;&#x6F2B;&#x753B;&#x5185;&#x5BB9; <保存数据, 漫画图片内容保存下来>
</保存数据,></请求章节链接,></请求列表页面>

分析流程:

    1. &#x67E5;&#x770B;&#x6F2B;&#x753B;&#x56FE;&#x7247;url&#x5730;&#x5740;, &#x662F;&#x4EC0;&#x4E48;&#x6837;&#x5B50;
        https://cdn.dongmanmanhua.cn/166052717362315191169.jpg?x-oss-process=image/quality,q_90
    2. &#x5206;&#x6790;url&#x5730;&#x5740;&#x5728;&#x54EA;&#x91CC;
        &#x901A;&#x8FC7;&#x641C;&#x7D22;&#x529F;&#x80FD; <开发者工具>  166052717362315191169
        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. &#x53D1;&#x9001;&#x8BF7;&#x6C42; ---> &#x5BF9;&#x4E8E;&#x76EE;&#x5F55;&#x9875;&#x9762;&#x53D1;&#x9001;&#x8BF7;&#x6C42;
2. &#x83B7;&#x53D6;&#x6570;&#x636E; ---> &#x670D;&#x52A1;&#x5668;&#x8FD4;&#x56DE;&#x54CD;&#x5E94;&#x6570;&#x636E; <网页源代码数据>
3. &#x89E3;&#x6790;&#x6570;&#x636E; ---> &#x63D0;&#x53D6;&#x60F3;&#x8981;&#x7AE0;&#x8282;&#x94FE;&#x63A5; / &#x6F2B;&#x753B;&#x540D;&#x5B57; / &#x7AE0;&#x8282;&#x540D;&#x5B57;
4. &#x53D1;&#x9001;&#x8BF7;&#x6C42; ---> &#x5BF9;&#x4E8E;&#x7AE0;&#x8282;&#x94FE;&#x63A5;&#x53D1;&#x9001;&#x8BF7;&#x6C42;
5. &#x83B7;&#x53D6;&#x6570;&#x636E; ---> &#x670D;&#x52A1;&#x5668;&#x8FD4;&#x56DE;&#x54CD;&#x5E94;&#x6570;&#x636E; <网页源代码数据>
6. &#x89E3;&#x6790;&#x6570;&#x636E; ---> &#x63D0;&#x53D6;&#x60F3;&#x8981;&#x56FE;&#x7247;&#x94FE;&#x63A5;
7. &#x4FDD;&#x5B58;&#x6570;&#x636E; ---> &#x4FDD;&#x5B58;&#x5230;&#x672C;&#x5730;
</网页源代码数据></网页源代码数据>

效果展示

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

; 代码展示

发送请求

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

模拟浏览器对于url地址发送请求
param html_url: 自定义形式参数
return: 响应对象

def get_response(html_url):
    # 请求头 headers 模拟浏览器 ---> 字典数据类型, 构建完整键值对
    headers = {
        # referer 防盗链 告诉服务器请求url地址 是从哪里跳转过来
        'referer': 'https://www.dongmanmanhua.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

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

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('(.*?)', html_data)
    return name, chapter_url_list, title_list

获取漫画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

保存数据

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)

主函数

整合上面所有内容

def main(page):
"""
    完整源码及视频讲解再这个群 279199867 自取即可
    :param page:
    :return:
"""
    # 目录页面
    link = f'https://www.dongmanmanhua.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

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

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

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

最后分享一套Python教程:Python实战100例

希望对你有所帮助哈~

Original: https://www.cnblogs.com/hahaa/p/16697881.html
Author: 轻松学Python
Title: Python丨听说这个地方的漫画不错,只用40行代码,给它全部爬下来

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612142/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java企业官网源码 自适应响应式 freemarker 静态引擎 模块设计方案

    系统设计: 1.网站后台采用主流的 SSM 框架 jsp JSTL,网站后台采用freemaker静态化模版引擎生成html 2.因为是生成的html,所以访问速度快,轻便,对服务…

    数据库 2023年6月6日
    0288
  • 关于ThreadLocal的一道面试题

    问:上面这段代码会输出什么?为什么? 为什么输出1然后空指针了? 输出1是没有任何问题的。那空指针是为什么呢? 因为这是两个线程,子线程和主线程。子线程设置1,主线程肯定拿不到啊。…

    数据库 2023年6月16日
    0106
  • MySQL 关于 only_full_group_by 限制

    先上结论 如果 only_full_group_by 被启用,那么在查询时,如果某个列不在group by 列表中,此时如果不对该列进行聚合处理,则该列不能出现在 select 列…

    数据库 2023年6月16日
    0100
  • MySQL事务

    事务用于保证数据的一致性,由一组相关的dml语句组成,该组的dml语句要么全部成功后提交,要么全部失败。进行一个事物操作时,也可以防止其它用户修改表的数据。 举个例子:转账这个操作…

    数据库 2023年6月16日
    087
  • java中如何打印出一个类中所有变量呢?

    下文笔者将讲述,使用java代码打印出一个类中所有变量的方法分享,如下所示: 在日常开发中,我们经常需获取一个类的变量信息,然后操作变量,那么该如何编写此类代码呢?当然我们可以借助…

    数据库 2023年6月11日
    073
  • 【StoneDB研发日志】union功能bug记录

    1、问题现象 create database syw_mtr; use syw_mtr; CREATE TABLE t1 (f1 VARCHAR(255) CHARACTER SE…

    数据库 2023年5月24日
    082
  • MySQL变量、流程控制和游标

    变量、流程控制和游标 变量 在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果的数据 系统变量 变量由系统定义,属于服务器级别 […

    数据库 2023年5月24日
    067
  • opencv

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月9日
    078
  • docker的相关命令

    docker的相关命令 1.安装docker: (1)yum -y install docker ​ sudo sh get-docker.sh 2.从远程拉取应用的镜像源: do…

    数据库 2023年6月16日
    076
  • linux-centos常用命令

    01-centos-常用命令 1.centos防火墙 关闭 systemctl stop firewalld 禁止开机启动防火墙 systemctl disable firewal…

    数据库 2023年6月11日
    098
  • RocksDB上锁机制

    RocksDB作为一个开源的存储引擎支持事务的ACID特性,而要支持ACID中的I(Isolation),并发控制这块是少不了的,本文主要讨论RocksDB的锁机制实现,细节会涉及…

    数据库 2023年6月9日
    068
  • CronExpression使用笔记

    CronExpression一般是使用在自动任务中,可以指定任务执行的时间或者时间规律,下面记录一下表达试的使用说明 CronExpression由7个子表达式组成,7个子表达式之…

    数据库 2023年6月9日
    0103
  • Java中的命名规则

    在查找java命名规则时,未在国内相关网站查找到较为完整的文章,这是一篇国外程序开发人员写的java命名规则的文章,原文是英文写的,为了便于阅读,遂翻译为汉语,以便帮助国内开发者有…

    数据库 2023年6月11日
    092
  • Mysql的知识梳理

    数据准备: –建表 create table customer_jia(CID int(4), Cname varchar(20), Csex varchar(2), …

    数据库 2023年5月24日
    0117
  • 部署zabbix监控服务

    部署zabbix监控服务 部署zabbix监控服务 什么是zabbix zabbix的特点 zabbix的配置文件 部署zabbix zabbix服务端安装 准备工作 数据库操作 …

    数据库 2023年6月14日
    097
  • MySQL Operator 01 | 架构设计概览

    高日耀 资深数据库内核研发毕业于华中科技大学,喜欢研究主流数据库架构和源码,并长期从事分布式数据库内核研发。曾参与分布式 MPP 数据库 CirroData 内核开发(东方国信),…

    数据库 2023年5月24日
    0103
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球