官术网_书友最值得收藏!

1.5.4 Selenium的應用

本節的示例代碼均以Chrome瀏覽器為例,其他瀏覽器的操作參考Chrome瀏覽器即可。

1.打開瀏覽器

可以通過Selenium.webdriver模塊中瀏覽器所對應的相關方法(如表1-15所示)打開瀏覽器,并獲得WebDriver對象。

表1-15 瀏覽器對應的方法

示例代碼如下:

     #資源包\Code\chapter1\1.5\0166.py
     from selenium import webdriver
     #創建瀏覽器WebDriver對象,并打開Chrome瀏覽器
     Chrome_browser=webdriver.Chrome()
     print(type(Chrome_browser))

2.關閉窗口

可以通過WebDriver對象提供的相關方法關閉窗口,具體如下。

1)close()方法

該方法用于關閉單個窗口,其語法格式如下:

     close()
2)quit()方法

該方法用于關閉所有窗口,其語法格式如下:

     quit()

示例代碼如下:

     #資源包\Code\chapter1\1.5\0167.py
     from selenium import webdriver
     import time
     #創建瀏覽器WebDriver對象,并打開Chrome瀏覽器
     Chrome_browser=webdriver.Chrome()
     time.sleep(2)
     Chrome_browser.quit()

3.獲取網頁源代碼

可以通過WebDriver對象的相關屬性和方法獲取網頁源代碼,具體如下。

1)屬性page_source

該屬性用于獲取網頁的源代碼,其語法格式如下:

     page_source
2)get()方法

該方法用于訪問指定的URL,其語法格式如下:

     get(url)

其中,參數url表示URL。

示例代碼如下:

     #資源包\Code\chapter1\1.5\0168.py
     from selenium import webdriver
     import time
     Chrome_browser=webdriver.Chrome()
     url='http://www.oldxia.com/'
     Chrome_browser.get(url)
     res=Chrome_browser.page_source
     with open('oldxia.html','w',encoding='utf-8')as f:
         f.write(res)
     time.sleep(2)
     Chrome_browser.quit()

4.獲取網頁信息

可以通過WebDriver對象的相關屬性獲取網頁信息,具體如下。

1)屬性title

該屬性用于獲取當前頁面的標題,其語法格式如下:

     title
2)屬性current_url

該屬性用于獲取當前頁面的URL,其語法格式如下:

     current_url

示例代碼如下:

     #資源包\Code\chapter1\1.5\0169.py
     from selenium import webdriver
     import time
     Chrome_browser=webdriver.Chrome()
     url='http://www.oldxia.com/'
     Chrome_browser.get(url)
     Chrome_title=Chrome_browser.title
     Chrome_current_url=Chrome_browser.current_url
     print(Chrome_title)
     print(Chrome_current_url)
     time.sleep(2)
     Chrome_browser.quit()

5.操作網頁

可以通過WebDriver對象的相關方法操作網頁,具體如下。

1)set_window_size()方法

該方法用于設置瀏覽器的尺寸,其語法格式如下:

     set_window_size(width,height)

其中,參數width表示瀏覽器的寬度;參數height表示瀏覽器的高度。

2)back()方法

該方法用于控制瀏覽器后退,其語法格式如下:

     back()
3)forward()方法

該方法用于控制瀏覽器前進,其語法格式如下:

     forward()
4)refresh()方法

該方法用于刷新當前頁面,其語法格式如下:

     refresh()

示例代碼如下:

     #資源包\Code\chapter1\1.5\0170.py
     from selenium import webdriver
     import time
     Chrome_browser=webdriver.Chrome()
     url='http://www.oldxia.com/'
     Chrome_browser.get(url)
     Chrome_browser.set_window_size(1000,600)
     Chrome_browser.refresh()
     Chrome_browser.back()
     Chrome_browser.forward()
     time.sleep(2)
     Chrome_browser.quit()

6.元素定位

可以通過WebDriver對象的相關方法對網頁中的元素進行定位。

1)find_element()方法

該方法用于獲取符合條件的第1個元素,并返回一個WebElement對象,其語法格式如下:

     find_element(by,value)

其中,參數by表示selenium.webdriver.common.by模塊中的By類,其包括多種元素定位的方式,即By.ID(id屬性)、By.CLASS_NAME(class屬性)、By.NAME(name屬性)、By.TAG_NAME(標簽名)、By.XPATH(XPath)、By.CSS_SELECTOR(CSS選擇器)、By.LINK_TEXT(超鏈接文本內容)和By.PARTIAL_LINK_TEXT(部分超鏈接文本內容);參數value表示元素定位方式所對應的值。

