用python下載自己在聚合圖床上傳的圖片的一種方法

RimroseLim發表於2024-05-17

宣告:我沒怎麼學過python,下面的程式碼是面向csdn程式設計的結果

起因是昨天聚合圖床的圖片連結突然有一會兒失效了,並且此前我已經用cloudflare的R2搭建了一個自己的圖床,有考慮過將自己之前在聚合圖床上傳的圖轉移到自建圖床裡(同時存在本地備份),但是我已上傳的圖片也已經有快200張,純手動一張一張下載肯定是不現實的,而且我不會用爬蟲爬取,所以就有了下邊的內容

我先用瀏覽器的檢查元素功能大致看了一下,相簿頁面的原始碼是包含了這一頁所有圖片的連結的,所以直接把個人相簿每頁都下載下來,就像這樣

稍微觀察一下原始碼,不難看出,圖片連結包含在類似這樣的節點裡:

<td style="width:240px" data-key="filename" class="tm-update img-tips" data-src="https://pic.imgdb.cn/item/646e2dc70d2dde577777d0ad.png" contenteditable="plaintext-only">16808348627320.png</td>

其實也就是說連結在含有屬性 data-key 值為 filname 且屬性 class 值為 tm-update img-tipstd 節點的 data-src 屬性裡。(測試程式碼的時候不加class限制跑出bug了,所以就多加了一條,但其實不加應該也是沒問題的)

於是我去搜了python如何讀取html程式碼以及如何透過url下載圖片,然後就有了下邊的程式碼

from bs4 import BeautifulSoup
import urllib.request
i = 0

with open('pic1.html', 'r', encoding='UTF-8') as file:
    soup = BeautifulSoup(file.read(), 'html.parser')
td_tag = soup.find_all('td', {'data-key': 'filename', 'class':'tm-update img-tips'}) # 查詢所有含有屬性data-key值為filname且屬性class值為tm-update img-tips的td節點

for td in td_tag:
    i += 1
    img_name = td.text
    urlStr = td['data-src']
    print('src = ', urlStr)
    urllib.request.urlretrieve(urlStr, filename='./down/'+ str(i) + '_' + img_name) # 下載圖片

參考:

Python在HTML內提取元素

如何在Python中解析本地HTML檔案?

python3根據圖片連結下載圖片

相關文章