Python3 爬虫学习笔记 C04 【自动化测试工具 Selenium】
Python3 爬蟲學習筆記第四章 —— 【自動化測試工具 Selenium】
文章目錄
- 【4.1】下載驅動
- 【4.2】聲明瀏覽器對象
- 【4.3】訪問頁面
- 【4.4】啟動參數
- 【4.5】查找節點
- 【4.5.1】查找單個節點
- 【4.5.2】查找多個節點
- 【4.6】節點交互
- 【4.7】動作鏈
- 【4.8】執行 JavaScript
- 【4.9】禁用加載
- 【4.10】獲取節點信息
- 【4.10.1】獲取屬性
- 【4.10.2】獲取文本值
- 【4.10.3】獲取 ID、位置、標簽名、大小
- 【4.11】延時等待
- 【4.11.1】隱式等待
- 【4.11.2】顯式等待
- 【4.12】Cookies
- 【4.13】前進與后退
- 【4.14】選項卡
Selenium 是一個用于 Web 應用程序測試的工具。Selenium 測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。利用它可以驅動瀏覽器執行特定的動作,如點擊、下拉等操作,同時還可以獲取瀏覽器當前呈現的頁面的源代碼,做到可見即可爬。對于一些 JavaScript 動態渲染的頁面來說,此種抓取方式非常有效。本文重點以 Selenium 使用谷歌瀏覽器的 Webdriver 為例。
【4.1】下載驅動
使用 Selenium 操作不同瀏覽器,需要不同瀏覽器相應的驅動支持:
| 谷歌瀏覽器 | chromedriver | 點擊進入下載頁面 | 需要根據自己瀏覽器的版本下載不同版本的驅動 |
| 火狐瀏覽器 | geckodriver | 點擊進入下載頁面 | 需要根據自己的操作系統下載對應的驅動 |
| IE | IEDriverServer | 點擊進入下載頁面 | 根據自己 selenium 版本和系統版本下載對應版本的驅動, selenium 版本可以在cmd中輸入pip show selenium查看 |
【4.2】聲明瀏覽器對象
不同瀏覽器的對象聲明方法:
from selenium import webdriverbrowser = webdriver.Chrome() # 谷歌瀏覽器 browser = webdriver.Firefox() # 火狐瀏覽器 browser = webdriver.Edge() # Edge browser = webdriver.PhantomJS() # PhantomJS無界面瀏覽器 browser = webdriver.Safari() # Safari瀏覽器【4.3】訪問頁面
from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬蟲\chromedriver.exe' browser = webdriver.Chrome(executable_path=path) browser.get('https://www.itrhx.com') print(browser.page_source) browser.close()運行代碼就會自動打開谷歌瀏覽器,實現了用 get() 方法訪問 www.itrhx.com ,path 里面的內容是谷歌瀏覽器驅動的目錄, r 表示不轉義,使用真實字符。print(browser.page_source) 表示打印頁面源代碼
【4.4】啟動參數
Chrome Options 是一個 Chrome 的參數對象,在此對象中使用 add_argument() 方法可以添加啟動參數,添加完畢后可以在初始化 Webdriver 對象時將此 Options 對象傳入,則可以實現以特定參數啟動Chrome。
示例:
這樣就啟動了一個1366x768分辨率的瀏覽器
常見的啟動參數:
| –user-agent="" | 設置請求頭的 User-Agent |
| –window-size=xxx, xxx | 設置瀏覽器分辨率 |
| –headless | 無界面運行 |
| –start-maximized | 最大化運行 |
| –incognito | 隱身模式 |
| –disable-javascript | 禁用javascript |
| –disable-infobars | 禁用“瀏覽器正在被自動化程序控制”的提示 |
所有的啟動參數:https://peter.sh/experiments/chromium-command-line-switches/
【4.5】查找節點
Selenium 可以驅動瀏覽器完成各種操作,比如填充表單、模擬點擊等。要完成這些操作,實現要知道在哪里點擊,哪里填充,這就是 Selenium 節點查找
【4.5.1】查找單個節點
所有獲取單個節點的方法:
-
find_element_by_id 【通過元素的 id 來選擇】
例:<div id='bdy-inner'>test</div>,查找:driver.find_element_by_id('bdy-inner') -
find_element_by_name 【通過元素的 name 來選擇】
例:<input name="username" type="text" />,查找:driver.find_element_by_name('password') -
find_element_by_xpath 【通過 xpath 選擇】
例:<form id="loginForm">,查找:driver.find_element_by_xpath("//form[@id='loginForm']") -
find_element_by_link_text 【通過鏈接地址選擇】
例:<a href="continue.html">continue</a>,查詢:driver.find_element_by_link_text('continue') -
find_element_by_partial_link_text 【通過鏈接的部分地址選擇】
例:<a href="continue.html">continue</a>,查詢:driver.find_element_by_link_text('cont') -
find_element_by_tag_name 【通過元素的名稱選擇】
例:<h1>welcome<h1>,查詢:driver.find_element_by_tag_name('h1') -
find_element_by_class_name 【通過元素的 class 選擇】
例:<p class="content">welcome to TRHX'S BLOG!</p>,查詢:driver.find_element_by_class_name('content') -
find_element_by_css_selector 【通過元素的 class 選擇】
例:<div class='bdy-inner'>test</div>,查詢:driver.find_element_by_css_selector('div.bdy-inner') -
find_element() 【通用方法,需要傳遞兩個參數:查找方式 By 和值】
例:driver.find_element_by_id('inner') 等價于 find_element(By.ID, inner),使用時需要from selenium.webdriver.common.by import By
示例:
from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬蟲\chromedriver.exe' browser = webdriver.Chrome(executable_path=path) browser.get('https://www.itrhx.com') blog_title = browser.find_elements_by_class_name(('title')) print(blog_title[0].text) browser.close()輸出結果:
TRHX'S BLOG【4.5.2】查找多個節點
所有獲取多個節點的方法:(與查找單個節點的區別是 element 多加了個 s)
- find_elements_by_id
- find_elements_by_name
- find_elements_by_xpath
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
- find_elements()
示例:
from selenium import webdriver from selenium.webdriver.common.by import Bypath = r'F:\PycharmProjects\Python3爬蟲\chromedriver.exe' browser = webdriver.Chrome(executable_path=path) browser.get('https://www.itrhx.com') article_title = browser.find_elements(By.XPATH, "//h2[@class='title']") print(article_title) browser.close()【4.6】節點交互
Selenium 可以驅動瀏覽器來執行一些操作,也就是說可以讓瀏覽器模擬執行一些動作。稱為節點交互,比較常見的用法有:
- send_keys:模擬按鍵輸入
- clear:清除元素的內容
- click:單擊元素
- submit:提交表單
示例:
from selenium import webdriver from selenium.webdriver.common.keys import Keyspath = r'F:\PycharmProjects\Python3爬蟲\chromedriver.exe' browser = webdriver.Chrome(executable_path=path) browser.get('https://www.itrhx.com') search = browser.find_element_by_xpath('//div[@class="cover-wrapper"]/cover/div/form/input') search.send_keys("Python") search.send_keys(Keys.ENTER)此處模擬了鍵盤,需要導入鍵盤類 Keys(),send_keys(Keys.ENTER)表示模擬回車鍵,程序首先打開 www.itrhx.com ,也就是我的博客,然后通過 xpath 找到搜索框,輸入 Python 并回車,等待結果顯示出來
更多節點交互動作:https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement
【4.7】動作鏈
Selenium 還有另外一些操作,它們沒有特定的執行對象,比如鼠標拖曳、鍵盤按鍵等,這些動作用另一種方式來執行,那就是動作鏈。以一個拖曳實例為例:http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable
from selenium import webdriver from selenium.webdriver import ActionChainspath = r'F:\PycharmProjects\Python3爬蟲\chromedriver.exe' browser = webdriver.Chrome(executable_path=path) url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' browser.get(url) browser.switch_to.frame('iframeResult') source = browser.find_element_by_css_selector('#draggable') target = browser.find_element_by_css_selector('#droppable') actions = ActionChains(browser) actions.drag_and_drop(source, target) actions.perform()依次選中要拖曳的節點和拖曳到的目標節點,接著聲明 ActionChains 對象并將其賦值為 actions 變量,然后通過調用 actions 變量的 drag_and_drop() 方法,再調用 perform() 方法執行動作,此時就完成了拖曳操作,更多動作鏈操作:https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains
【4.8】執行 JavaScript
Selenium API 并沒有提供執行 JavaScript 的方法,但是實際上是可以實現的。比如,下拉進度條,它可以直接模擬運行 JavaScript,此時使用 execute_script() 方法即可實現
示例:
以上代碼實現了利用 execute_script() 方法將進度條下拉到最底部,然后彈出 alert 提示框。
【4.9】禁用加載
使用Selenium 時,限制圖片和 Javascript 執行,從而提高網頁加載速度。
from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬蟲\chromedriver.exe'options = webdriver.ChromeOptions() prefs = {'profile.default_content_setting_values': {'images': 2,'notifications' : 2, # 禁用彈窗'javascript': 2 # 2即為禁用的意思} } options.add_experimental_option('prefs', prefs) browser = webdriver.Chrome(executable_path=path, chrome_options=options) browser.get('http://www.itrhx.com')【4.10】獲取節點信息
通過 page_source 屬性可以獲取網頁的源代碼,然后可以使用解析庫(如正則表達式、Beautiful Soup等)來提取相關信息,Selenium 已經提供了選擇節點的方法,返回的是 WebElement 類型,它也有相關的方法和屬性來直接提取節點信息,如屬性、文本等。就不需要再次使用解析庫來提取信息了
【4.10.1】獲取屬性
使用 get_attribute() 方法來獲取節點的屬性:
from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬蟲\chromedriver.exe' browser = webdriver.Chrome(executable_path=path) url = 'http://www.itrhx.com' browser.get(url) meta = browser.find_element_by_id('header-meta') print(meta) print(meta.get_attribute('class'))輸出結果:
<selenium.webdriver.remote.webelement.WebElement (session="d03cdaa497441d2e2a5161139b4a7ea5", element="83f8fff9-60d7-4e9a-ade3-a8e97c9f0844")> meta【4.10.2】獲取文本值
每個 WebElement 節點都有 text 屬性,直接調用這個屬性就可以得到節點內部的文本信息,相當于 Beautiful Soup 的 get_text() 方法、pyquery 的 text() 方法
示例:
輸出結果:
Copyright 2018-2019 TRHX'BLOG | 鄂ICP備19003281號-4 | 本站已勉強存活了 376 天 20 小時 57 分 52 秒 | 站點地圖 | 站長統計PoweredHexo HostedGitHub DNRAliyun CDNjsDelivr ThemeMaterial X BY-NC-SA 4.0 Link996.ICU UV4898 PV22066 WordCount54.9k【4.10.3】獲取 ID、位置、標簽名、大小
其他屬性,比如 id 屬性可以獲取節點 id,location 屬性可以獲取該節點在頁面中的相對位置,tag_name 屬性可以獲取標簽名稱,size 屬性可以獲取節點的大小等
示例:
輸出結果:
7df561d3-7ea4-4b90-96aa-64044060bb47 {'x': 50, 'y': 1063} div {'height': 39, 'width': 465}【4.11】延時等待
在 Selenium 中,get() 方法會在網頁框架加載結束后結束執行,某些頁面有額外的 Ajax 請求,若此時立即獲取 page_source,可能并不是瀏覽器完全加載完成的頁面,這里需要延時等待一定時間,確保節點已經加載出來
【4.11.1】隱式等待
當查找節點的時候,節點并沒有立即出現,隱式等待將等待一段時間再查找該節點,使用 implicitly_wait() 方法可以實現隱式等待
from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬蟲\chromedriver.exe' browser = webdriver.Chrome(executable_path=path) browser.implicitly_wait(10) browser.get('https://www.itrhx.com') readmore = browser.find_element_by_class_name('readmore') print(readmore)【4.11.2】顯式等待
指定要查找的節點,然后指定一個最長等待時間。如果在規定時間內加載出來了這個節點,就立即返回查找的節點,果到了規定時間依然沒有加載出該節點,則拋出超時異常
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 ECpath = r'F:\PycharmProjects\Python3爬蟲\chromedriver.exe' browser = webdriver.Chrome(executable_path=path) browser.implicitly_wait(10) browser.get('https://www.itrhx.com') wait = WebDriverWait(browser, 10) footer_info = wait.until(EC.presence_of_element_located((By.ID, 'footer'))) print(footer_info)引入 WebDriverWait 對象,指定最長等待時間,調用它的 until() 方法,傳入要等待條件 expected_conditions。比如,這里傳入了 presence_of_element_located 這個條件,代表節點出現的意思,其參數是節點的定位元組,也就是 ID 為 footer 的節點。
這樣可以做到的效果就是,在 10 秒內如果 ID 為 footer 的節點成功加載出來,就返回該節點;如果超過 10 秒還沒有加載出來,就拋出異常。
加載成功時輸出結果:
<selenium.webdriver.remote.webelement.WebElement (session="4ca7015891fded627ab680d9462e9361", element="3a80235c-9824-420b-b827-662638422765")>加載失敗時輸出結果:
TimeoutException Traceback (most recent call last) <ipython-input-4-f3d73973b223> in <module>()7 browser.get('https://www.itrhx.com')8 wait = WebDriverWait(browser, 10) ----> 9 input = wait.until(EC.presence_of_element_located((By.ID, 'footer')))【4.12】Cookies
使用 Selenium,可以方便地對 Cookies 進行獲取、添加、刪除等操作:
from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬蟲\chromedriver.exe' browser = webdriver.Chrome(executable_path=path) browser.get('https://www.zhihu.com/explore') print(browser.get_cookies()) browser.add_cookie({'name': 'TRHX', 'domain': 'www.zhihu.com', 'value': 'germey'}) print(browser.get_cookies()) browser.delete_all_cookies() print(browser.get_cookies())訪問知乎,加載完成后,瀏覽器已經生成了 Cookies。調用 get_cookies() 方法獲取所有的 Cookies。然后再添加一個 Cookie,傳入一個字典,有 name、domain 和 value 等內容。接下來,再次獲取所有的 Cookies。可以發現,結果就多了這一項新加的 Cookie。最后,調用 delete_all_cookies() 方法刪除所有的 Cookies。再重新獲取,發現結果就為空了
輸出結果:
【4.13】前進與后退
使用 back() 方法后退,使用 forward() 方法前進,與瀏覽器的前進后退一樣
示例:
【4.14】選項卡
和瀏覽器一樣,在 Selenium 中也可以新建一個選項卡
from selenium import webdriver import timepath = r'F:\PycharmProjects\Python3爬蟲\chromedriver.exe' browser = webdriver.Chrome(executable_path=path) browser.get('https://www.itrhx.com') browser.execute_script('window.open()') print(browser.window_handles) browser.switch_to.window(browser.window_handles[1]) browser.get('https://www.baidu.com') time.sleep(1) browser.switch_to.window(browser.window_handles[0]) browser.get('https://www.zhihu.com')首先訪問我的博客,然后調用了 execute_script() 方法,傳入 window.open() 這個 JavaScript 語句開啟一個新的選項卡。再調用 window_handles 屬性獲取當前開啟的所有選項卡,返回的是選項卡的代號列表。調用 switch_to_window() 方法來切換選項卡,其中參數是選項卡的代號。
輸出的選項卡代號列表:
總結
以上是生活随笔為你收集整理的Python3 爬虫学习笔记 C04 【自动化测试工具 Selenium】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 元宇宙熄火 千亿果链巨头歌尔闪崩跌停 回
- 下一篇: Python3 基础学习笔记 C05【字