python?selenium保存圖片最好的兩種方法
selenium
爬取頁(yè)面時(shí)經(jīng)常遇到要保存圖片的需求,通常的做法是獲取鏈接后用 requests
下載,但這種方法脫離了selenium環(huán)境,如遇到有校驗(yàn)的情況還需要繞過(guò)校驗(yàn)。
下面介紹兩種直接通過(guò)selenium保存圖片的方法:
1. 通過(guò)抓包
selenium-wire
是selenium擴(kuò)展,它可以對(duì)所有請(qǐng)求抓包,同時(shí)還可以修改請(qǐng)求頭,請(qǐng)求body,請(qǐng)求返回值等,功能非常強(qiáng)大。
selenium-wire
的使用和selenium一樣,你只從seleniumwire導(dǎo)入webdriver就行,對(duì)于其他包還是從selenium導(dǎo)入
from selenium.webdriver.chrome.options import Options from seleniumwire.webdriver import Chrome driver = Chrome(options= Options())
下載圖片有兩種方法:
1-1.通過(guò)攔截器
通過(guò)攔截器預(yù)先把所有圖片保存下來(lái),要用到時(shí)在緩存目錄中找
def get_img_path_from_url(url): # 自行實(shí)現(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. 請(qǐng)求后在所有請(qǐng)求中獲取
這種方法有個(gè)缺點(diǎn),瀏覽器會(huì)自動(dòng)緩存圖片,如果之前已經(jīng)緩存過(guò)這張圖片是不會(huì)有網(wǎng)絡(luò)請(qǐng)求的
# 下載前先清理數(shù)據(jù),不然請(qǐng)求太多 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. 通過(guò)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')
總結(jié)
到此這篇關(guān)于python selenium保存圖片最好的兩種方法的文章就介紹到這了,更多相關(guān)python selenium保存圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)可將字符轉(zhuǎn)換成大寫(xiě)的tcp服務(wù)器實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)可將字符轉(zhuǎn)換成大寫(xiě)的tcp服務(wù)器,通過(guò)tcp服務(wù)器端實(shí)現(xiàn)針對(duì)字符的轉(zhuǎn)換與返回功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04推薦下python/ironpython:從入門(mén)到精通
推薦下python/ironpython:從入門(mén)到精通...2007-10-10python實(shí)現(xiàn)查詢(xún)IP地址所在地
本文給大家分享的是使用Python實(shí)現(xiàn)根據(jù)ip138的API查詢(xún)IP的地理位置的代碼,非常的實(shí)用,推薦給大家,有需要的小伙伴可以參考下。2015-03-03Python實(shí)現(xiàn)的多進(jìn)程拷貝文件并顯示百分比功能示例
這篇文章主要介紹了Python實(shí)現(xiàn)的多進(jìn)程拷貝文件并顯示百分比功能,涉及Python多進(jìn)程、文件遍歷、拷貝等相關(guān)操作技巧,需要的朋友可以參考下2019-04-04利用python如何在前程無(wú)憂(yōu)高效投遞簡(jiǎn)歷
這篇文章主要給大家介紹了關(guān)于利用python如何在前程無(wú)憂(yōu)高效投遞簡(jiǎn)歷的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Pyramid將models.py文件的內(nèi)容分布到多個(gè)文件的方法
默認(rèn)的Pyramid代碼結(jié)構(gòu)中,就只有一個(gè)models.py文件,在實(shí)際項(xiàng)目中,如果需要對(duì)models進(jìn)行分類(lèi),放到不同文件下,應(yīng)該怎么辦2013-11-11