如何使用Python 抓取和優(yōu)化所有網(wǎng)站圖像
我發(fā)布了一個(gè)通過(guò)FTP自動(dòng)優(yōu)化新圖像的教程。這次我們將抓取整個(gè)網(wǎng)站,并在本地優(yōu)化我們遇到的圖像,按URL組織。
請(qǐng)注意,這個(gè)簡(jiǎn)短但中級(jí)的腳本不適用于大型站點(diǎn)。首先,所有圖像都轉(zhuǎn)儲(chǔ)到一個(gè)文件夾中。為每個(gè)頁(yè)面創(chuàng)建一個(gè)新文件夾并不困難,但即便如此,您也可能有數(shù)量無(wú)法管理的文件夾。未優(yōu)化的圖像仍然是未通過(guò) Web 核心指標(biāo)的罪魁禍?zhǔn)?。讓我們開(kāi)始!
要求和假設(shè)
已安裝 Python 3 并理解基本的 Python 語(yǔ)法
- 訪問(wèn)Linux安裝(我推薦Ubuntu)或?qū)毸?/li>
安裝模塊
在我們開(kāi)始之前,請(qǐng)記住注意您在此處復(fù)制的任何內(nèi)容的縮進(jìn),因?yàn)橛袝r(shí)代碼片段無(wú)法完美復(fù)制。下面的所有模塊都應(yīng)該在核心Python 3中。我發(fā)現(xiàn)我需要將 PIL 更新到最新版本 8.2,您可以通過(guò)終端中的以下命令執(zhí)行此操作(如果使用 Google Colab,請(qǐng)?jiān)陂_(kāi)頭加上感嘆號(hào)):
另外,我們需要安裝 Elias Dabbas的 advertools 模塊
pip3 install PIL --upgrade pip3 install advertools
- advertools:使用刮擦處理抓取
- pandas:幫助規(guī)范化爬網(wǎng)數(shù)據(jù)
- os:用于制作映像目錄
- requests:用于下載圖像
- PIL:處理圖像壓縮
- shutil:處理在本地保存圖像
導(dǎo)入 Python 模塊
讓我們首先導(dǎo)入上面描述的這個(gè)腳本所需的模塊。
import advertools as adv import pandas as pd import os import requests # to get image from the web import shutil # to save it locally from PIL import Image import PIL
啟動(dòng)網(wǎng)絡(luò)爬網(wǎng)
我們需要做的第一件事是定義網(wǎng)絡(luò)爬蟲(chóng)的起始 URL。99%的時(shí)間這應(yīng)該是你的主頁(yè)。然后我們?cè)赼dvertools中運(yùn)行adv.crawl()函數(shù),并將輸出保存為crawl.jl,然后將其加載到crawlme數(shù)據(jù)幀中。此過(guò)程可能需要幾分鐘,具體取決于您的網(wǎng)站有多大。我不建議在頁(yè)面或圖像超過(guò)數(shù)萬(wàn)個(gè)的非常大的網(wǎng)站上使用此腳本。一般來(lái)說(shuō),爬蟲(chóng)非常快,只需幾秒鐘即可處理這個(gè)博客。另外,請(qǐng)注意,某些使用 Cloudflare 或其他防火墻的站點(diǎn)最終可能會(huì)在某個(gè)時(shí)候被阻止。
site_url = 'https://importsem.com'
adv.crawl(site_url, 'crawl.jl', follow_links=True)
crawlme = pd.read_json('crawl.jl', lines=True)
規(guī)范化和修剪爬網(wǎng)數(shù)據(jù)
使用我們的數(shù)據(jù)幀,我們可以開(kāi)始規(guī)范化和修剪數(shù)據(jù),使其僅滿足我們的需要。通常有很多 nan 和空白值,因此我們刪除這些行。
crawlme.dropna(how='all') crawlme.drop(crawlme[crawlme['canonical'] == 'nan'].index, inplace = True) crawlme.drop(crawlme[crawlme['img_src'] == ''].index, inplace = True) crawlme.reset_index(inplace = True)
爬網(wǎng)數(shù)據(jù)幀包含大量爬網(wǎng)數(shù)據(jù)。出于我們的目的,我們只需要規(guī)范列和img_src列。我們選擇這些列并將它們轉(zhuǎn)換為字典對(duì)象。
url_images = crawlme[['canonical','img_src']].to_dict()
接下來(lái),我們?cè)O(shè)置一個(gè)計(jì)數(shù)器來(lái)幫助循環(huán)訪問(wèn)圖像鍵和一個(gè)名為 dupes 的列表變量來(lái)存儲(chǔ)我們已經(jīng)處理過(guò)的圖像的 URL,這樣我們就不會(huì)再次處理它們。
x = 0
dupes = []
創(chuàng)建輸出文件夾
現(xiàn)在我們希望創(chuàng)建兩個(gè)文件夾。一個(gè)用于存儲(chǔ)原始文件,以防您需要還原它們,另一個(gè)文件夾用于存儲(chǔ)優(yōu)化的圖像。如果這些文件夾已經(jīng)存在,它只是將路徑發(fā)送到變量中。
try: path = os.getcwd() + "/images/" optpath = os.getcwd() + "/images_opt/" os.mkdir(path) os.mkdir(optpath) except: path = os.getcwd() + "/images/" optpath = os.getcwd() + "/images_opt/"
處理圖像的網(wǎng)址
現(xiàn)在是時(shí)候處理 URL 了。我們遍歷規(guī)范密鑰中的 URL。然后我們使用計(jì)數(shù)器變量將其與img_src鍵匹配。每個(gè) URL 的圖像用“@@”分隔。因此,我們將img_src字符串拆分為“@@”,這變成了一個(gè)列表。
for key in url_images['canonical'].items():
print(key[1])
images = url_images['img_src'][x].split('@@')
在處理 URL 的img_src列表之前,我們希望將主頁(yè)的圖像 URL 預(yù)加載到重復(fù)列表中。
if x == 0:
dupes = images
流程映像
現(xiàn)在,只要每個(gè)圖像未在重復(fù)列表中列出,我們就會(huì)對(duì)其進(jìn)行處理。這確保了我們不會(huì)一遍又一遍地處理相同的圖像。常見(jiàn)的情況是設(shè)計(jì)框架圖像和徽標(biāo),可以在每個(gè)頁(yè)面上找到。這些將在找到它們的第一個(gè) URL 上處理,然后不會(huì)再次處理。我們通過(guò)反斜杠拆分字符串來(lái)獲取圖像文件名,然后選擇創(chuàng)建的最后一個(gè)列表項(xiàng),這將是文件名。然后使用請(qǐng)求模塊下載并解碼文件。
for i in images:
if i not in dupes or x == 0:
filename = i.split("/")[-1]
r = requests.get(i, stream = True)
r.raw.decode_content = True
如果圖像下載成功,我們將文件保存到我們之前設(shè)置的文件夾中。
if r.status_code == 200:
with open(path + filename,'wb') as f:
shutil.copyfileobj(r.raw, f)
優(yōu)化圖像
將圖像下載到原始圖像文件夾中后,我們?cè)诒镜卮蜷_(kāi)它并使用PIL模塊對(duì)其進(jìn)行處理,并將優(yōu)化的輸出保存在我們之前設(shè)置的優(yōu)化圖像文件夾中。使用質(zhì)量參數(shù)。65 我通常很安全,但如果你看到圖像退化,你可以把它放低或需要提高它。如果需要,您還可以選擇調(diào)整圖像大小。只需使用 PIL 的 Image.resize() 函數(shù)即可。文檔在這里。
picture = Image.open(path + filename)
picture.save(optpath + filename, optimize=True, quality=65)
print('Image successfully downloaded and optimized: ',filename)
else:
print('Download Failed')
處理完 URL 的所有圖像后,我們將處理的任何 URL 與重復(fù)列表中包含的內(nèi)容進(jìn)行比較。如果某個(gè)網(wǎng)址不在重復(fù)列表中,則會(huì)添加該網(wǎng)址,因此如果在另一個(gè)網(wǎng)址上找到該網(wǎng)址,我們不會(huì)再次處理該網(wǎng)址。
if x != 0:
[dupes.append(z) for z in images if z not in dupes]
最后,我們輸出計(jì)數(shù)器進(jìn)行進(jìn)程跟蹤,并將計(jì)數(shù)器增加 1。然后,第一個(gè) URL 循環(huán)再次啟動(dòng),并處理下一個(gè) URL
print(x)
x += 1
示例輸出

