Python丨聽說這個地方的漫畫不錯,只用40行代碼,給它全部爬下來

来源:https://www.cnblogs.com/hahaa/archive/2022/09/15/16697881.html
-Advertisement-
Play Games

前因後果 公司新來的小姐姐,超級喜歡看漫畫,天天給我介紹,好煩~ 現在是2022年9月15日16點30,於是我決定, 五點下班前寫個代碼把她說的漫畫全部爬下來,應付一下~ 再發篇文章揭露她的罪惡,嘿嘿~ 準備事項 環境使用 Python 3.8 Pycharm 2021.2版本 模塊使用 impor ...


前因後果

公司新來的小姐姐,超級喜歡看漫畫,天天給我介紹,好煩~

現在是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例

希望對你有所幫助哈~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我的設計模式之旅,本節實現武器生產工廠,用Golang實現簡單工廠模式,用C#實現工廠方法模式。對工廠方法模式進行了細緻的介紹。 ...
  • 我的設計模式之旅,本文是對《大話設計模式》基礎知識的補充。原書部分概念沒有說清楚,如里氏替換原則的幾點要求,三大類設計模式各個概念等等,為補充相關知識我閱讀了《深入設計模式》,於是有了這篇前置文章。方便入門程式員瞭解更多基礎知識。 ...
  • 安全是產品的底座,是體驗的基礎,也是企業的一項核心競爭力。安全生產是一項系統性的工作,同時也是一件比較瑣碎的事,需要做方方面面的考慮盡一切可能保障系統安全穩定運行。個人之前一直負責商品的穩定性工作,在這方面有比較多的經歷和實踐。 記得在18年的時候,我們做商品發佈的組件化改造,當時正好碰上網站剛開... ...
  • 我的設計模式之旅,使用 Golang 實現。本節實現策略模式與簡單工廠。編程旅途是漫長遙遠的,在不同時刻有不同的感悟,本文會一直更新下去。 ...
  • 有時候,我們明明在類或者方法上添加了@Transactional註解,卻發現方法並沒有按事務處理。其實,以下場景會導致Spring的@Transactional事務失效。 1、事務方法所在的類沒有載入到Spring IOC容器中。 @Transactional是Spring的註解,未被Spring管 ...
  • 個人博客:槿蘇的知識鋪 一、什麼是自動裝配 SpringBoot 定義了一套介面規範,這套規範規定:SpringBoot在啟動時會掃描外部引用jar包中的META-INF/spring.factories文件,將文件中配置的類型信息載入到Spring容器,並執行類中定義的各種操作。對於外部jar包來 ...
  • 真是一本透著編程思想的書。 上面的書讓你從微觀角度瞭解 Java,而這本書則可以讓你從一個巨集觀角度瞭解 Java。 這本書和 Java 核心技術的厚度差不多,但這本書的信息密度比較大。 所以,讀起來是非常耗大腦的,因為它會讓你不斷地思考。 對於想學好 Java 的程式員來說,這是一本必讀的書。 -... ...
  • 上一篇我們學習了多對一的處理,這次我們來學習一對多的處理。 一對多的處理與多對一的處理差別不大,只是有一些細微的地方需要註意。 我們還是先做準備工作,其他部分與多對一的準備工作相同,僅實體類構建需要做出改變。 一、修改實體類 Student類: package com.jms.pojo; publi ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...