selenium模組

阿麗米熱發表於2023-03-27

一、selenium模組介紹

selenium最初是一個自動化測試工具,而爬蟲中使用它主要是為了解決requests無法直接執行JavaScript程式碼的問題。selenium本質是透過驅動瀏覽器,完全模擬瀏覽器的操作,比如跳轉、輸入、點選、下拉等,來拿到網頁渲染之後的結果,可支援多種瀏覽器。但是它的使用必須配合瀏覽器驅動而且瀏覽器版本也要一樣才可以。正式使用之前需要做一些準備工作。瀏覽器和瀏覽器驅動的話推薦使用谷歌瀏覽器(因為這個瀏覽器支援selenium的最好)
怎麼檢視谷歌瀏覽器的版本
瀏覽器右上角》點三個點點》往下找幫助並點選》之後再點關於Google Chrome就可以檢視版本
image
確定自己瀏覽器版本之後下載對應的驅動
點選這裡下載
谷歌瀏覽器驅動
準備下載驅動的時候發現驅動和瀏覽器版本無法完全一致,我這裡有兩個不用糾結二選一即可。
再根據自己的電腦的作業系統選擇即可
所有的準備工作已完成接下來我們學習如何使用selenium模組吧

二、selenium基本使用

  1. 下載selenium模組
pip install selenium
  1. 下載好了的驅動拖到專案路徑下

  2. 寫程式碼控制谷歌瀏覽器

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. 爬取商品資訊


相關文章