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秒,後續所有元素定位操作均可用