Selenium是最廣泛使用的開源Web UI(用戶界面)自動化測試套件之一,可以通過編程與瀏覽量的交互式操作對網(wǎng)頁進行自動化控制?;谶@種操作進行數(shù)據(jù)保存操作,尤其是在圖像數(shù)據(jù)的批量保存上占據(jù)優(yōu)勢。本博文基于selenium 與jupyterlab實現(xiàn)批量保存瀏覽器搜索到的圖片。
Selenium的詳細使用可以參考:https://blog.csdn.net/sinat_28631741/article/details/115634230
1、Selenium環(huán)境安裝
使用Selenium進行自動化操作要求電腦局部python環(huán)境,且安裝好了谷歌瀏覽器。
1.1 python包安裝
Selenium安裝命令為:
pip install selenium
為了能進行交互式執(zhí)行代碼片段,建議安裝jupyter lab,安裝命令
pip install jupyterlab
安裝好后,在命令行下執(zhí)行‘jupyter lab’命令即可彈出瀏覽器界面,具體頁面如下所示
jupyter lab
在以下頁面中可以新建Notebook(由于執(zhí)行python代碼的的記事本)
按照上圖,點擊Python 3即可進入交互式編程界面,具體如下所示(其中每一個單元格都可以輸入python代碼并執(zhí)行,點擊紅框中的三角形即可執(zhí)行鼠標(biāo)選擇的單元格代碼塊)。其中代碼快的上下文關(guān)系并無聯(lián)系,只是說執(zhí)行完當(dāng)前代碼快后默認跳轉(zhuǎn)到下一個代碼塊【可以自行指定執(zhí)行其他代碼塊】。代碼快之間的變量在其執(zhí)行后生效,執(zhí)行后會被添加到內(nèi)存空間,在下一個執(zhí)行的代碼快中可以使用先前所有的代碼塊變量和函數(shù)。
1.2 谷歌驅(qū)動下載
先打開本機的谷歌瀏覽器,然后在地址欄輸入chrome://settings/help,即可進入瀏覽器的設(shè)置頁面,然后查看自己瀏覽器的版本信息。這里的版本是103.0(記住版本號的前兩位就行)
打開https://registry.npmmirror.com/binary.html?path=chromedriver/
,下載與瀏覽器版本號最接近的驅(qū)動
下載win32版本,然后將其解壓,將chromedriver.exe復(fù)制到C:\Windows\System32目錄即可(或者是系統(tǒng)環(huán)境變量path配置項中的其他路徑)
2、 抓取瀏覽器圖片
2.1 控制開啟瀏覽器
在jupyter的交互式單元格內(nèi)輸入以下代碼,即可控制瀏覽器自動打開www.baidu.com
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get('https://image.baidu.com/')
2.2 交互式搜索圖片
在上述步驟中彈出的瀏覽器窗口中,按照個人爬蟲需求,輸入關(guān)鍵詞,并拖動頁面的滾動條,使頁面中的圖片變多(滿足需求就可,越后面的圖片與關(guān)鍵詞差距越大)
2.3 執(zhí)行js進行轉(zhuǎn)換
利用代碼調(diào)用瀏覽器執(zhí)行js,將瀏覽器中頁面內(nèi)所有的img標(biāo)簽的src轉(zhuǎn)換為base64格式。因為直接根據(jù)url利用python下載圖片的時候有極大可能會被服務(wù)器拒絕下載,故此,利用js將現(xiàn)有的圖像信息已base64格式存儲到網(wǎng)站圖片的src中。
js = """
_fetch = function(i,src){
return fetch(src).then(function(response) {
if(!response.ok) throw new Error("No image in the response");
var headers = response.headers;
var ct = headers.get('Content-Type');
var contentType = 'image/png';
if(ct !== null){
contentType = ct.split(';')[0];
}
return response.blob().then(function(blob){
return {
'blob': blob,
'mime': contentType,
'i':i,
};
});
});
};
_read = function(response){
return new Promise(function(resolve, reject){
var blob = new Blob([response.blob], {type : response.mime});
var reader = new FileReader();
reader.onload = function(e){
resolve({'data':e.target.result, 'i':response.i});
};
reader.onerror = reject;
reader.readAsDataURL(blob);
});
};
_replace = function(){
for (var i = 0, len = q.length; i < len; i++) {imgs[q[i].item].src = q[i].data;}
alert('處理完成!');
}
var q = [];
var imgs = document.querySelectorAll('img');
for (var i = 0, len = imgs.length; i < len; i++) {
_fetch(i,imgs[i].src).then(_read).then(function(data){
q.push({
'data': data.data,
'item': data.i,
});
});
}
setTimeout(_replace, 2000 );
"""
browser.execute_script(js)
瀏覽器在執(zhí)行完python程序嵌入的js代碼后會彈出以下提示信息,這表示圖像轉(zhuǎn)base64操作完成。
2.4 保存圖片
利用selenium獲取頁面中的節(jié)點元素,在https://image.baidu.com/中圖像的css選擇器路徑為’#imgid > div > ul > li’,遍歷所獲取的頁面元素,然后提取其中img元素的src屬性,將其轉(zhuǎn)換為img對象,然后使用opencv保存為圖像。
執(zhí)行以下代碼先創(chuàng)建一個image目錄,用于保存圖片
import base64
import numpy as np
import cv2
def base64img2file(imgname:str,imgsrc: str):
#將base64轉(zhuǎn)碼為byte,然后再使用opencv轉(zhuǎn)image對象
img_data = base64.b64decode(imgsrc.split(',')[1])
nparr = np.fromstring(img_data, np.uint8)
img_np = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
if img_np is not None:
cv2.imwrite(imgname,img_np)
ul_list = browser.find_elements(By.CSS_SELECTOR, '#imgid > div > ul > li') #按CSS選擇器
for i,li in enumerate(ul_list):
print(i,li)
img=li.find_element(By.CSS_SELECTOR, 'img')
base64str=img.get_attribute('src')
imgname='image/%s.jpg'%i
if base64str:
base64img2file(imgname,base64str)
代碼執(zhí)行輸出如下所示文章來源:http://www.zghlxwxcb.cn/news/detail-819700.html
0 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="f00c796a-3d59-460a-bfed-94997944fabb")>
1 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="ae9a78b9-5669-471a-a0ce-45a508d3622c")>
2 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="f554c10e-e453-47bc-9dbd-12fdb1144062")>
3 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="53b02fca-6fbb-4d81-80e4-f090cd8d760e")>
4 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="a7de3396-8baf-4093-8437-1a93bf7f7386")>
5 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="7939e112-120a-45bd-9f78-c85715a8c9bf")>
6 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="f7613b97-cb6f-4bcb-b6cb-57150507abfd")>
7 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="708eb27b-111b-4fab-8f68-a921e9130364")>
8 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="8164377a-2622-41df-80ca-5466e397189d")>
9 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="2513db9c-6956-4d34-b04a-89de75731b77")>
10 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="335f191e-00f9-4277-9f91-37945f3c0763")>
11 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="d5d44624-da6b-45a8-9a82-e8d7edf469d9")>
12 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="ec03ce95-2024-4d7d-96e7-bc52c79fdf19")>
13 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="f42b5991-4be1-43a6-9f7e-9fe92c948b55")>
14 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="07c6763b-7ad1-4770-9693-112e5cc00f98")>
15 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="3a3e9861-0c94-4623-87c2-c0dcdda66852")>
16 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="439b495b-7d2a-41e6-ac94-d448691e0eb2")>
17 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="05fa5174-d970-4764-88c3-201846fb6cf0")>
18 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="caa591a7-ab7e-49ce-905e-fb515a22cf5c")>
19 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="89b635df-9585-4f95-8835-fb9848474cf2")>
20 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="a44b0003-23f2-4e2f-af51-036d4dec045f")>
21 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="e750ee5d-cd19-4267-8d7a-6a3a0e90d104")>
22 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="e1c49517-f4e9-44e4-bbf8-b6ab138bb908")>
23 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="2fc72e19-c35f-45b6-8a90-db6cccbe631c")>
24 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="baee9cf6-1b9c-4f50-9906-a8b8d1e10067")>
25 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="96917b71-7bfc-4e4f-bfff-6e5fb847d357")>
26 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="82d0cff5-5470-4ac4-a8c6-7ae1f897bda9")>
27 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="2d817ba8-af89-4242-a961-60b305d1149e")>
28 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="daad33b7-c3e7-4d03-8d74-274cd1a7ecc2")>
29 <selenium.webdriver.remote.webelement.WebElement (session="d8d43989c740105781072461d0af0f1f", element="ed281754-16e1-4c1d-97d4-d81b13909f3a")>
保存后的圖像如下所示:文章來源地址http://www.zghlxwxcb.cn/news/detail-819700.html
到了這里,關(guān)于基于python下selenium庫實現(xiàn)交互式圖片保存操作(批量保存瀏覽器中的圖片)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!