2)find_elements()方法

該方法用于獲取符合條件的所有元素,并返回一個由WebElement對象所組成的列表,其語法格式如下:

     find_elements(by,value)

其中,參數by表示selenium.webdriver.common.by模塊中的By類,其包括多種元素定位的方式,即By.ID(id屬性)、By.CLASS_NAME(class屬性)、By.NAME(name屬性)、By.TAG_NAME(標簽名)、By.XPATH(XPath)、By.CSS_SELECTOR(CSS選擇器)、By.LINK_TEXT(超鏈接文本內容)和By.PARTIAL_LINK_TEXT(部分超鏈接文本內容);參數value表示元素定位方式所對應的值。

示例代碼如下:

     from selenium import webdriver
     from selenium.webdriver.common.by import By
     import time
     Chrome_browser=webdriver.Chrome()
     url='http://www.sina.com.cn/'
     Chrome_browser.get(url)
     res1=Chrome_browser.find_element(by=By.ID,value='xy-impcon')
     print(res1)
     print(type(res1))
     print('================================')
     res2=Chrome_browser.find_elements(by=By.CLASS_NAME,value='linkNewsTopBold')
     print(res2)
     print(type(res2))
     print('================================')
     res3=Chrome_browser.find_element(by=By.NAME,value='loginname')
     print(res3)
     print(type(res3))
     print('================================')
     res4=Chrome_browser.find_element(by=By.TAG_NAME,value='input')
     print(res4)
     print(type(res4))
     print('================================')
     res5=Chrome_browser.find_element(by=By.XPATH,value="//div[@id='SI_Order_B']")
     print(res5)
     print(type(res5))
     print('================================')
     res6=Chrome_browser.find_element(by=By.CSS_SELECTOR,value='#SI_Order_B')
     print(res6)
     print(type(res6))
     print('================================')
     res7=Chrome_browser.find_element(by=By.LINK_TEXT,value='做大做強數字經濟構筑國家競爭
     新優勢')
     print(res7)
     print(type(res7))
     print('================================')
     res8=Chrome_browser.find_element(by=By.PARTIAL_LINK_TEXT,value='文明之美看東方')
     print(res8)
     print(type(res8))
     time.sleep(2)
     Chrome_browser.quit()

7.獲取元素信息

可以通過WebElement對象的相關屬性和方法獲取元素信息,具體如下:

1)屬性text

該屬性用于獲取元素的文本內容,其語法格式如下:

     text
2)屬性size

該屬性用于獲取元素的尺寸,其語法格式如下:

     size
3)get_attribute()方法

該方法用于獲取元素中指定屬性的屬性值,其語法格式如下:

     get_attribute(name)

其中,參數name表示元素的屬性。

示例代碼如下:

     #資源包\Code\chapter1\1.5\0172.py
     from selenium import webdriver
     from selenium.webdriver.common.by import By
     import time
     Chrome_browser=webdriver.Chrome()
     url='https://www.baidu.com/'
     Chrome_browser.get(url)
     time.sleep(3)
     element=Chrome_browser.find_element(by=By.LINK_TEXT,value="新聞")
     ele_text=element.text
     ele_attribute=element.get_attribute('class')
     ele_size=element.size
     print(ele_text)
     print(ele_attribute)
     print(ele_size)
     time.sleep(2)
     Chrome_browser.quit()

8.操作元素

可以通過WebElement對象的click()方法單擊指定的元素,其語法格式如下:

     click()

示例代碼如下:

     #資源包\Code\chapter1\1.5\0173.py
     from selenium import webdriver
     from selenium.webdriver.common.by import By
     import time
     Chrome_browser=webdriver.Chrome()
     url='https://www.baidu.com/'
     Chrome_browser.get(url)
     time.sleep(3)
     element=Chrome_browser.find_element(by=By.LINK_TEXT,value="新聞")
     element.click()
     time.sleep(2)
     Chrome_browser.quit()

9.鼠標事件

鼠標事件主要用于在網頁中模擬鼠標操作。

在Selenium中,關于鼠標事件的相關方法均封裝在selenium.webdriver.common.action_chains模塊中的ActionChains類,具體如下。

1)ActionChains()方法

該方法主要用于創建ActionChains對象,其語法格式如下:

     ActionChains(driver)

其中,參數driver表示WebDriver對象。

2)move_to_element()方法

該方法主要用于執行鼠標的懸停操作,其語法格式如下:

     move_to_element(to_element)

其中,參數to_element表示WebElement對象。

3)context_click()方法

該方法主要用于執行鼠標的右擊操作,其語法格式如下:

     context_click(on_element)

