您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么使用Python抓取和優化所有網站圖像”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
已安裝 Python 3 并理解基本的 Python 語法
訪問Linux安裝(我推薦Ubuntu)或寶塔
在我們開始之前,請記住注意您在此處復制的任何內容的縮進,因為有時代碼片段無法完美復制。下面的所有模塊都應該在核心Python 3中。我發現我需要將 PIL 更新到最新版本 8.2,您可以通過終端中的以下命令執行此操作(如果使用 Google Colab,請在開頭加上感嘆號):
另外,我們需要安裝 Elias Dabbas的 advertools 模塊
pip3 install PIL --upgrade pip3 install advertools
advertools:使用刮擦處理抓取
pandas:幫助規范化爬網數據
os:用于制作映像目錄
requests:用于下載圖像
PIL:處理圖像壓縮
shutil:處理在本地保存圖像
讓我們首先導入上面描述的這個腳本所需的模塊。
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
我們需要做的第一件事是定義網絡爬蟲的起始 URL。99%的時間這應該是你的主頁。然后我們在advertools中運行adv.crawl()函數,并將輸出保存為crawl.jl,然后將其加載到crawlme數據幀中。此過程可能需要幾分鐘,具體取決于您的網站有多大。我不建議在頁面或圖像超過數萬個的非常大的網站上使用此腳本。一般來說,爬蟲非常快,只需幾秒鐘即可處理這個博客。另外,請注意,某些使用 Cloudflare 或其他防火墻的站點最終可能會在某個時候被阻止。
site_url = 'https://importsem.com'
adv.crawl(site_url, 'crawl.jl', follow_links=True)
crawlme = pd.read_json('crawl.jl', lines=True)
使用我們的數據幀,我們可以開始規范化和修剪數據,使其僅滿足我們的需要。通常有很多 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)
爬網數據幀包含大量爬網數據。出于我們的目的,我們只需要規范列和img_src列。我們選擇這些列并將它們轉換為字典對象。
url_images = crawlme[['canonical','img_src']].to_dict()
接下來,我們設置一個計數器來幫助循環訪問圖像鍵和一個名為 dupes 的列表變量來存儲我們已經處理過的圖像的 URL,這樣我們就不會再次處理它們。
x = 0
dupes = []
現在我們希望創建兩個文件夾。一個用于存儲原始文件,以防您需要還原它們,另一個文件夾用于存儲優化的圖像。如果這些文件夾已經存在,它只是將路徑發送到變量中。
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/"
現在是時候處理 URL 了。我們遍歷規范密鑰中的 URL。然后我們使用計數器變量將其與img_src鍵匹配。每個 URL 的圖像用“@@”分隔。因此,我們將img_src字符串拆分為“@@”,這變成了一個列表。
for key in url_images['canonical'].items():
print(key[1])
images = url_images['img_src'][x].split('@@')
在處理 URL 的img_src列表之前,我們希望將主頁的圖像 URL 預加載到重復列表中。
if x == 0:
dupes = images
現在,只要每個圖像未在重復列表中列出,我們就會對其進行處理。這確保了我們不會一遍又一遍地處理相同的圖像。常見的情況是設計框架圖像和徽標,可以在每個頁面上找到。這些將在找到它們的第一個 URL 上處理,然后不會再次處理。我們通過反斜杠拆分字符串來獲取圖像文件名,然后選擇創建的最后一個列表項,這將是文件名。然后使用請求模塊下載并解碼文件。
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
如果圖像下載成功,我們將文件保存到我們之前設置的文件夾中。
if r.status_code == 200:
with open(path + filename,'wb') as f:
shutil.copyfileobj(r.raw, f)
將圖像下載到原始圖像文件夾中后,我們在本地打開它并使用PIL模塊對其進行處理,并將優化的輸出保存在我們之前設置的優化圖像文件夾中。使用質量參數。65 我通常很安全,但如果你看到圖像退化,你可以把它放低或需要提高它。如果需要,您還可以選擇調整圖像大小。只需使用 PIL 的 Image.resize() 函數即可。文檔在這里。
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 與重復列表中包含的內容進行比較。如果某個網址不在重復列表中,則會添加該網址,因此如果在另一個網址上找到該網址,我們不會再次處理該網址。
if x != 0:
[dupes.append(z) for z in images if z not in dupes]
最后,我們輸出計數器進行進程跟蹤,并將計數器增加 1。然后,第一個 URL 循環再次啟動,并處理下一個 URL
print(x)
x += 1
示例輸出
“怎么使用Python抓取和優化所有網站圖像”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。