07selenium
selenium
動態網頁爬蟲:
- 分析接口,然后通過代碼請求這個接口
- 使用
selenium+webdriver模擬瀏覽器獲取數據
1. selenium和webdriver
Selenium是一個Web的自動化測試工具,最初是為網站自動化測試而開發的,Selenium可以直接調用瀏覽器,它支持所有主流的瀏覽器。我們可以使用selenium很容易完成之前編寫的爬蟲。webdriver可以理解它是瀏覽器的驅動。
selenium本質是通過驅動瀏覽器,完全模擬瀏覽器的操作,比如跳轉、輸入、點擊、下拉等,來拿到網頁渲染之后的結果,可支持多種瀏覽器
-
pip install selenium==3.141.0 -
下載瀏覽器驅動程序:
卸載已經安裝的模塊:pip uninstall 模塊名
2. 瀏覽器對象
get(url=url):地址欄輸入url地址并確認page_source:查看網頁源碼(與element內容一致)maximize_window():瀏覽器窗口最大化quit():關閉瀏覽器
3. selenium定位元素
# 使用元素定位前需要導包
from selenium.webdriver.common.by import By
# find_element 找一個元素
# find_elements 找多個元素
find_element(By.ID, '根據標簽id屬性進行定位')find_element(By.NAME, '根據標簽name屬性進行定位')find_element(By.CLASS_NAME, '根據標簽class屬性進行定位')find_element(By.XPATH, '根據xpath語法進行定位')find_element(By.CSS_SELECTOR, '根據css語法進行定位')find_element(By.LINK_TEXT, '根據標簽文本內容進行定位')
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
url = 'https://www.maoyan.com/board/4?offset=0'
driver = webdriver.Chrome()
driver.get(url)
driver.maximize_window()
def get_data():
"""獲取一頁的數據"""
dds = driver.find_elements(By.XPATH, '//*[@id="app"]/div/div/div[1]/dl/dd')
for dd in dds:
# text屬性:獲取當前元素下的所有文字
print(dd.text.split("\n"))
print("-" * 100)
while True:
get_data()
try:
driver.find_element(By.LINK_TEXT, "下一頁").click()
time.sleep(2)
except Exception as e:
print(e)
print('爬取完成')
driver.quit()
break
4.節點對象操作
- send_keys('') 搜索框發送內容
- click() 點擊
- text 獲取文本內容
- get_attribute('src') 獲取屬性值
- find('') 查找響應中的字符串
5. 無界面模式
from selenium import webdriver
options = webdriver.ChromeOptions()
# 添加無界面參數
options.add_argument('--headless')
browser = webdriver.Chrome(options=options)
6. 打開新窗口和切換頁面
-
selenium中沒有專門的打開新窗口的方法,是通過
execute_script()來執行js腳本的形式來打開新窗口的driver.execute_script("window.open('https://www.douban.com/')")
- 在selenium眼中,新窗口是不會變成當前執行命令的窗口 -1為切換到最新(最后)顯示的窗口 ,0為切換到初始窗口
driver.switch_to.window(driver.window_handles[-1])
-
關掉當前窗口,回到初始的窗口視角
-
driver.close() driver.switch_to.window(driver.window_handles[0])
6. selenium-iframe
網頁中嵌套了網頁,先切換到iframe,然后再執行其他操作
-
切換到要處理的Frame
driver.switch_to.frame(frame節點對象) -
在Frame中定位頁面元素并進行操作
-
返回當前處理的Frame的上一級頁面或主頁面
# 返回上一級 driver.switch_to.parent_frame() # 返回主頁面 driver.switch_to.default_content()
7. 操作cookie
- 獲取cookie:
driver.get_cookies() - 根據cookie的key獲取value:
value = driver.get_cookie(key) - 刪除所有的cookie:
driver.delete_all_cookies() - 刪除某個cookie:
driver.delete_cookie(key)
8. 隱式等待和顯式等待
- 隱式等待:標簽定位時,指定一個時間,在這個時間內一直會處于等待狀態。隱式等待需要使用driver.implicitly_wait
- 顯式等待:指定在某個時間內,如果某個條件滿足了,那么就不會再等待,針對某一操作使用。顯式等待用的方法需導包
- from selenium.webdriver.support.ui import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC

浙公網安備 33010602011771號