一、selenium模組介紹
selenium最初是一個自動化測試工具,而爬蟲中使用它主要是為了解決requests無法直接執行JavaScript程式碼的問題。selenium本質是透過驅動瀏覽器,完全模擬瀏覽器的操作,比如跳轉、輸入、點選、下拉等,來拿到網頁渲染之後的結果,可支援多種瀏覽器。但是它的使用必須配合瀏覽器驅動而且瀏覽器版本也要一樣才可以。正式使用之前需要做一些準備工作。瀏覽器和瀏覽器驅動的話推薦使用谷歌瀏覽器(因為這個瀏覽器支援selenium的最好)
怎麼檢視谷歌瀏覽器的版本
瀏覽器右上角》點三個點點》往下找幫助並點選》之後再點關於Google Chrome就可以檢視版本
確定自己瀏覽器版本之後下載對應的驅動
點選這裡下載
谷歌瀏覽器驅動
準備下載驅動的時候發現驅動和瀏覽器版本無法完全一致,我這裡有兩個不用糾結二選一即可。
再根據自己的電腦的作業系統選擇即可
所有的準備工作已完成接下來我們學習如何使用selenium模組吧
二、selenium基本使用
- 下載selenium模組
pip install selenium
-
下載好了的驅動拖到專案路徑下
-
寫程式碼控制谷歌瀏覽器
from selenium import webdriver
# 第一步:開啟谷歌瀏覽器
my_browser = webdriver.Chrome(executable_path='chromedriver.exe')
# 第二步:在位址列中輸入網址
page_source = my_browser.get('https://www.cnblogs.com/almira998/p/17226553.html')
# 第三步:完成任務就關閉瀏覽器
my_browser.close()
三、無介面瀏覽器
無介面瀏覽器指的就是隱藏瀏覽器圖形化介面但是資料照樣能拿到,有這個模組我就不需要費心費力的用requests模組了。那麼怎麼操作呢?請繼續看下面程式碼框
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--hide-scrollbars') # 隱藏捲軸
chrome_options.add_argument('blink-settings=imagesEnabled=false') # 不載入圖圖片
chrome_options.add_argument('--headless') # 不提供視覺化介面
my_browser = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=chrome_options)
my_browser.get('https://www.cnblogs.com/')
print(my_browser.page_source)
my_browser.close()
四、selenium用法
1. 查詢標籤
可以按id,標籤名,name屬性名,類名,a標籤的文字,a標籤的文字模糊匹配,css選擇器,如果有id那就優選選擇id,因為id具有唯一性,查詢標籤最準確
# 兩個方法
bro.find_element 找一個
bro.find_elements 找所有
input_1=bro.find_element(by=By.ID,value='wd')
input_1 = bro.find_element(by=By.NAME, value='wd')
input_1=bro.find_element(by=By.TAG_NAME,value='input')
input_1=bro.find_element(by=By.CLASS_NAME,value='s_ipt')
input_1=bro.find_element(by=By.LINK_TEXT,value='登入')
input_1=bro.find_element(by=By.PARTIAL_LINK_TEXT,value='錄')
input_1 = bro.find_element(by=By.CSS_SELECTOR, value='#su')
2. 獲取標籤
透過tag.的方式獲取標籤的屬性、id、文字、位置、大小、標籤名
print(tag.get_attribute('src')) # 用的最多
print(tag.id)
print(tag.text)
print(tag.location)
print(tag.size)
print(tag.tag_name)
3. 元素操作
可以操作點選、輸入內容、清空內容、瀏覽器物件最大化、截全螢幕、還可以控制程式碼執行(程式碼執行很快,有的標籤沒來的及載入,直接查詢就會報錯,設定等待)
# 點選
tag.click()
# 輸入內容
tag.send_keys()
# 清空內容
tag.clear()
# 瀏覽器物件 最大化
bro.maximize_window()
#瀏覽器物件 截全屏
bro.save_screenshot('main.png')
# 設定等待:所有標籤,只要去找,找不到就遵循 等10s的規則
bro.implicitly_wait(10)
4. 執行JS程式碼
可以乾的事情:獲取當前訪問的地址、開啟新的標籤、滑動螢幕、獲取cookie,獲取定義的全域性變數(如果獲取到cookie那麼爬蟲一個大難點就解決了,具體如何獲取後面繼續學)
bro.execute_script('alert("美女")') # 引號內部的相當於 用script標籤包裹了
5. 切換選項卡
import time
from selenium import webdriver
browser=webdriver.Chrome(executable_path='chromedriver.exe')
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles) #獲取所有的選項卡
browser.switch_to.window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(2)
browser.switch_to.window(browser.window_handles[0])
browser.get('https://www.sina.com.cn')
browser.close()
6. 控制前進後退
import time
from selenium import webdriver
browser=webdriver.Chrome(executable_path='chromedriver.exe')
browser.get('https://www.baidu.com')
browser.get('https://www.taobao.com')
browser.get('http://www.sina.com.cn/')
browser.back()
time.sleep(2)
browser.forward()
browser.close()
7. 異常處理
import time
from selenium import webdriver
browser=webdriver.Chrome(executable_path='chromedriver.exe')
try:
except Exception as e:
print(e)
finally:
browser.close()
五、xpath的使用
關於xpath
XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML文件中某部分位置的語言,具體會一下幾個就夠了,實在不行我們有終極大法:那就是右鍵檢查>copy>copy xpath來複制用即可
/ 從當前路徑下開始找
/div 從當前路徑下開始找div
// 遞迴查詢,子子孫孫
//div 遞迴查詢div
@ 取屬性
. 當成
.. 上一層
六、selenium動作鏈
Selenium的動作鏈是一種在網頁上執行多個動作的技術,它可以模擬人類在網頁上的互動行為,例如滑鼠移動、點選、拖拽等操作。動作鏈中的每個動作都可以設定等待時間、偏移量、速度等引數,以便更加精確地模擬使用者的操作。使用動作鏈可以實現複雜的互動操作,提高自動化測試的效率和準確性。
actions=ActionChains(bro) #拿到動作鏈物件
actions.drag_and_drop(sourse,target) #把動作放到動作鏈中,準備序列執行
actions.perform()
ActionChains(bro).click_and_hold(sourse).perform()
distance=target.location['x']-sourse.location['x']
track=0
while track < distance:
ActionChains(bro).move_by_offset(xoffset=2,yoffset=0).perform()
track+=2
ActionChains:這是Selenium原生的動作鏈類,它可以在瀏覽器中執行滑鼠和鍵盤的互動操作,例如點選、拖拽、懸停等。ActionChains類可以透過鏈式呼叫來組合多個操作,以實現複雜的操作流程。
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
# 建立瀏覽器物件
driver = webdriver.Chrome()
# 開啟網頁
driver.get('https://www.baidu.com')
# 找到搜尋框元素
search_box = driver.find_element_by_css_selector('#kw')
# 建立ActionChains物件
actions = ActionChains(driver)
# 在搜尋框中輸入關鍵詞
actions.move_to_element(search_box).send_keys('Selenium').perform()
# 找到搜尋按鈕元素
search_button = driver.find_element_by_css_selector('#su')
# 懸停在搜尋按鈕上
actions.move_to_element(search_button).perform()
# 點選搜尋按鈕
actions.click(search_button).perform()
# 關閉瀏覽器
driver.quit()
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By # 按照什麼方式查詢,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys # 鍵盤按鍵操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait # 等待頁面載入某些元素
try:
browser = webdriver.Chrome(executable_path='./chromedriver.exe')
browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
browser.switch_to.frame('iframeResult') # 切換到id為iframeResult的frame
target = browser.find_element(By.ID, 'droppable') # 目標
source = browser.find_element(By.ID, 'draggable') # 源
# 方案1
# actions = ActionChains(browser) # 拿到動作鏈物件
# actions.drag_and_drop(source, target) # 把動作放到動作鏈中,準備序列執行
# actions.perform()
# 方案2
# ActionChains(browser).click_and_hold(source).perform()
# distance = target.location['x'] - source.location['x']
# track = 0
# while track < distance:
# ActionChains(browser).move_by_offset(xoffset=2, yoffset=0).perform()
# track += 2
time.sleep(2)
finally:
browser.close()
七、selenium模組相關的案例練習
1. 模擬登入百度
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 1.開啟瀏覽器
browser = webdriver.Chrome(executable_path='chromedriver.exe')
# 2.開啟百度官網
browser.get('https://www.baidu.com')
browser.implicitly_wait(10)
# 3.找到登入按鈕並點選
login_btn = browser.find_element(by=By.LINK_TEXT, value='登入')
login_btn.click()
time.sleep(2)
# 4.選擇賬號登入方式並點選
login_by_pwd = browser.find_element(by=By.CSS_SELECTOR, value='#TANGRAM__PSP_11__changePwdCodeItem')
login_by_pwd.click()
time.sleep(2)
# 5.輸入使用者名稱和密碼
username = browser.find_element(by=By.ID, value='TANGRAM__PSP_11__userName')
password = browser.find_element(by=By.ID, value='TANGRAM__PSP_11__password')
username.send_keys('18963884980')
password.send_keys('almira10054X')
time.sleep(2)
# 6.最後點選登入
commit_btn = browser.find_element(by=By.ID, value='TANGRAM__PSP_11__submit')
commit_btn.click()
time.sleep(10)
# 關閉瀏覽器
browser.close()
2. 自動登入12306
3. 爬取商品資訊