前言
????????想批量下載網頁圖片卻嫌手動保存太麻煩?本文用 Python 帶你實現自動爬取,從分析網站到代碼運行,步驟清晰,新手也能快速上手,輕松搞定圖片批量獲取。
1.安裝模塊
????????在開始爬取圖片前,我們需要準備好工具和環境。這就像蓋房子前要準備好磚瓦和工具一樣,合適的環境能讓后續操作更順暢。
1.1環境安裝
《Python開發環境終極指南:從Conda環境配置到VSCode、PyCharm、Jupyter深度優化》_conda系統環境配置-CSDN博客文章瀏覽閱讀1.4k次,點贊47次,收藏31次。Jupyter Notebook允許用戶在一個文檔中結合代碼、文字、數學公式和可視化圖表,是教學、實驗記錄和可重復研究的理想工具。Jupyter Notebook是一種互動式的網頁應用程序,讓你在一個文檔中寫代碼、運行代碼、添加注釋和插入圖表。【菜單】---【設置】--【項目:你的項目目錄】--【python解釋器】--【添加解釋器】--【添加本地解釋器】不建議使用類似C:\Users\15740\\.conda\envs**這樣的默認路徑去創建虛擬環境。然后就可以創建python文件、寫代碼、運行即可~_conda系統環境配置https://blog.csdn.net/xw3373409564/article/details/149201204?fromshare=blogdetail&sharetype=blogdetail&sharerId=149201204&sharerefer=PC&sharesource=xw3373409564&sharefrom=from_link這里建議使用Pycharm
1.2第三方模塊與模塊的調用
Python 模塊化編程全解析:模塊、包與第三方庫管理指南-CSDN博客文章瀏覽閱讀1.1k次,點贊30次,收藏22次。學好模塊和包,是從"寫腳本"到"開發項目"的關鍵一步。下次寫代碼時,試試把常用功能拆成模塊——你會發現代碼變得清爽又好維護!https://blog.csdn.net/xw3373409564/article/details/149452387?fromshare=blogdetail&sharetype=blogdetail&sharerId=149452387&sharerefer=PC&sharesource=xw3373409564&sharefrom=from_link
2.分析網站
????????爬取圖片的關鍵是找到圖片的真實地址。就像找寶藏需要先看地圖,我們需要用瀏覽器的 “開發者工具” 分析網站結構,找到圖片的來源。
瀏覽器建議使用谷歌
2.1打開網頁
打開一個包含圖片的網頁,例如:
2.2進入檢查(或開發者選項)
- 右鍵網頁空白處,選擇 “檢查”(或按 F12 快捷鍵),打開開發者工具。
- 這個工具就像 “透視鏡”,能看到網頁背后的代碼和網絡請求。
2.3Elements
進入如如下頁面,Elements是網頁的全部內容,
2.4network
- 切換到 Network 面板:這里記錄了網頁加載時的所有網絡請求(如圖片、文字、腳本等)。
- 選擇 Fetch/XHR:圖片數據通常通過 “異步請求” 加載,這里能過濾出我們需要的動態數據請求。
- 刷新網頁或滑動加載:滑動網頁時,新的圖片會被加載,Network 面板會出現新的請求記錄。
2.5Fetch/XHR
- 查看請求的 Preview:在 Fetch/XHR 列表中,點擊一個請求,切換到 “Preview” 標簽,這里能看到請求返回的數據(通常是 JSON 格式)。
- 尋找圖片地址字段:在數據中逐層查找,會發現一個
images
列表,里面的thumburl
字段就是圖片的真實地址(試試復制這個地址到瀏覽器,能直接打開圖片哦~)。 - 記錄請求 URL 和參數:每個請求都有一個 URL(如
https://image.baidu.com/search/acjson?...
),里面的word
參數是搜索關鍵詞(如 “劉亦菲”),pn
是分頁參數(控制第幾頁),rn
是每頁圖片數量 —— 這些參數能幫我們控制爬取的內容和數量。
選擇Fetch/XHR,里面放的是各種請求
2.5.1Header
在Header中往下滑,在request headers中找到?user-agent
?????????user-agent;用戶代理”,是一個在客戶端(如瀏覽器、APP、爬蟲程序等)向服務器發送請求時,包含在 HTTP 請求頭中的字符串。它的核心作用是向服務器 “說明” 自己的身份信息,讓服務器了解請求來自哪種客戶端、操作系統、設備類型等,從而返回適配的內容。
????????user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36?
2.5.2 Payload
2.5.3Preview
點擊Preview?里面放的是我們請求的數據,我們需要在里面找到圖片地址
????????可以看出images是一個列表list?
2.5.3.1在images中找到圖片地址
例如jumpUrl
結果如下
?繼續往下找
結果如下?
然后換一個 繼續訪問看是否一致
結果如下,很顯然thumburl就是我們要找的地址 ,同時從這里也可以看出每個請求里有30張圖片
?2.5.4獲取請求的url地址
?這樣我們就獲得了一個請求地址(訪問不同地址不同):
https://image.baidu.com/search/acjson?tn=resultjson_com&word=%E5%88%98%E4%BA%A6%E8%8F%B2&ie=utf-8&fp=result&fr=&ala=0&applid=11719931000699796610&pn=60&rn=30&nojc=0&gsm=3c&newReq=1
3.編寫爬蟲代碼:從請求到下載圖片
????????我這里使用pycharm
3.1打開pycharm
?3.2設置地址變量(url)
????????設置一個變量來保存url地址,這里的地址應該是動態的,因為圖片的地址不一樣,后續會處理
3.2設置請求頭:模擬瀏覽器
- 請求頭的作用:
User-Agent
告訴網站 “我是瀏覽器”,避免被識別為爬蟲而拒絕請求。
?3.3使用request模塊發送請求
3.3.1檢查是否 請求成功
3.3.2看看是否抓取到信息?
3.3.3然后查看文件類型?
?3.3.4將其轉換為json
? ?json.loads()
?是 Python 標準庫?json
?模塊中的一個重要函數,用于將 JSON 格式的字符串轉換為 Python 數據類型(如字典、列表、字符串、數字等),實現 JSON 數據的 “反序列化”,方便我們提取圖片地址。。
3.4獲取圖片信息
????????根據我們分析網頁時(在分析網頁模塊2.5.3Preview?里面放的是我們請求的數據,我們需要一層一層的在里面找到圖片地址)url地址get( )? 方法獲取
?3.4.1打印thumburl地址
?我們拿到圖片地址就是想把它下載到本地
3.5下載圖片
????????創建一個用于存放圖片的文件夾這里我創建的是images????????
3.5.1使用request發起請求get(圖片地址)
3.5.2?下載
3.5.2.1查看是否獲取到圖片數據
- 二進制保存:圖片是二進制文件,所以用
"wb"
模式(寫入二進制)打開文件。
顯然獲取數據成功?
3.5.2.2保存圖片數據
?注意:這里的地址D:\hqyj\py\周末自習\images要用? \ \,在python中 \ 是轉義字符
3.5.3運行
?到這里我們就完成了簡單的下載功能
4.代碼優化:讓爬蟲更實用
4.1獲取當前目錄地址
結果如下:?
????????D:\hqyj\py\周末自習
????????D:\hqyj\py\周末自習\images
4.1.1不同方法
場景 | 推薦方法 | 原因 |
---|---|---|
將圖片保存到腳本所在目錄 | os.path.dirname(__file__) | 無論腳本從何處運行,都能準確定位到腳本自身所在的目錄。 |
將圖片保存到當前工作目錄 | os.getcwd() | 適用于需要與用戶當前操作目錄保持一致的場景(如命令行工具)。 |
4.1.2檢測
4.2 優化下載數量
????????從(2.5.2?點擊Payload)中我們可以看出pn時為了設置每頁起始值,而rn是每頁圖片張數,通過修改 URL 中的pn
參數(分頁起始值),實現多頁爬取:如下:
注意,為了方便操作這里使用了換行符 \
由于這里做了更改,保存圖片是的文件名也需更改?
然后執行看是否成功
顯然是成功的?
4.3支持多關鍵詞爬取,同時下載不同的內容
(2.5.2?點擊Payload)可以發面word是用來存儲我們搜索的關鍵詞
我們可以用一個列表存儲這些關鍵詞來映射,動態獲取內容
同樣的我們需要對文件保存做出修改
運行看是否成功
?
?顯然這是成功的兩頁,每頁3張
4.4增加錯誤處理
???????用try-except
捕獲錯誤,避免因個別圖片地址無效導致程序崩潰:
5.源代碼
import os
import requests
import json# 關鍵詞映射
keyword = {'liuyifei': '劉亦菲','liushishi': '劉詩詩'
}
# 本地目錄獲取,當前文件所在目錄
CURRENT_DIR = os.path.dirname(__file__)
PAGES_NUM = 2
if __name__ == '__main__':for key, word in keyword.items():# 下載圖片到本地目錄folder = os.path.join(CURRENT_DIR, key)if not os.path.exists(folder):os.makedirs(folder)# 遍歷的方式爬取多頁for page in range(PAGES_NUM):url = f'https://image.baidu.com/search/acjson?tn=resultjson_com&word={word}&ie=\utf-8&fp=result&fr=&ala=0&applid=11719931000699796610&pn={page*3}&rn=3&nojc=0&gsm=3c&newReq=1'# 設置請求頭:模擬瀏覽器headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36'}# 使用request模塊發送請求response = requests.get(url, headers=headers)images = json.loads(response.text).get('data').get('images')# 獲取到所有的我要加載到本地的圖片地址for i, img_info in enumerate(images):try:imgUrl = img_info.get('thumburl')if not imgUrl:continue # 跳過無地址圖片# 下載圖片到本地# request發起請求,get(圖片地址)img = requests.get(imgUrl)with open(os.path.join(folder, f'{word}{i+3*page}.jpg'), mode='wb') as f:f.write(img.content)print(f'第{page}頁:{word}{i+page*3}.jpg 保存成功....')except Exception as e:print(f'第{page}頁:{word}{i+page*3}.jpg 保存錯誤:{e}')
6總結
核心步驟回顧
- 分析網站:用開發者工具找到圖片的請求 URL 和數據結構(關鍵是找到圖片真實地址)。
- 發送請求:用
requests
庫模擬瀏覽器發送請求,獲取數據。 - 提取信息:從返回的 JSON 數據中提取圖片地址。
- 保存數據:將圖片以二進制形式保存到本地文件夾。
- 優化擴展:支持多頁、多關鍵詞爬取,增加錯誤處理。
注意事項
- 尊重網站規則:查看網站的
robots.txt
(如https://image.baidu.com/robots.txt
),遵守爬取限制,不要頻繁請求(可以加time.sleep()
控制間隔)。 - 反爬應對:設置合理的請求頭(
User-Agent
),避免被識別為爬蟲;不要一次性爬取過多數據。 - 合法性:確保爬取的內容用于學習,不侵犯版權或用于商業用途
????????通過這篇教程,你已經掌握了 Python 爬取網頁圖片的基本方法。爬蟲的核心是 “分析網站→模擬請求→提取數據”,多練習不同的網站(如豆瓣圖片、壁紙網站),你會越來越熟練!