結(jié)論
有了這個(gè),您現(xiàn)在可以非??焖俚刈ト『蛢?yōu)化任何網(wǎng)站的文件。如果你有一個(gè)非常大的網(wǎng)站,你至少擁有構(gòu)建更健壯的東西所需的框架。
到此這篇關(guān)于如何使用Python 抓取和優(yōu)化所有網(wǎng)站圖像的文章就介紹到這了,更多相關(guān)Python 抓取和優(yōu)化所有網(wǎng)站圖像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python動(dòng)畫(huà)manim中的顏色ManimColor的使用方法詳解
這篇文章主要介紹了python動(dòng)畫(huà)manim中的顏色ManimColor的使用方法,本文通過(guò)實(shí)例圖文展示給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08
python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5拖放控件實(shí)例詳解
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5使用拖放控件實(shí)例詳解,需要的朋友可以參考下2020-02-02
Python?SDK實(shí)現(xiàn)私服上傳下載的示例
本文主要介紹了Python?SDK實(shí)現(xiàn)私服上傳下載的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>2021-11-11
使用Python實(shí)現(xiàn)批量分割PDF文件
這篇文章主要為大家詳細(xì)介紹了如何使用Python進(jìn)行批量分割PDF文件功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
python如何實(shí)現(xiàn)讀取并顯示圖片(不需要圖形界面)
這篇文章主要介紹了python如何實(shí)現(xiàn)讀取并顯示圖片,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
使用Python來(lái)編寫(xiě)HTTP服務(wù)器的超級(jí)指南
這篇文章主要介紹了使用Python來(lái)編寫(xiě)HTTP服務(wù)器的超級(jí)指南,同時(shí)介紹了基于Python框架的web服務(wù)器的編寫(xiě)方法,譯文從理論到實(shí)現(xiàn)講得都很生動(dòng)詳細(xì),十分推薦!需要的朋友可以參考下2016-02-02

