草庐IT

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

轻松学Python 2023-04-17 原文

前因后果

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

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

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

准备事项

环境使用

Python 3.8
Pycharm 2021.2版本

 

模块使用

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

 

基本流程思路

一. 数据来源分析

1. 确定自己需求:
    采集那个网站上面什么数据内容
    https://www.dongmanmanhua.cn 网址自己补全一下,实在不知道的话文末见。
正常访问流程:
    1. 选中漫画 ---> 目录页面 <请求列表页面 获取所有章节链接>
    2. 选择一个漫画内容 ---> 漫画页面 <请求章节链接, 获取所有漫画内容url>
    3. 看漫画内容 <保存数据, 漫画图片内容保存下来>

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

    1. 查看漫画图片url地址, 是什么样子
        https://cdn.dongmanmanhua.cn/166052717362315191169.jpg?x-oss-process=image/quality,q_90
    2. 分析url地址在哪里
        通过搜索功能 <开发者工具>  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. 发送请求 ---> 对于目录页面发送请求
2. 获取数据 ---> 服务器返回响应数据 <网页源代码数据>
3. 解析数据 ---> 提取想要章节链接 / 漫画名字 / 章节名字
4. 发送请求 ---> 对于章节链接发送请求
5. 获取数据 ---> 服务器返回响应数据 <网页源代码数据>
6. 解析数据 ---> 提取想要图片链接
7. 保存数据 ---> 保存到本地

效果展示

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

代码展示

发送请求

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('<span class="subj"><span>(.*?)</span></span>', 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例

希望对你有所帮助哈~

有关Python丨听说这个地方的漫画不错,只用40行代码,给它全部爬下来的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  4. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  5. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  6. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  7. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  8. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. 程序员如何提高代码能力? - 2

    前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源

随机推荐