其中,參數on_element表示WebElement對象。

4)double_click()方法

該方法主要用于執行雙擊鼠標的左鍵操作,其語法格式如下:

     double_click(on_element)

其中,參數on_element表示WebElement對象。

5)perform()方法

該方法用于提交鼠標事件,其語法格式如下:

     perform()

示例代碼如下:

     #資源包\Code\chapter1\1.5\0174.py
     from selenium import webdriver
     from selenium.webdriver.common.by import By
     from selenium.webdriver.common.action_chains import ActionChains
     import time
     Chrome_browser=webdriver.Chrome()
     url='http://www.baidu.com/'
     Chrome_browser.get(url)
     Chrome_browser.set_window_size(1600,800)
     element1=Chrome_browser.find_element(by=By.ID,value='s-usersetting-top')
     ActionChains(Chrome_browser).move_to_element(element1).perform()
     time.sleep(3)
     Chrome_browser.refresh()
     element2=Chrome_browser.find_element(by=By.LINK_TEXT,value="圖片")
     ActionChains(Chrome_browser).context_click(element2).perform()
     time.sleep(3)
     Chrome_browser.refresh()
     element3=Chrome_browser.find_element(by=By.LINK_TEXT,value="新聞")
     ActionChains(Chrome_browser).double_click(element3).perform()
     time.sleep(2)
     Chrome_browser.quit()

10.鍵盤事件

鍵盤事件主要用于在網頁中模擬鍵盤操作。

可以通過WebElement對象的send_keys()方法模擬鍵盤操作,其語法格式如下:

     send_keys(*value)

其中,參數value既可以表示用戶自定義的輸入信息,又可以模擬鍵盤中的按鍵,而鍵盤中的按鍵則需要通過selenium.webdriver.common.keys模塊中Keys類的常量進行表示,其常用的按鍵如表1-16所示。

表1-16 鍵盤中常用的按鍵

示例代碼如下:

     #資源包\Code\chapter1\1.5\0175.py
     from selenium import webdriver
     from selenium.webdriver.common.by import By
     import time
     Chrome_browser=webdriver.Chrome()
     url='http://www.baidu.com/'
     Chrome_browser.get(url)
     Chrome_browser.set_window_size(1600,800)
     Chrome_browser.find_element(by=By.ID,value='kw').send_keys('老夏學院')
     Chrome_browser.find_element(by=By.ID,value='su').click()
     time.sleep(2)
     Chrome_browser.quit()

11.切換窗口

在操作網頁的過程中,經常涉及窗口的切換,即當單擊網頁中的某個鏈接時,如果新打開了一個窗口,并且需要在該窗口進行相關操作,則此時必須進行窗口切換,因為當前的窗口句柄仍然是鏈接所在頁面的窗口,如果不切換窗口,就無法在新打開的窗口中進行相關操作。

可以通過WebDriver對象中的相關屬性切換窗口,具體如下。

1)屬性current_window_handle

該屬性用于獲得當前窗口句柄,其語法格式如下:

     current_window_handle
2)屬性window_handles

該屬性用于獲得當前所有打開的窗口句柄,其語法格式如下:

     window_handles
3)屬性switch_to

該屬性用于創建SwitchTo對象,并通過該對象的window()方法切換到指定的窗口,其語法格式如下:

     switch_to.window(window_name)

其中,參數window_name表示窗口句柄。

示例代碼如下:

     #資源包\Code\chapter1\1.5\0176.py
     from selenium import webdriver
     from selenium.webdriver.common.by import By
     import time
     Chrome_browser=webdriver.Chrome()
     url='http://www.baidu.com/'
     Chrome_browser.get(url)
     Chrome_browser.set_window_size(1600,800)
     #獲得當前的窗口句柄,即"百度首頁"
     sreach_Windows=Chrome_browser.current_window_handle
     Chrome_browser.find_element(by=By.LINK_TEXT,value='登錄').click()
     time.sleep(2)
     Chrome_browser.find_element(by=By.LINK_TEXT,value="立即注冊").click()
     time.sleep(2)
     #獲得當前所有打開的窗口句柄,包括"百度首頁",以及新彈出的窗口"立即注冊"
     all_handles=Chrome_browser.window_handles
     for handle in all_handles:
     #如果當前窗口句柄不是"百度首頁",則將窗口切換為"立即注冊"
         if handle!=sreach_Windows:
     Chrome_browser.switch_to.window(handle)
             print('這里是"立即注冊"')
     Chrome_browser.find_element(by=By.NAME,value="userName").send_keys('123456789')
             time.sleep(2)
     time.sleep(2)
     Chrome_browser.quit()

