日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python3 爬虫学习笔记 C04 【自动化测试工具 Selenium】

發布時間:2023/12/10 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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點擊進入下載頁面需要根據自己的操作系統下載對應的驅動
IEIEDriverServer點擊進入下載頁面根據自己 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。
示例:

from selenium import webdriver from selenium.webdriver.chrome.options import Optionspath = r'F:\PycharmProjects\Python3爬蟲\chromedriver.exe'# 實例化一個啟動參數對象 chrome_options = Options() # 添加啟動參數 chrome_options.add_argument('--window-size=1366,768') # 將參數對象傳入Chrome,則啟動了一個設置了窗口大小的Chrome browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options) browser.get('http://www.itrhx.com')

這樣就啟動了一個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() 方法即可實現
示例:

from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬蟲\chromedriver.exe' browser = webdriver.Chrome(executable_path=path) browser.get('https://www.itrhx.com') browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') browser.execute_script('alert("已到達最底端!")')

以上代碼實現了利用 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() 方法
示例:

from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬蟲\chromedriver.exe' browser = webdriver.Chrome(executable_path=path) url = 'http://www.itrhx.com' browser.get(url) footer_info = browser.find_element_by_id('footer') print(footer_info.text)

輸出結果:

Copyright 2018-2019 TRHX'BLOG | 鄂ICP備19003281-4 | 本站已勉強存活了 37620 小時 5752| 站點地圖 | 站長統計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 屬性可以獲取節點的大小等
示例:

from selenium import webdriverpath = r'F:\PycharmProjects\Python3爬蟲\chromedriver.exe' browser = webdriver.Chrome(executable_path=path) url = 'http://www.itrhx.com' browser.get(url) readmore = browser.find_element_by_class_name('readmore') print(readmore.id) print(readmore.location) print(readmore.tag_name) print(readmore.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。再重新獲取,發現結果就為空了
輸出結果:

[{'domain': 'zhihu.com', 'expiry': 1661065738.754333, 'httpOnly': False, 'name': 'd_c0', 'path': '/', 'secure': False, 'value': '"AODi_Lod7g-PTrrXUgXb1N4MkbStCrbNlD4=|1566457741"'}, {'domain': 'zhihu.com', 'httpOnly': False, 'name': '_xsrf', 'path': '/', 'secure': False, 'value': 'aba68431-9daf-4b62-a67a-023c1a24f0e8'}, {'domain': 'zhihu.com', 'expiry': 1629529738.75427, 'httpOnly': False, 'name': '_zap', 'path': '/', 'secure': False, 'value': 'b6f63cfc-a525-4ae6-a7bf-6384bd1e0548'}, {'domain': 'www.zhihu.com', 'expiry': 1566458637.754178, 'httpOnly': False, 'name': 'tgw_l7_route', 'path': '/', 'secure': False, 'value': '116a747939468d99065d12a386ab1c5f'}] [{'domain': 'www.zhihu.com', 'httpOnly': False, 'name': 'TRHX', 'path': '/', 'secure': True, 'value': 'germey'}, {'domain': 'zhihu.com', 'expiry': 1661065738.754333, 'httpOnly': False, 'name': 'd_c0', 'path': '/', 'secure': False, 'value': '"AODi_Lod7g-PTrrXUgXb1N4MkbStCrbNlD4=|1566457741"'}, {'domain': 'zhihu.com', 'httpOnly': False, 'name': '_xsrf', 'path': '/', 'secure': False, 'value': 'aba68431-9daf-4b62-a67a-023c1a24f0e8'}, {'domain': 'zhihu.com', 'expiry': 1629529738.75427, 'httpOnly': False, 'name': '_zap', 'path': '/', 'secure': False, 'value': 'b6f63cfc-a525-4ae6-a7bf-6384bd1e0548'}, {'domain': 'www.zhihu.com', 'expiry': 1566458637.754178, 'httpOnly': False, 'name': 'tgw_l7_route', 'path': '/', 'secure': False, 'value': '116a747939468d99065d12a386ab1c5f'}] [{'domain': 'zhihu.com', 'expiry': 1644217741.489889, 'httpOnly': False, 'name': '_xsrf', 'path': '/', 'secure': False, 'value': 'WNOjpDbNmz36B4nG1lzSAuPdTyORMX6J'}]

【4.13】前進與后退

使用 back() 方法后退,使用 forward() 方法前進,與瀏覽器的前進后退一樣
示例:

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.get('https://www.baidu.com/') browser.get('https://www.zhihu.com/') browser.back() time.sleep(1) browser.forward() browser.close()

【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() 方法來切換選項卡,其中參數是選項卡的代號。
輸出的選項卡代號列表:

['CDwindow-C9CADF1ED28CE44970655238552A8DCF', 'CDwindow-538D7F81E467746B7BB2D9D82E2D036E']

總結

以上是生活随笔為你收集整理的Python3 爬虫学习笔记 C04 【自动化测试工具 Selenium】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。