前言
selenium框架是Python用于控制瀏覽器的技術,在Python爬蟲獲取頁面源代碼的時候,是最重要的技術之一,通過控制瀏覽器,更加靈活便捷的獲取瀏覽器中網頁的源代碼。
還沒有安裝啟動selenium的同志請先看我的上一篇文章進行配置啟動 和 XPath基礎
對selenium進行瀏覽器和驅動進行配置Windows | Linux_使用 selenium 進行谷歌-CSDN博客
Python爬蟲 XPath 三方庫lxml-CSDN博客
這里就直接從基礎操作進行分享
目錄
selenium打開和關閉網站
在打開網站時獲取網站信息常用方法
使用selenium操作瀏覽器的常用方法
使用XPath定位瀏覽器具體地方常用方法
selenium等待頁面加載技術
對瀏覽器交互操作常用方法
模擬真人的瀏覽器驅動常見配置
實戰案例
selenium打開和關閉網站
#初始化瀏覽器驅動
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager(driver_version="谷歌瀏覽器版本").install()))#使用瀏覽器驅動打開網站
driver.get("https://www.example.com")#關閉瀏覽器
driver.quit()
在打開網站時獲取網站信息常用方法
我們的操作都是使用瀏覽器驅動調用的,所以獲取網站的方法都是瀏覽器驅動對象driver調用的
#獲取網站的源代碼
driver.page_source#獲取網站的截圖
driver.save_screenshot("圖片的相對路徑/圖片名稱帶圖片格式")
我們在爬蟲使用這個工具就是為了獲取網站源碼和截圖,后面過濾數據有專業的相關技術
對其他方法感興趣有空可以看他的官方文檔,編程知識太多了,只學調用方法最常用的和知道內部原理,遇到使用再對調用方法進行查詢使用
使用selenium操作瀏覽器的常用方法
selenium操作瀏覽器本質上就是使用XPath對瀏覽器的具體地方進行定位,然后使用點擊事件操作
XPath定位類似于你的鼠標移動的位置
點擊、下滑事件類似于你使用鼠標進行點擊、下滑等操作
使用XPath定位瀏覽器具體地方常用方法
注意: 這里編寫的XPath只能寫到到元素,不能直接獲取標簽的屬性值和內容,可以認為類似于移動鼠標,后面得到這個標簽對象才能再進行處理,不然會報錯
不推薦使用其他方式進行元素定位,在實戰中非常復雜,也只有XPath使用起來可以應對,而且XPath也是Python爬蟲數據過濾的最重要的技術,這個一定要非常熟練
from selenium.webdriver.common.by import By#這個方法只返回一個標簽對象
#這里XPath只能定位到標簽,不能取具體的值,不然報錯
title = driver.find_element(By.XPATH,"XPath表達式")#這個方法是以集合的形式返回多個標簽對象,沒有標簽返回空集合不會報錯,遍歷使用
titles = driver.find_elements(By.XPATH,"XPath表達式")#返回了Web標簽對象,我們就可以對這個標簽對象上面的屬性值和內容進行獲取了
#獲取這個Web標簽的內容
title.text
#獲取這個Web標簽中的屬性值
title.get_attribute('屬性名')
selenium等待頁面加載技術
等待,直到獲取到自己需要的web才往下執行,可以巧妙的解決網頁加載時間長但是不知道設置多長等待時間的問題
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait#等待通過XPath獲取的元素獲取到之后再往下進行title = WebDriverWait(driver, 最長等待時間).until(EC.presence_of_element_located((By.XPATH,'XPath表達式')) )
對瀏覽器交互操作常用方法
前面我們已經對需要操作的元素使用XPath進行獲取了,接下來我們要對這個元素進行點擊、輸入表單文字等操作
ActionChains是一個鏈式操作,一直往下點就可以了以ActionChains(瀏覽器驅動對象)開頭
perform()提交結尾
交互操作的庫
from selenium.webdriver import ActionChains# 綁定到瀏覽器驅動對象
actions = ActionChains(瀏覽器驅動對象)# 對前面使用XPath定位返回的Web元素對象進行操作# 左鍵點擊
click(Web元素對象)# 雙擊
double_click(Web元素對象)# 右鍵點擊
actions.context_click(Web元素對象)# 懸停在元素上
move_to_element(Web元素對象)# 相對當前位置移動
單位是像素
水平方向x:向右為正,向左為負
垂直方向y:向下為正,向上為負
move_by_offset(x, y)#使用鼠標從web起始元素拖拽到web目標元素
actions.drag_and_drop(web起始元素, web目標元素)#在web元素上面輸入內容
send_keys(輸入的內容)#中間可以加入停頓方法
pause(秒數)#提交,鏈式調用結尾
perform()
模擬真人的瀏覽器驅動常見配置
from selenium.webdriver.chrome.options import Optionsoptions = Options()
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36")
options.add_argument("--window-size=1920,1080") # 設置窗口大小
options.add_argument("--disable-blink-features=AutomationControlled") # 禁用自動化控制特征
options.add_argument("--disable-infobars") # 禁用提示條
options.add_argument("--no-sandbox") # 解決DevToolsActivePort文件不存在的報錯
options.add_argument("--disable-dev-shm-usage") # 禁用共享內存
options.add_argument("--disable-extensions") # 禁用擴展
options.add_argument("--disable-gpu") # 禁用GPU加速
options.add_argument("--disable-javascript") # 禁用JavaScript(根據需求調整)
options.add_argument("--incognito") # 隱身模式
options.add_argument("--headless") # 無頭模式(可選,等調試好了可以設置為無頭減少資源浪費)driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager(driver_version="谷歌瀏覽器版本").install()), options=options)
實戰案例
查看淘寶詳情商品,商品詳情頁面需要登錄狀態才可以查看全部內容,點擊淘寶詳情頁面上面的一鍵登錄進行模擬登錄之后,獲取到該商品詳情頁面的全部源代碼
后面就可以使用正則表達式和XPath過濾自己需要的數據了
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support import expected_conditions as EC# selenium 4的寫法
#加入一些常用元素,模擬真人環境
options = Options()
options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36")
options.add_argument("--window-size=1920,1080") # 設置窗口大小
options.add_argument("--disable-blink-features=AutomationControlled") # 禁用自動化控制特征
options.add_argument("--disable-infobars") # 禁用提示條
options.add_argument("--no-sandbox") # 解決DevToolsActivePort文件不存在的報錯
options.add_argument("--disable-dev-shm-usage") # 禁用共享內存
options.add_argument("--disable-extensions") # 禁用擴展
options.add_argument("--disable-gpu") # 禁用GPU加速
options.add_argument("--disable-javascript") # 禁用JavaScript(根據需求調整)
options.add_argument("--incognito") # 隱身模式#初始化瀏覽器驅動
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager(driver_version="谷歌瀏覽器版本").install()),options=options)
driver.get("淘寶的商品詳情頁面")#等待商品頁面一鍵登錄的按鈕元素的出現就往下執行
loginHTML = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH,'//span[@class="xM6AVLCbLn--loginBtn--_3aec1d3"]')))
#點擊一鍵登錄
actions = ActionChains(driver).click(loginHTML).perform()#對登錄界面的賬號密碼點擊登錄
#準備需要XPath定位的元素
usern = driver.find_element(By.XPATH,'//input[@id="fm-login-id"]')
pwd = driver.find_element(By.XPATH,'//input[@id="fm-login-password"]')
loginHb = driver.find_element(By.XPATH,'//button[@class="fm-button fm-submit password-login button-low-light"]')#使用準備號的元素對象操作瀏覽器登錄,之間加入pause方法停頓更真實
ActionChains(driver).click(usern).pause(1).send_keys('淘寶賬號').pause(0.5).perform()
ActionChains(driver).click(pwd).pause(1).send_keys('淘寶密碼').pause(0.5).perform()
ActionChains(driver).click(loginHb).perform()#等待頁面是否出現商品詳情元素
#因為商品詳情元素只有登錄狀態之后才有的,所以這里的效果等價于確定我瀏覽商品的時候已經登錄完成了,后面對這個頁面的源代碼進行獲取
resFlag = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH,'//div[@class="xM6AVLCbLn--tabDetailWrap--_3622a08"]')))
#獲取頁面源代碼
print(driver.page_source)
#關閉谷歌瀏覽器
driver.quit()