12.操作警告框、確認框和提示框

首先,通過SwitchTo對象的屬性alert定位到JavaScript所生成的警告框、確認框和提示框,并返回一個Alert對象,其語法格式如下:

     alert

然后,通過Alert對象的相關屬性和方法即可操作警告框、確認框和提示框。

1)屬性text

該屬性用于獲取警告框、確認框或提示框中的文本內容,其語法格式如下:

     text
2)accept()方法

該方法用于接受警告框、確認框和提示框,其語法格式如下:

     accept()
3)dismiss()方法

該方法用于解散警告框、確認框和提示框,其語法格式如下:

     dismiss()
4)send_keys()方法

該方法用于將文本內容發送至提示框,其語法格式如下:

     send_keys(keysToSend)

其中,參數keysToSend表示待發送的文本內容。

示例代碼如下:

     #資源包\Code\chapter1\1.5\0177.py
     from selenium import webdriver
     from selenium.webdriver.common.by import By
     from selenium.webdriver.common.action_chains import ActionChains
     import time
     Chrome_browser=webdriver.Chrome()
     url='http://www.baidu.com/'
     Chrome_browser.get(url)
     Chrome_browser.set_window_size(1600,800)
     link=Chrome_browser.find_element(by=By.ID,value='s-usersetting-top')
     ActionChains(Chrome_browser).move_to_element(link).perform()
     Chrome_browser.find_element(by=By.LINK_TEXT,value="搜索設置").click()
     time.sleep(2)
     #保存設置
     Chrome_browser.find_element(by=By.CLASS_NAME,value="prefpanelgo").click()
     time.sleep(2)
     print(Chrome_browser.switch_to.alert.text)
     Chrome_browser.switch_to.alert.accept()
     time.sleep(2)
     Chrome_browser.quit()

13.操作下拉菜單

可以通過selenium.webdriver.support.select模塊中Select類的相關方法操作下拉菜單,具體如下。

1)select_by_value()方法

該方法通過select標簽中value屬性的屬性值操作下拉菜單,其語法格式如下:

     select_by_value(value)

其中,參數value表示select標簽中value屬性的屬性值。

2)select_by_index()方法

該方法通過下拉菜單中的選項索引值操作下拉菜單,其語法格式如下:

     select_by_index(index)

其中,參數index表示下拉菜單中的選項索引值。

3)select_by_visible_text()方法

該方法通過select標簽中option標簽的文本內容操作下拉菜單,其語法格式如下:

     select_by_visible_text(text)

其中,參數text表示select標簽中option標簽的文本內容。

示例代碼如下:

     #資源包\Code\chapter1\1.5\0178.py
     from selenium import webdriver
     from selenium.webdriver.common.by import By
     from selenium.webdriver.support.select import Select
     import time
     Chrome_browser=webdriver.Chrome()
     url='http://www.oldxia.com/selenium.html'
     Chrome_browser.get(url)
     time.sleep(3)
     sel=Chrome_browser.find_element(by=By.NAME,value="city")
     Select(sel).select_by_visible_text('大連')
     time.sleep(2)
     Chrome_browser.quit()

14.上傳文件

可以通過WebElement對象的send_keys()方法操作input標簽上傳文件,其語法格式如下:

     send_keys(*value)

其中,參數value表示待上傳文件的路徑。

示例代碼如下:

     #資源包\Code\chapter1\1.5\0179.py
     from selenium import webdriver
     from selenium.webdriver.common.by import By
     import time
     Chrome_browser=webdriver.Chrome()
     url='http://www.oldxia.com/selenium.html'
     Chrome_browser.get(url)
     time.sleep(3)
     Chrome_browser.find_element(by=By.NAME,value="file").send_keys('E:\Python全棧開發\
     selenium.txt')
     time.sleep(2)
     Chrome_browser.quit()

15.管理Cookie

可以通過WebDriver對象的相關方法管理Cookie,具體如下。

1)get_Cookies()方法

該方法用于獲取所有Cookie信息,其語法格式如下:

     get_Cookies()
2)get_Cookie()方法

該方法用于獲取指定名稱的Cookie信息,其語法格式如下:

     get_Cookie(name)

其中,參數name表示Cookie的名稱。

3)add_Cookie()方法

該方法用于添加Cookie信息,其語法格式如下:

     add_Cookie(Cookie_dict)

其中,參數Cookie_dict表示字典,并且必須具有name鍵和value鍵。

4)delete_Cookie()方法

該方法用于刪除指定的Cookie信息,其語法格式如下:

     delete_Cookie(name)

