- 目錄
1.簡介
Selenium是一個用于Web應用程序測試的工具蔗崎。直接運行在瀏覽器中弥鹦,就像真正的用戶在操作一樣辨液。支持的瀏覽器包括IE(7, 8, 9, 10, 11)坯临,F(xiàn)irefox煌妈,Safari配猫,Chrome匆瓜,Opera等锐锣,在爬蟲上則是模擬正常用戶訪問網(wǎng)頁并獲取數(shù)據(jù)。
2.安裝 Selenium
> pip install selenium
3.安裝驅(qū)動
模擬真正的用戶操作當然需要選擇好用來操作的瀏覽器著洼,根據(jù)瀏覽器來安裝相應的驅(qū)動調(diào)起晌柬。
3.1 Chrome
使用selenium驅(qū)動chrome瀏覽器需要下載chromedriver,而且chromedriver版本需要與chrome的版本對應郭脂,版本錯誤的話則會運行報錯。
查看chrome的版本澈歉,可通過幫助 > 關(guān)于Google Chrome(G)
展鸡。
下載chromedriver可以通過淘寶鏡像地址:http://npm.taobao.org/mirrors/chromedriver/ 。最新的鏡像與Chrome同名埃难,盡量選擇版本相近的避免兼容問題莹弊,鏡像下notes.txt可查看當前驅(qū)動支持的版本。
選擇合適的版本下載涡尘,下載完解壓將chromedriver.exe放在有設(shè)置環(huán)境變量的目錄下忍弛,小編是放在python的安裝目錄下的,即python.exe所在的目錄考抄。
3.2 Firefox
使用selenium驅(qū)動Firefox瀏覽器需要下載geckodriver细疚,查看瀏覽器版本通過幫助 > 關(guān)于 Firefox
。
下載geckodriver可通過mozilla的倉庫地址:https://github.com/mozilla/geckodriver/releases川梅。
選擇合適的版本下載疯兼,解壓后geckodriver.exe同樣也是放在python的安裝目錄下。
3.3 其它瀏覽器驅(qū)動下載
Opera:http://npm.taobao.org/mirrors/operadriver/
IE:http://selenium-release.storage.googleapis.com/index.html (版本號要與selenium的版本一致贫途,查看安裝的selenium版本吧彪,可通過pip show selenium
)如果沒有vpn可能會打不開,可點擊下載3.14.0版本的丢早。
4.Selenium使用
4.1 Chrome 配置
options = webdriver.ChromeOptions()
## 無界面
# options.add_argument('--headless')
driver = webdriver.Chrome(chrome_options=options)
driver.set_window_size(1366, 768)
driver.set_page_load_timeout(self.timeout)
注意Chrome可能需要管理員權(quán)限相關(guān)配置姨裸,小編習慣性用Firefox??
4.2 Firefox 配置
# 實例化參數(shù)對象
options = webdriver.FirefoxOptions()
# 無界面
# options.add_argument('--headless')
driver = webdriver.Firefox(firefox_options=options)
driver.set_window_size(1400, 700)
driver.set_page_load_timeout(self.timeout)
4.3 不顯示打開瀏覽器的界面
有的時候我們不想要看到爬取的一步步操作,只關(guān)心結(jié)果怨酝,則可以在參數(shù)配置
# 無界面
options.add_argument('--headless')
4.4 禁用瀏覽器彈窗
不是頁面彈窗傀缩,是瀏覽器設(shè)置里的彈窗。在打開瀏覽器時凫碌,使用參數(shù)配置關(guān)閉
Firefox
options.set_preference('dom.webnotifications.enabled', False)
options.set_preference('dom.push.enabled', False)
Chrome
prefs = {
'profile.default_content_setting_values': {
'notifications': 2
}
}
options.add_experimental_option('prefs', prefs)
4.5 driver屬性和方法
-
頁面加載
driver.get("http://www.baidu.com")
-
關(guān)閉瀏覽器
# 爬蟲結(jié)束關(guān)閉瀏覽器 driver.close()
-
獲取當前url
driver.current_url
-
刷新
driver.refresh()
-
頁面標題
driver.title
-
頁面渲染后的源碼
driver.page_source
-
獲取窗口信息
driver.get_window_rect()
獲取當前窗口的x,y坐標和當前窗口的高度和寬度扑毡,如:{'height': 1366, 'width': 768, 'x': 0, 'y': 200}
-
設(shè)置 User Agent(Firefox為例)
profile = webdriver.FirefoxProfile() profile.set_preference("general.useragent.override", "some UA string") driver = webdriver.Firefox(profile=profile)
-
執(zhí)行js腳本
使用
driver.execute_script([js腳本],*args)
同步執(zhí)行,如滑動到第一個class為cm-explain-bottom的元素位置盛险。driver.execute_script( "document.getElementsByClassName('cm-explain-bottom')[0].scrollIntoView(true)")
異步執(zhí)行使用
driver.execute_async_script([js腳本],*args)
瞄摊,*argsw為執(zhí)行js代碼要傳入的參數(shù)勋又。 -
查找元素
返回一個
WebElement
對象。- 通過id屬性:
element = driver.find_element_by_id("coolestWidgetEvah")
- 通過class屬性:
cheeses = driver.find_elements_by_class_name("cheese")
- 通過標簽名:
frame = driver.find_element_by_tag_name("iframe")
- 通過css選擇器:
cheese = driver.find_element_by_css_selector("#food span.dairy.aged")
- 通過name屬性:
cheese = driver.find_element_by_name("cheese")
- 通過xpath:
inputs = driver.find_elements_by_xpath("http://input")
- 通過鏈接文本(完全匹配):
cheese = driver.find_element_by_link_text("cheese")
- 通過鏈接文本(部分匹配):
cheese = driver.find_element_by_partial_link_text("cheese")
- 通過id屬性:
-
元素(WebElement)的屬性和方法
標簽下文本:
element.text
點擊:
element.click()
表單提交:
element.submit()
輸入:
element.send_keys(123)
示例:
# 等待郵箱和密碼可定位及登錄按鈕可提交换帜,清空輸入框楔壤,分別輸入用戶名密碼點擊提交按鈕 email = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#email"))) passwd = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#pass"))) submit = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#loginbutton'))) email.clear() passwd.clear() email.send_keys(user) passwd.send_keys(password) submit.click()
-
Cookie操作
driver.get("http://www.example.com") # 給當前url域設(shè)置cookie # name的值對應cookie key,value的值對應cookie value driver.add_cookie({'name':'key', 'value':'value', 'path':'/'}) # 可選的屬性 # 'domain' -> String, # 'secure' -> Boolean, # 'expiry' -> Milliseconds since the Epoch it should expire. # 輸出當前url所有的Cookie for cookie in driver.get_cookies(): print "%s -> %s" % (cookie['name'], cookie['value']) # 通過name刪除Cookie driver.delete_cookie("CookieName") # 刪除所有的Cookie driver.delete_all_cookies()
-
切換頁面框架或窗口
driver.switch_to.window("windowName")
切換默認框架:
driver.switch_to.default_content()
切換最新窗口:
windows = driver.window_handles # 切換到最新打開的窗口中 switch_to.window(windows[-1])
-
獲取最新的alert彈窗
alert = driver.switch_to.alert # 關(guān)閉彈窗 alert.dismiss()
-
當前的url返回或者跟進
driver.forward() driver.back()
-
截屏
# 返回頁面的base64編碼字符串 base64 = driver.get_screenshot_as_base64() # 返回保存到文件的結(jié)果 result = driver.get_screenshot_as_file("D:\\example.png") # png格式的二進制字符串 pngSrc = driver.get_screenshot_as_png()
使用Selenium爬取七麥數(shù)據(jù)APP排行榜:點擊前往