python?selenium保存圖片最好的兩種方法
selenium爬取頁(yè)面時(shí)經(jīng)常遇到要保存圖片的需求,通常的做法是獲取鏈接后用 requests 下載,但這種方法脫離了selenium環(huán)境,如遇到有校驗(yàn)的情況還需要繞過校驗(yàn)。
下面介紹兩種直接通過selenium保存圖片的方法:
1. 通過抓包
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.通過攔截器
通過攔截器預(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)緩存過這張圖片是不會(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. 通過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中l(wèi)ogging模塊的用法實(shí)例
這篇文章主要介紹了Python中l(wèi)ogging模塊的用法實(shí)例,以實(shí)例形式介紹了日志模塊logging的用法,具有一定的實(shí)用價(jià)值,需要的朋友可以參考下2014-09-09
解決django migrate報(bào)錯(cuò)ORA-02000: missing ALWAYS keyword
這篇文章主要介紹了解決django migrate報(bào)錯(cuò)ORA-02000: missing ALWAYS keyword,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-07-07
將字典轉(zhuǎn)換為DataFrame并進(jìn)行頻次統(tǒng)計(jì)的方法
下面小編就為大家分享一篇將字典轉(zhuǎn)換為DataFrame并進(jìn)行頻次統(tǒng)計(jì)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-04-04
Anaconda下Python中h5py與netCDF4模塊下載與安裝的教程詳解
這篇文章主要為大家詳細(xì)介紹了基于Anaconda,下載并安裝Python中h5py與netCDF4這兩個(gè)模塊的方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
講清楚fit_transform()和transform()的區(qū)別及說明
這篇文章主要介紹了講清楚fit_transform()和transform()的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
基于python分析你的上網(wǎng)行為 看看你平時(shí)上網(wǎng)都在干嘛
這篇文章主要介紹了基于python分析你的上網(wǎng)行為 看看你平時(shí)上網(wǎng)都在干嘛,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08