其中,參數name表示待刪除的Cookie名稱。

5)delete_all_Cookies()方法

該方法用于刪除所有Cookie信息,其語法格式如下:

     delete_all_Cookies()

示例代碼如下:

     #資源包\Code\chapter1\1.5\0180.py
     from selenium import webdriver
     import time
     Chrome_browser=webdriver.Chrome()
     url='https://www.baidu.com'
     Chrome_browser.get(url)
     print('=====================================')
     print("所有的Cookie信息:")
     print(Chrome_browser.get_Cookies())
     print('=====================================')
     dict={'name':"name",'value':'夏正東'}
     Chrome_browser.add_Cookie(dict)
     print('添加的Cookie信息:')
     print(Chrome_browser.get_Cookie('name'))
     print('=====================================')
     Chrome_browser.delete_Cookie('name')
     print('刪除名稱為name的Cookie后,所有的Cookie信息:')
     num=0
     forCookie in Chrome_browser.get_Cookies():
         print(f"{Cookie['name']}——{Cookie['value']}")
         num+=1
     print(f'共有{num}條Cookie信息')
     print('=====================================')
     print('刪除所有Cookie信息:')
     Chrome_browser.delete_all_Cookies()
     num=0
     forCookie in Chrome_browser.get_Cookies():
         print(f"{Cookie['name']}——{Cookie['value']}")
         num+=1
     print(f'共有{num}條Cookie信息')
     print('=====================================')
     time.sleep(2)
     Chrome_browser.quit()

16.控制滾動條

在Selenium中,沒有提供相關的屬性或方法用于控制滾動條。在這種情況下,可以首先使用JavaScript控制滾動條,然后使用WebDriver對象提供的execute_script()方法來執行JavaScript代碼即可,其語法格式如下:

     execute_script(script)

其中,參數script表示JavaScript代碼,示例代碼如下:

17.窗口截圖

可以通過WebDriver對象提供的get_screenshot_as_file()方法進行窗口截圖,其語法格式如下:

     get_screenshot_as_file(filename)

其中,參數filename表示圖片存儲的路徑,示例代碼如下:

     #資源包\Code\chapter1\1.5\0182.py
     from selenium import webdriver
     from selenium.webdriver.common.by import By
     import time
     Chrome_browser=webdriver.Chrome()
     url='http://www.baidu.com/'
     Chrome_browser.get(url)
     Chrome_browser.set_window_size(1600,800)
     Chrome_browser.find_element(by=By.ID,value="kw").send_keys("老夏學院")
     Chrome_browser.find_element(by=By.ID,value="su").click()
     time.sleep(2)
     Chrome_browser.get_screenshot_as_file("E:\Python全棧開發\selenium.png")
     time.sleep(2)
     Chrome_browser.quit()

18.Chrome無界面瀏覽器

之前所應用的Selenium,都是直接操作有界面的瀏覽器,這就勢必會影響爬取數據的速度,而為了盡可能地提高爬取數據的速度,則可以使用Chrome無界面瀏覽器進行數據的爬取,其步驟如下:

首先,通過selenium.webdriver.chrome.options中的Options類創建Options對象,用于操作Chrome無界面瀏覽器。

其次,使用Options對象的add_argument()方法啟動參數配置,并將該方法中的參數argument的值設置為“—headless”,表示使用無界面瀏覽器。

最后,在使用Chrome類創建WebDriver對象時設置參數options,并且該參數對應的值需為之前所創建的Options對象。

示例代碼如下:

     #資源包\Code\chapter1\1.5\0183.py
     from selenium import webdriver
     from selenium.webdriver.chrome.options import Options
     Chrome_options=Options()
     Chrome_options.add_argument(argument='--headless')
     Chrome_browser=webdriver.Chrome(options=Chrome_options)
     url='http://www.oldxia.com/'
     Chrome_browser.get(url)
     Chrome_browser.get_screenshot_as_file('oldxia.png')
     Chrome_browser.quit()
主站蜘蛛池模板: 博兴县| 习水县| 桃源县| 增城市| 白沙| 上饶市| 诏安县| 盈江县| 兰西县| 剑川县| 通化县| 鄂伦春自治旗| 梅河口市| 铅山县| 湖口县| 云梦县| 年辖:市辖区| 五寨县| 长寿区| 桑植县| 平南县| 托里县| 五常市| 双柏县| 玛沁县| 临桂县| 高阳县| 大安市| 德惠市| 边坝县| 乌鲁木齐市| 朔州市| 陵川县| 莒南县| 遂宁市| 即墨市| 莒南县| 竹溪县| 赣榆县| 大埔区| 咸阳市|