大型情感劇集selenium:9_selenium配合Pillow完成瀏覽器局部截圖
意外之喜
上次說到,在寫selenium大型情感劇集的時,提到某盤的免費工具,存在復制用戶剪切板獲取用戶資源的問題。剛發完文章第二天,就被人惡意投訴,取消了我那篇文章的原創。一時氣不過申訴了下,沒想到成功了,沒抱希望的事情居然有人受理。
本來不打算繼續寫這個系列了,看在申訴成功的份上,今天寫一篇涉及但不僅限于selenium的知識
網頁截圖
上次提到了selenium的四種截圖方法,最終截圖了整張網頁。但很多時候,我們僅僅需要截圖部分的內容。比如截取某個關鍵信息,或者現在已經不常見的截圖驗證碼(現在都是各種按規則點擊…)。那么我們該如何進行部分元素的截圖呢?今天我們就來舉個例子…
昨天51test的小編聯系,說希望我能給網站投稿關于測試的帖子,要求與測試相關且文章篇幅在1000字以上。
我立馬翻了下簡書首頁,54篇文章5.23萬字。除去之前寫的幾篇灌水帖,字數上貌似達標了。但在學習之外,總結文章至公眾號已經很累了,再投稿精力上實在有些扛不住…那么今天就做個練習通過selenium與Pillow,截圖紅框中的內容吧
代碼分析
要局部截圖,首先正常的網頁登陸后,我們需要定位到這個框體,F12看看如何定位:
那么接下來需要引入兩個方法
element.location
獲取element的位置,返回值是一個x,y的坐標點:
{‘x’: 486, ‘y’: 86}
element.size
獲取element的元素大小即長和寬,這個比較好理解:
{‘height’: 119, ‘width’: 625}
畫地為牢
我們知道了x,y,height,width,如何能把這個元素的四個角框起來呢?用下圖說明:
那我們現在要做的就是進行相關的摳圖即可。
圖片裁剪
Python操作圖片的庫很多,但最經典的莫過于Pillow了。
Pillow安裝
在命令行下輸入:pip instlal Pillow 即可
剪切代碼
剪切代碼我們只需要從Pillow中引入Image子模塊,然后使用剪裁方法crop即可實現,代碼如下:
img?=?Image.open('screenshort.png') title?=?img.crop((left,?top,?right,?bottom)) title.save('title.png')
最終實現
代碼:
#?-*-?coding:?utf-8?-*- #?@Author???:?王翔 #?@JianShu??:?清風Python #?@Date?????:?2019/7/15?23:24 #?@Software?:?PyCharm #?@version??:Python?3.7.3 #?@File?????:?SaveLongPicture.py import?os from?selenium?import?webdriver from?PIL?import?Image class?SaveLongPicture: ????#?清風Python個人主頁 ????BaseUrl?=?"https://www.jianshu.com/u/d23fd5012bed" ????#?腳本目錄 ????BaseDir?=?os.path.dirname(os.path.realpath(__file__)) ????def?__init__(self): ????????self.driver?=?self.init_driver() ????????self.long_picture?=?os.path.join(self.BaseDir,?'BreezePython.png') ????@staticmethod ????def?init_driver(): ????????options?=?webdriver.ChromeOptions() ????????options.add_argument('--start-maximized') ????????options.add_argument('disable-infobars') ????????return?webdriver.Chrome(options=options) ????def?prepare_work(self): ????????self.driver.get(self.BaseUrl) ????????self.driver.add_cookie(cookie) ????????self.driver.refresh() ????????self.base_handle?=?self.driver.current_window_handle ????def?add_cookie(self): ????????self.driver.get(self.BaseUrl) ????????self.driver.add_cookie(cookie) ????????self.driver.refresh() ????def?save_crop_img(self): ????????self.driver.get(self.BaseUrl) ????????#?定位元素 ????????title?=?self.driver.find_element_by_class_name('main-top') ????????#?打印元素位置、元素尺寸 ????????print(title.location,?title.size) ????????#?保存圖片 ????????self.driver.get_screenshot_as_file(self.long_picture) ????????#?元素參數獲取 ????????left?=?title.location.get('x') ????????top?=?title.location.get('y') ????????right?=?title.size.get('width')?+?left ????????bottom?=?title.size.get('height')?+?top ????????#?讀取圖片 ????????img?=?Image.open(self.long_picture) ????????#?圖片裁剪 ????????title?=?img.crop((left,?top,?right,?bottom)) ????????#?局部保存 ????????title.save('title.png') def?run(): ????#?實例化方法 ????start_test?=?SaveLongPicture() ????#?cookie登陸 ????start_test.add_cookie() ????#?裁剪圖片 ????start_test.save_crop_img() if?__name__?==?'__main__': ????cookie?=?{ ????????'name':?'remember_user_token', ????????'value':?('......') ????} ????run()
有人會問,明明可以直接訪問的,為什么要添加cookie呢?不美觀…未登錄的情況下,顯示的消息是折行的….
當然你可以不登錄,然后截圖這個元素內容,完全沒問題,但是處女座的人有強迫癥啊…
The End
今天的selenium內容就更新到這里,如果覺得這篇文章對你有幫助,可以點擊文章右下角的“在看”。
歡迎將這篇文章或我的微信公眾號【清風Python】分享給更多喜歡python的人,謝謝你們的支持…..
------------
編程語言 python Selenium
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。