網站首頁 編程語言 正文
selenium
爬取頁面時經常遇到要保存圖片的需求,通常的做法是獲取鏈接后用?requests
?下載,但這種方法脫離了selenium環境,如遇到有校驗的情況還需要繞過校驗。
下面介紹兩種直接通過selenium保存圖片的方法:
1. 通過抓包
selenium-wire
?是selenium擴展,它可以對所有請求抓包,同時還可以修改請求頭,請求body,請求返回值等,功能非常強大。
selenium-wire
?的使用和selenium一樣,你只從seleniumwire導入webdriver就行,對于其他包還是從selenium導入
from selenium.webdriver.chrome.options import Options from seleniumwire.webdriver import Chrome driver = Chrome(options= Options())
下載圖片有兩種方法:
1-1.通過攔截器
通過攔截器預先把所有圖片保存下來,要用到時在緩存目錄中找
def get_img_path_from_url(url): # 自行實現 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. 請求后在所有請求中獲取
這種方法有個缺點,瀏覽器會自動緩存圖片,如果之前已經緩存過這張圖片是不會有網絡請求的
# 下載前先清理數據,不然請求太多 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')
總結
原文鏈接:https://www.ikaze.cn/article/66
相關推薦
- 2022-08-05 利用jQuery?treetable實現樹形表格拖拽詳解_jquery
- 2022-06-12 使用?Docker安裝?Zabbix并配置自定義監控項的過程詳解_docker
- 2023-04-26 Numpy對于NaN值的判斷方法_python
- 2022-12-29 Kotlin?協程思維模型的引入使用建立_Android
- 2022-12-14 Docker中容器數據卷詳解_docker
- 2022-12-06 React自定義視頻全屏按鈕實現全屏功能_React
- 2022-04-03 Android?PopUpWindow實現卡片式彈窗_Android
- 2022-12-14 Python桌面文件清理腳本分享_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支