1.聲明瀏覽器對象
from selenium import webdriver browser = webdriver.Chrome() # browser = webdriver.Firefox() # browser = webdriver.Edge()
2.訪問頁面
from selenium import webdriver browser = webdriver.Chrome() url = 'http://www.baidu.com' browser.get(url) print(browser.page_source) browser.close() #使用完要關閉瀏覽器
3.節點查找
3.1 單個節點
從淘寶首頁提取搜索框
from selenium import webdriver from selenium.webdriver.common.by import By browser = webdriver.Chrome() url = 'http://www.taobao.com' browser.get(url) input_first = browser.find_element_by_id('q') #根據id獲取 input_second = browser.find_elements_by_css_selector('#q') #根據css選擇器獲取 input_third = browser.find_element_by_xpath('//*[@id="q"]') #根據xpath獲取 input_forth = browser.find_element(By.ID,'q') #find_element() print(input_first,input_second,input_third,input_forth) browser.close()
運行結果為WebElement類型,<selenium.webdriver.remote.webelement.WebElement (session="47f594f34cc9868f68ab3653e1d542a6">
find_element()方法只查詢到第一個節點
3.2 多個節點
查詢左側導航欄
from selenium import webdriver from selenium.webdriver.common.by import By url = 'http://www.taobao.com' browser = webdriver.Chrome() browser.get(url) lis1 = browser.find_elements_by_css_selector('.service-bd li') #class屬性為service-bd的ul下的所有li標簽,返回結果為列表 lis2 = browser.find_elements(By.CSS_SELECTOR,'.service-bd li') print(len(lis1),lis1) print(len(lis2),lis2) browser.close()
3.3 節點交互
Selenium可以驅動瀏覽器來執行一些操作,常用方法有:
- send_keys():輸入文字
- clear():清空文字
- click():點擊按鈕
在輸入框中輸入要查找的內容進行搜索
from selenium import webdriver import time url = 'http://www.taobao.com' browser = webdriver.Chrome() browser.get(url) input = browser.find_element_by_id('q') input.send_keys('電腦') time.sleep(3) input.clear() input.send_keys('筆記本電腦') button = browser.find_elements_by_css_selector('.btn-search tb-bg') button.click() browser.close()
3.4 執行JavaScript
對於某些操作selenium API沒有提供,如下拉進度條,可以直接模擬運行javascript,使用execute_script()方法。
from selenium import webdriver import time url = 'http://www.taobao.com' browser = webdriver.Chrome() browser.get(url) browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') time.sleep(5) browser.execute_script('alert("To Buttom")')
4.獲取節點信息
page_source屬性可以獲取網頁源代碼,然后可以使用解析庫獲取信息。
selenium選擇節點,返回的WebElement類型,也有對應的屬性和方法來獲取節點信息。
4.1 獲取屬性
get_attribute()方法獲取屬性。
input = browser.find_element_by_id('q') print(input.get_attribute('name'))
4.2 獲取文本值
text屬性可獲取文本值。
lis = browser.find_elements_by_css_selector('.service-bd li') for li in lis: print(li.text)
4.3 獲取id、位置、標簽名和大小
id屬性獲取節點id;location屬性獲取該節點在頁面中的相對位置;tag_name屬性獲取標簽名;size屬性獲取節點寬高。
5.切換Frame
iframe即子Frame,相當於頁面的子頁面,結構和外部網頁的結構完全一致,selenium打開頁面后,默認在父級的Frame里,不能獲取到在子Frame里的節點,需要使用switch_to.frame()方法來切換Frame。
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException browser = webdriver.Chrome() url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' browser.get(url) browser.switch_to.frame('iframeResult') #切換到子Frame try: logo1 = browser.find_element_by_class_name('logo') except NoSuchElementException: print('no logo') browser.switch_to.parent_frame() #切換到父級Frame logo = browser.find_element_by_class_name('logo') print(logo) print(logo.text) browser.close()
6.延時等待
selenium中get()方法會在網頁框架加載結束后結束執行,此時如果獲取page_source,可能不是瀏覽器完全加載的頁面,所以需要延時等待一段時間,確保節點全部加載。
6.1 隱式等待
使用隱式等待,如果selenium在DOM中沒有找到節點,會繼續等待,超出設定時間后,會拋出找不到節點的異常,規定了一個固定時間,默認時間為0。用implicitly_wait()實現隱式等待。
from selenium import webdriver browser = webdriver.Chrome() browser.implicitly_wait(10) browser.get('http://www.baidu.com') input = browser.find_element_by_id('kw') print(input) browser.close()
6.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() url = 'http://www.taobao.com' browser.get(url) wait = WebDriverWait(browser,10) #引入WebDriverWait對象,指定最長等待時間 input = wait.until(EC.presence_of_element_located((By.ID,'q'))) #調用until()方法,傳入等待條件expected_conditions button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search'))) print(input,button) browser.close()
7.前進和后退
back()后退;forward()前進。
from selenium import webdriver import time browser = webdriver.Chrome() browser.get('http://www.baidu.com') browser.get('http://taobao.com') browser.get('https://www.cnblogs.com/') browser.back() time.sleep(3) browser.forward() time.sleep(3) browser.back() time.sleep(3) browser.close()
8.選項卡操作
from selenium import webdriver import time browser = webdriver.Chrome() browser.get('http://www.baidu.com') browser.execute_script('window.open()') #新開啟一個選項卡,即第二個 print(browser.window_handles) #獲取當前開啟的所有選項卡,以列表的形式返回,此處兩個 browser.switch_to.window(browser.window_handles[1]) #切換到第二個選項卡 browser.get('http://taobao.com') #在第二個選項卡打開淘寶頁面 time.sleep(3) browser.switch_to.window(browser.window_handles[0]) #切換到第一個選項卡 browser.get('https://www.cnblogs.com/') #在第一個選項卡打開博客頁面
更多資料見參考文檔:https://selenium-python.readthedocs.io/api.html
9.案例--使用selenium抓取淘寶商品
目標:
利用selenium抓取淘寶商品並用pyquery解析得到商品的圖片、名稱、價格、購買人數、店鋪名稱和店鋪所在地信息,並保存到MongoDB中。
