溫馨提示×

溫馨提示×

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

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

python?selenium保存圖片最好的兩種方法分別是什么

發(fā)布時間:2022-01-27 09:06:05 來源:億速云 閱讀:582 作者:kk 欄目:開發(fā)技術(shù)

今天給大家介紹一下python selenium保存圖片最好的兩種方法分別是什么。文章的內(nèi)容小編覺得不錯,現(xiàn)在給大家分享一下,覺得有需要的朋友可以了解一下,希望對大家有所幫助,下面跟著小編的思路一起來閱讀吧。

    selenium爬取頁面時經(jīng)常遇到要保存圖片的需求,通常的做法是獲取鏈接后用 requests 下載,但這種方法脫離了selenium環(huán)境,如遇到有校驗的情況還需要繞過校驗。

    下面介紹兩種直接通過selenium保存圖片的方法:

    1. 通過抓包

    selenium-wire 是selenium擴展,它可以對所有請求抓包,同時還可以修改請求頭,請求body,請求返回值等,功能非常強大。

    selenium-wire 的使用和selenium一樣,你只從seleniumwire導(dǎo)入webdriver就行,對于其他包還是從selenium導(dǎo)入

    from selenium.webdriver.chrome.options import Options
    from seleniumwire.webdriver import Chrome
    
    driver = Chrome(options= Options())

    下載圖片有兩種方法:

    1-1.通過攔截器

    通過攔截器預(yù)先把所有圖片保存下來,要用到時在緩存目錄中找

    def get_img_path_from_url(url):
        # 自行實現(xiàn)
        return url
    
    def response_interceptor(request, response):
        t=response.headers['Content-Type']
        if request.host=='xxx' and t and 'image' in t:
            with open(get_img_path_from_url(request.url), 'wb') as f:
                f.write(response.body)
                
    driver.response_interceptor = response_interceptor
    
    driver.get('...')
    src=driver.find_element_by_tag_name('img').get_attribute('src')
    img_path=get_img_path_from_url(src)

    1-2. 請求后在所有請求中獲取

    這種方法有個缺點,瀏覽器會自動緩存圖片,如果之前已經(jīng)緩存過這張圖片是不會有網(wǎng)絡(luò)請求的

    # 下載前先清理數(shù)據(jù),不然請求太多
    del driver.requests
    driver.get('...')
    src=driver.find_element_by_tag_name('img').get_attribute('src')</code>
    <code>
    for r in driver.iter_requests():
        if r.url==src:
            with open('img', 'wb') as f:
                f.write(r.response.body)

    2. 通過canvas

    使用js把圖片放到canvas中,然后獲取base64字符串,再保存

    import base64
    import os
    import re
    from io import BytesIO
    from PIL import Image
    
    def base64_to_image(base64_str):
        base64_data = re.sub('^data:image/.+;base64,', '', base64_str)
        byte_data = base64.b64decode(base64_data)
        image_data = BytesIO(byte_data)
        img = Image.open(image_data)
        return img
    
    
    js = "let c = document.createElement('canvas');let ctx = c.getContext('2d');" \
         "let img = document.getElementsByTagName('img')[0]; /*找到圖片*/ " \
         "c.height=img.naturalHeight;c.width=img.naturalWidth;" \
         "ctx.drawImage(img, 0, 0,img.naturalWidth, img.naturalHeight);" \
         "let base64String = c.toDataURL();return base64String;"
         
    base64_str = driver.execute_script(js)
    img = base64_to_image(base64_str)
    
    img.save('xx.png')

    python是什么意思

    Python是一種跨平臺的、具有解釋性、編譯性、互動性和面向?qū)ο蟮哪_本語言,其最初的設(shè)計是用于編寫自動化腳本,隨著版本的不斷更新和新功能的添加,常用于用于開發(fā)獨立的項目和大型項目。

    以上就是python selenium保存圖片最好的兩種方法分別是什么的全部內(nèi)容了,更多與python selenium保存圖片最好的兩種方法分別是什么相關(guān)的內(nèi)容可以搜索億速云之前的文章或者瀏覽下面的文章進行學(xué)習(xí)哈!相信小編會給大家增添更多知識,希望大家能夠支持一下億速云!

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

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

    AI