1. 程式人生 > >自學python爬蟲(七)selenium庫的使用

自學python爬蟲(七)selenium庫的使用

一、基本概念

selenium,是一種自動化測施工具,支援多種瀏覽器。爬蟲中主要用來解決JavaScript渲染問題。

二、具體用法

說在前面:筆者是以GooleChrome瀏覽器來進行測試的,當然其他瀏覽器也可以,具體下面會講到不同的瀏覽器不同做法。
1、下載安裝:chromedriver,否則不能執行。
具體下載連結和安裝方法請參照:selenium之使用chrome瀏覽器測試(附chromedriver與chrome的對應關係表)

2、具體使用
基本使用,先來個比較全面的例子~

# 較為全面的一個簡單例項
from selenium import webdriver
from
selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait browser = webdriver.Chrome() try: browser.get('https://www.baidu.com') input = browser.find_element_by_id('kw'
) input.send_keys('Python') input.send_keys(Keys.ENTER) wait = WebDriverWait(browser,10) wait.until(EC.presence_of_element_located((By.ID,'content_left'))) print(browser.current_url) print(browser.get_cookies()) print(browser.page_source) finally: browser.close()

是不是覺得功能好強大呀,下面具體來了解啦!
其實很多知識需要查詢官方文件最好啦,但是很多都是英文版的,閱讀不方便,這裡給出中文版作為參考,下面講到的只是一部分,還是可以多看看文件:

http://selenium-python-docs-zh.readthedocs.io/zh_CN/latest/
2.1宣告瀏覽器物件

#  宣告瀏覽器物件
from selenium import webdriver

browser = webdriver.Chrome()
browser = webdriver.Firefox()
……

每種瀏覽器不同的,這裡我只用了Chrome,其他瀏覽器可以自行百度。
2.2訪問頁面

# 訪問頁面
from selenium import webdriver

browser = webdriver.Chrome() # 宣告瀏覽器物件 
browser.get('https://www.taobao.com')# 獲得頁面
print(browser.page_source)# 打印出頁面內容
browser.close()# 關閉瀏覽器物件

2.3查詢元素
2.3.1查詢單個元素

# 單個元素
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element_by_id('q')# id
input_second = browser.find_element_by_css_selector('#q')# css選擇器
input_third = browser.find_element_by_xpath('//*[@id="q"]')# xpath
print(input_first,input_second,input_third)
browser.close()

這裡寫圖片描述
這裡只是舉出了幾個例子,還有下面這些:
這裡寫圖片描述
還有一種比較通用的方法來獲單個元素:

from selenium import webdriver
from selenium.webdriver.common.by import By # 匯入By

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input_first = browser.find_element(By.ID,'q')# 通過這種來獲取元素
print(input_first)
browser.close()
2.3.2多個元素
#  多個元素
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
lis = browser.find_elements_by_css_selector(' .service-bd li')
print(lis)
browser.close()

這裡寫圖片描述

#  多個元素
from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
lis = browser.find_elements(By.CSS_SELECTOR,' .service-bd li')
print(lis)
browser.close()

當然,類似單個元素,獲取多個元素也有多種方法:
這裡寫圖片描述
2.4元素互動操作
對獲取的元素呼叫互動方法

#  對獲取的元素呼叫互動方法
from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input = browser.find_element_by_id('q')# 輸入框
input.send_keys('iphone')#輸入框輸入iPhone
time.sleep(1)
input.clear()# 清掉輸入框
input.send_keys('ipad')# 輸入iPad
button = browser.find_element_by_class_name('btn-search')# 找到搜尋按鈕
button.click()# 點選搜尋

這裡寫圖片描述
2.5互動動作
將動作附加到動作鏈中序列執行

from selenium import webdriver
from selenium.webdriver import ActionChains

browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')# 切換frame
source = browser.find_element_by_css_selector('#draggable') #原來的位置
target = browser.find_element_by_css_selector('#droppable')# 目標位置
actions = ActionChains(browser)# 宣告一個ActionChains
actions.drag_and_drop(source,target)# 呼叫方法,拖動目標
actions.perform()# 執行

這裡寫圖片描述這裡寫圖片描述
2.6執行Javascript

# 執行JavaScript
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')# 使用JavaScript方法到頁面底部
browser.execute_script('alert("To bottom")')

2.7獲取元素資訊
2.7.1獲取屬性

# 獲取屬性
from selenium import webdriver
from selenium.webdriver import ActionChains

browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
logo = browser.find_element_by_id('zh-top-link-logo')
print(type(logo))
print(logo)
print(logo.get_attribute('class'))

這裡寫圖片描述
2.7.2獲取文字值

# 獲取文字值
from selenium import webdriver

browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.text)

這裡寫圖片描述
2.7.3獲取ID、位置、標籤名、大小

#  獲取ID、位置、標籤名、大小
from selenium import webdriver

browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)

2.8 Frame

# Frame
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

browser = webdriver.Chrome()
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')
print(source)
# 在內部肯定找不到這個元素的,這裡只是為了測試
try:
    logo = browser.find_element_by_class_name('logo')
except NoSuchElementException:
    print('NO LOGO')
browser.switch_to.parent_frame()
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)

2.9 等待
2.9.1隱式等待
當使用了隱式等待進行測試的時候,如果webdriver沒有在DOM找到元素,則繼續等待,超出指定時間後,則丟擲找不到元素的異常。換句話說,在查詢元素沒有立即出現時,隱式等待將繼續等待一段時間繼續查詢DOM。預設時間為0。

# 隱式等待
from selenium import webdriver

browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
print(input)

2.9.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 EC

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
wait = WebDriverWait(browser,10)
input = wait.until(EC.presence_of_element_located((By.ID,'q')))# 找到q這個id時停止等待
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search')))# 找到btn-search時停止等待
print(input,button)

顯式等待還有許多條件判斷方法:
這裡寫圖片描述
2.10 前進後退
back() forward()

# 前進後退
import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.get('https://www.taobao.com')
browser.get('https://www.jingdong.com')
browser.back()
time.sleep(1)
browser.forward()
browser.close()

2.11 cookies

# Cookies
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'gemery'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())

2.12 選項卡管理
利用window_handles進行選項卡切換
這裡寫圖片描述

# 選項卡管理
import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get('http://www.csu.edu.cn')

2.13 異常處理

# 異常處理
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.find_element_by_id('hello')
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException

browser = webdriver.Chrome()
try:
    browser.get('https://www.baidu.com')
except TimeoutException:
    print('Time out')
try:
    browser.find_element_by_id('hello')
except NoSuchElementException:
    print('No element')
finally:
    browser.close()

總結;到這裡爬蟲的基本庫就基本結束了,很多東西還是要在實戰中才能真正學會使用,所以接下來會是幾個實戰專案練習,一起期待吧~