天天看點

【python 工具】selenium 浏覽器操作

作者:甘道實研

selenium的安裝步驟:

1. 安裝selenium,打開cmd控制台

pip install selenium

2. 安裝驅動程式(我這裡安裝的是chromedriver),用來啟動chrome浏覽器,具體的驅動程式需要對應浏覽器的版本

下載下傳位址:

http://chromedriver.storage.googleapis.com/index.html

基本步驟:

1.導入子產品

from selenium import webdriver  # 用來啟動chromedriver
from selenium.webdriver.common.keys import Keys  # 提供鍵盤支援           

2.建立一個web執行個體

chrome = webdriver.Chrome('chromedriver驅動程式的路徑')           

3.打開頁面

chrome.get(url)  # chromedriver會打開一個chrome浏覽器視窗,顯示為浏覽的頁面           

4.關閉頁面

chrome.close()
#or
chrome.quit()           

以上就是selenium的基本操作了,在打開頁面和關閉頁面中間就是各種操作。

1.進階- 元素定位

元素的定位,和爬蟲中HTML頁面解析,定位到某個元素基本上差不多,隻是調用者是driver

element = chrome.find_element_by_id('id')  # 通過id擷取元素
element = chrome.find_element_by_class('class')  # 通過class擷取元素           

2.進階 - 元素操作

找到需要的元素後,就是進行操作(即互動)

element.send_keys('Hello World!')  # 向可輸入對象中輸入内容           

還可以點選送出表單按鈕

element.click() # 點選送出表單           

3.進階 - 視窗切換

當selenium控制浏覽器打開多個标簽頁時,要控制浏覽器在不同的标簽頁進行切換,需要做以下兩步:

1. 擷取所有标簽頁的視窗句柄

2. 通過視窗句柄切換到自定标簽頁
# 1.擷取目前所有标簽頁的句柄構成的清單
current_windows = drver,window_handles

# 2.根據标簽頁句柄清單索引下标進行切換
driver.seitch_to.window(current_windows[0])           
from selenium import webdriver

chrome = webdriver.Chrome()
chrome.get('https://bengbu.58.com/')
chrome.find_element_by_xpath('//*[@id="fcNav"]/em/a[1]').click()
# 擷取目前所有标簽頁的句柄
current_windows = chrome.window_handles
# 根據标簽頁句柄清單進行切換
chrome.switch_to.window(current_windows[1])
text = chrome.find_element_by_xpath('/html/body/div[7]/div[2]/ul/li/div[2]/h2/a')
print(text)           

4.進階 - 滾動條的使用

在通路頁面時,有些網頁中的内容并不是一次性全都加載出來的,而是需要拖動滾動條,才能慢慢加載出來,比如京東這樣的網站。

這時我們就可以用selenium去執行js代碼,實作拉取滾動條完成加載頁面。

滾動條回到頂部
js="var q=document.getElementById('id‘).scrollTop=0"
driver.execute_script(js)
滾動條拉到底部
js="var q=document.getElementById('id’).scrollTop=10000"
---------以上方法用于firefox和ie----------


chrome:
 js="var q=document.body.scrollTop=0"
橫向滾動條:
js="windows.scrollTo(100,400)"           

參考代碼示例:

from selenium import webdriver
from lxml import etree
from time import sleep

url='https://search.jd.com/Search?keyword=mac%E7%94%B5%E8%84%91&enc=utf-8&spm=2.1.1'
chrome = webdriver.Chrome()
# 發送請求
chrome.get(url)
# 将滾動條下拉到最底部
js = "document.documentElement.scrollTop=10000"
chrome.execute_script(js)
# 加載頁面
sleep(3)
# 擷取網頁源代碼
html = chrome.page_source
# 将html代碼解析成html對象
e = etree.HTML(html)
# 擷取商品名稱,價格
names = e.xpath('//div[@class="p-name p-name-type-2"]/a/em')
prices = e.xpath('//div[@class="p-price"]/strong/i/text()')
print('共{}條結果'.format(len(names)))
for n, price in zip(names, prices):
    name = n.xpath('string(.)').replace('\n', '')
    print("商品名稱:{},價格:{}".format(name, price))           

5.進階 - 無頭浏覽器

當我們在使用selenium時,每通路一次頁面就彈出一個浏覽器視窗。然而在做爬蟲時,通常是不需要打開浏覽器的,我們隻需要使用浏覽器的核心,是以我們可以使用chrome的無頭模式。

隻需要在建立執行個體時加入以下幾行代碼,就可以讓浏覽器進入無頭模式

options = webdriver.ChromeOptions()
options.add_argument('--headless')
chrome = webdriver.Chrome(options=options)           

6.進階-頁面等待

分類:

1. 強制等待

不管頁面有沒有加載完成,都等待指定時間

缺點:設定時間太短,頁面沒有加載完成,設定時間太長,則浪費時間

time.sleep(10)

2. 隐式等待

隐式等待主要針對的是元素定位,隐式等待設定了一個時間,在這段時間内判斷元素是否定位成功,若定位成功,進行下一步;若沒成功,則會報逾時加載

隐式等待隻需定義一次,後續所有元素定位操作都會遵守

chrome.implicitly_wait(10)  # 設定隐式等待時間為10秒,後續所有元素定位操作均可用