溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么使用Python抓取和優(yōu)化所有網(wǎng)站圖像

發(fā)布時間:2023-02-24 11:54:51 來源:億速云 閱讀:112 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“怎么使用Python抓取和優(yōu)化所有網(wǎng)站圖像”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

    要求和假設(shè)

    • 已安裝 Python 3 并理解基本的 Python 語法

    • 訪問Linux安裝(我推薦Ubuntu)或?qū)毸?/p>

    安裝模塊

    在我們開始之前,請記住注意您在此處復(fù)制的任何內(nèi)容的縮進(jìn),因為有時代碼片段無法完美復(fù)制。下面的所有模塊都應(yīng)該在核心Python 3中。我發(fā)現(xiàn)我需要將 PIL 更新到最新版本 8.2,您可以通過終端中的以下命令執(zhí)行此操作(如果使用 Google Colab,請在開頭加上感嘆號):

    另外,我們需要安裝 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)入上面描述的這個腳本所需的模塊。

    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

    啟動網(wǎng)絡(luò)爬網(wǎng)

    我們需要做的第一件事是定義網(wǎng)絡(luò)爬蟲的起始 URL。99%的時間這應(yīng)該是你的主頁。然后我們在advertools中運(yùn)行adv.crawl()函數(shù),并將輸出保存為crawl.jl,然后將其加載到crawlme數(shù)據(jù)幀中。此過程可能需要幾分鐘,具體取決于您的網(wǎng)站有多大。我不建議在頁面或圖像超過數(shù)萬個的非常大的網(wǎng)站上使用此腳本。一般來說,爬蟲非??欤恍鑾酌腌娂纯商幚磉@個博客。另外,請注意,某些使用 Cloudflare 或其他防火墻的站點(diǎn)最終可能會在某個時候被阻止。

    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ù)幀,我們可以開始規(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)換為字典對象。

    url_images = crawlme[['canonical','img_src']].to_dict()

    接下來,我們設(shè)置一個計數(shù)器來幫助循環(huán)訪問圖像鍵和一個名為 dupes 的列表變量來存儲我們已經(jīng)處理過的圖像的 URL,這樣我們就不會再次處理它們。

    x = 0

    dupes = []

    創(chuàng)建輸出文件夾

    現(xiàn)在我們希望創(chuàng)建兩個文件夾。一個用于存儲原始文件,以防您需要還原它們,另一個文件夾用于存儲優(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)在是時候處理 URL 了。我們遍歷規(guī)范密鑰中的 URL。然后我們使用計數(shù)器變量將其與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 預(yù)加載到重復(fù)列表中。

    if x == 0:

    dupes = images

    流程映像

    現(xiàn)在,只要每個圖像未在重復(fù)列表中列出,我們就會對其進(jìn)行處理。這確保了我們不會一遍又一遍地處理相同的圖像。常見的情況是設(shè)計框架圖像和徽標(biāo),可以在每個頁面上找到。這些將在找到它們的第一個 URL 上處理,然后不會再次處理。我們通過反斜杠拆分字符串來獲取圖像文件名,然后選擇創(chuà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)化圖像

    將圖像下載到原始圖像文件夾中后,我們在本地打開它并使用PIL模塊對其進(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)行比較。如果某個網(wǎng)址不在重復(fù)列表中,則會添加該網(wǎng)址,因此如果在另一個網(wǎng)址上找到該網(wǎng)址,我們不會再次處理該網(wǎng)址。

    if x != 0:

    [dupes.append(z) for z in images if z not in dupes]

    最后,我們輸出計數(shù)器進(jìn)行進(jìn)程跟蹤,并將計數(shù)器增加 1。然后,第一個 URL 循環(huán)再次啟動,并處理下一個 URL

    print(x)

    x += 1

    示例輸出

    怎么使用Python抓取和優(yōu)化所有網(wǎng)站圖像

    “怎么使用Python抓取和優(yōu)化所有網(wǎng)站圖像”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI