前因後果 公司新來的小姐姐,超級喜歡看漫畫,天天給我介紹,好煩~ 現在是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例
希望對你有所幫助哈~