Selenium下載頁面上的圖片

當(dāng)要獲取頁面上的圖片,我們常規(guī)的做法是:

在圖片上點(diǎn)擊鼠標(biāo)右鍵,
然后選擇 圖片另存為,彈出保存窗口,
選擇或輸入保存的位置,
點(diǎn)擊 確定 按鈕即可。

在selenium3.0以前,我們是可以通過selenium+Autoit(或者pywinauto)的方式直接模擬這種操作:

找到圖片元素,
使用鼠標(biāo)ActionChains類中的context_click方法實(shí)現(xiàn)右鍵點(diǎn)擊,
使用鍵盤Keys類發(fā)送鍵盤模擬操作,
- 先發(fā)送DOWN命令模擬鍵盤方向鍵向下,
- 再發(fā)送V鍵,也就是另存為的快捷鍵
彈出了文件保存的窗口,
通過Autoit或者pywinauto實(shí)現(xiàn)圖片的下載。

具體代碼和操作我就不寫了,可以百度出很多!

但是現(xiàn)在selenium3.0中無法實(shí)現(xiàn)通過發(fā)送DOWN和V鍵命令的方式實(shí)現(xiàn)打開文件保存窗口了,因此也就沒辦法通過這種方式來保存文件。
不過我們可以借助selenium+requests的來完成圖片的保存。

基本思路是,通過selenium獲取圖片的地址,再通過requests來將圖片保存到本地。

requests是接口測(cè)試主要使用的第三方庫,先下載requests庫,

pip install requests

對(duì)于圖片,有兩種情況,一種是img標(biāo)簽,那么src屬性就是圖片的地址;另一種是其他標(biāo)簽(a,div等等),圖片地址放在css的background-image屬性中。
具體我們來看看每一種的情況:
第一種,我們打開百度

img標(biāo)簽

對(duì)于這種直接是img標(biāo)簽,那么直接獲取src屬性即可。
由于京東的廣告圖片是不停變化的,因此我們例子中使用百度首頁上的 圖片。

from selenium import webdriver
import requests

driver = webdriver.Chrome()
driver.implicitly_wait(30)

driver.get('http://baidu.com')

#  使用get_attribute()方法獲取對(duì)應(yīng)屬性的屬性值,src屬性值就是圖片地址。
url = driver.find_element_by_css_selector('#lg>img').get_attribute('src')
driver.quit()

# 通過requests發(fā)送一個(gè)get請(qǐng)求到圖片地址,返回的響應(yīng)就是圖片內(nèi)容
r = requests.get(url)

# 將獲取到的圖片二進(jìn)制流寫入本地文件
with open('baidu.png', 'wb') as f:
    # 對(duì)于圖片類型的通過r.content方式訪問響應(yīng)內(nèi)容,將響應(yīng)內(nèi)容寫入baidu.png中
    f.write(r.content)

第二種,我們打開京東

a標(biāo)簽

對(duì)于這種需要使用value_of_css_property()或借助js腳本才行,因?yàn)閏ss的屬性,通過selenium無法獲取到。

from selenium import webdriver
import requests
import re

driver = webdriver.Chrome()

driver.get('http://jd.com')
driver.implicitly_wait(30)

# 在js字符串中增加return,可以將js執(zhí)行的值返回給selenium
# $(obj).css(attr,attrvalue),JQuery語法,獲取頁面對(duì)象obj的css屬性值,或修改屬性值
js = "return $('[href=\"http://www.jd.com\"]').css('background-image')"

# 獲取js執(zhí)行后的結(jié)果,這里的結(jié)果是"url("https://misc.360buyimg.com/mtd/pc/index/home/images/logo.v3.jpg")"
url = driver.execute_script(js)

# 上面兩句也可以換成使用value_of_css_property()方式
# url = driver.driver.find_element_by_class_name("mobile_static_qrcode").value_of_css_property('background')

# 由于獲取到的url還包含了一些其他的字符,因此需要處理
# 最好的辦法就是用正則表達(dá)式來匹配其中的網(wǎng)址
# 匹配網(wǎng)址的正則表達(dá)式“(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]”
url = re.search(r'(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]', url).group(0)

r = requests.get(url)

# 將獲取到的圖片二進(jìn)制流寫入本地文件
with open('jd.png', 'wb') as f:
    # r.content 返回壓縮格式的數(shù)據(jù),一般圖片之類的都是通過r.content獲取
    f.write(r.content)

    driver.quit()

對(duì)語句的解釋都寫在了代碼中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容