selenium最初是一個自動化測試工具,而爬蟲中使用它主要是爲了解決requests沒法直接執行JavaScript代碼的問題 selenium本質是經過驅動瀏覽器,徹底模擬瀏覽器的操做,好比跳轉、輸入、點擊、下拉等,來拿到網頁渲染以後的結果,可支持多種瀏覽器php
做用: 可讓瀏覽器完成相關自動化的操做css
和爬蟲的關聯:html
編碼流程:python
01:jquery
from selenium import webdriver from time import sleep bro = webdriver.Chrome(executable_path='./chromedriver.exe') bro.get('https://www.baidu.com') #獲取的鏈接頁面 sleep(2) #標籤訂位 tag_input = bro.find_element_by_id('kw') tag_input.send_keys('人民幣') #標籤中輸入值 sleep(2) btn = bro.find_element_by_id('su') btn.click() #標籤點擊事件 sleep(2) bro.quit() #退出
02.web
from selenium import webdriver from time import sleep bro = webdriver.Chrome(executable_path='./chromedriver.exe') bro.get('https://xueqiu.com/') sleep(5) #執行js實現滾輪向下滑動 js = 'window.scrollTo(0,document.body.scrollHeight)' #兩個參數一個是X軸,一個是y軸,此時用的是Y軸 bro.execute_script(js) sleep(2) bro.execute_script(js) sleep(2) bro.execute_script(js) sleep(2) bro.execute_script(js) sleep(2) a_tag = bro.find_element_by_xpath('//*[@id="app"]/div[3]/div/div[1]/div[2]/div[2]/a') a_tag.click() sleep(5) #獲取當前瀏覽器頁面數據(動態) print(bro.page_source) bro.quit()
#PhantomJs是一款無可視化界面的瀏覽器(免安裝) from selenium import webdriver from time import sleep bro = webdriver.PhantomJS(executable_path=r'C:\Users\Administrator\Desktop\爬蟲+數據\爬蟲day03\phantomjs-2.1.1-windows\bin\phantomjs.exe') bro.get('https://xueqiu.com/') sleep(2) bro.save_screenshot('./1.png') #執行js實現滾輪向下滑動 js = 'window.scrollTo(0,document.body.scrollHeight)' bro.execute_script(js) sleep(2) bro.execute_script(js) sleep(2) bro.execute_script(js) sleep(2) bro.execute_script(js) sleep(2) bro.save_screenshot('./2.png') # a_tag = bro.find_element_by_xpath('//*[@id="app"]/div[3]/div/div[1]/div[2]/div[2]/a') # bro.save_screenshot('./2.png') # a_tag.click() sleep(2) #獲取當前瀏覽器頁面數據(動態) print(bro.page_source) bro.quit() 如今用的不多,知道便可
from selenium import webdriver from time import sleep from selenium.webdriver.chrome.options import Options # 建立一個參數對象,用來控制chrome以無界面模式打開 chrome_options = Options() chrome_options.add_argument('--headless') chrome_options.add_argument('--disable-gpu') bro = webdriver.Chrome(executable_path='./chromedriver.exe',options=chrome_options) bro.get('https://www.baidu.com') sleep(2) bro.save_screenshot('1.png') #標籤訂位 tag_input = bro.find_element_by_id('kw') tag_input.send_keys('人民幣') sleep(2) btn = bro.find_element_by_id('su') btn.click() sleep(2) print(bro.page_source) bro.quit() 谷歌無頭瀏覽器
#前進和後退 from selenium import webdriver from time import sleep bro = webdriver.Chrome(executable_path='./chromedriver.exe') bro.get('https://www.baidu.com') sleep(1) bro.get('http://www.goubanjia.com/') sleep(1) bro.get('https://www.taobao.com') sleep(1) bro.back() sleep(1) bro.forward() sleep(1) print(bro.page_source) bro.quit()
在上面的實例中,一些交互動做都是針對某個節點執行的。好比,對於輸入框,咱們就調用它的輸入文字和清空文字方法;對於按鈕,就調用它的點擊方法。其實,還有另一些操做,它們沒有特定的執行對象,好比鼠標拖曳、鍵盤按鍵等,這些動做用另外一種方式來執行,那就是動做鏈。chrome
好比,如今實現一個節點的拖曳操做,將某個節點從一處拖曳到另一處,能夠這樣實現:windows
#動做鏈 from selenium import webdriver from time import sleep from selenium.webdriver import ChromeOptions from selenium.webdriver import ActionChains option = ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation']) bro = webdriver.Chrome(executable_path='./chromedriver.exe',options=option) url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' bro.get(url=url) #若是定位的標籤存在於iframe標籤之中,則必須通過switch_to操做在進行標籤訂位 bro.switch_to.frame('iframeResult') source_tag = bro.find_element_by_id('draggable') taget_tag = bro.find_element_by_id('droppable') #建立一個動做連的對象 action = ActionChains(bro) action.drag_and_drop(source_tag,taget_tag) action.perform() sleep(3) # bro.quit()
Selenium支持很是多的瀏覽器,如Chrome、Firefox、Edge等,還有Android、BlackBerry等手機端的瀏覽器。另外,也支持無界面瀏覽器PhantomJS。api
from selenium import webdriver browser = webdriver.Chrome() browser = webdriver.Firefox() browser = webdriver.Edge() browser = webdriver.PhantomJS() browser = webdriver.Safari()
webdriver 提供了一系列的元素定位方法,經常使用的有如下幾種:瀏覽器
find_element_by_id() find_element_by_name() find_element_by_class_name() find_element_by_tag_name() find_element_by_link_text() find_element_by_partial_link_text() find_element_by_xpath() find_element_by_css_selector()
注意
一、find_element_by_xxx找的是第一個符合條件的標籤,find_elements_by_xxx找的是全部符合條件的標籤。
二、根據ID、CSS選擇器和XPath獲取,它們返回的結果徹底一致。
三、另外,Selenium還提供了通用方法find_element()
,它須要傳入兩個參數:查找方式By
和值。實際上,它就是find_element_by_id()
這種方法的通用函數版本,好比find_element_by_id(id)
就等價於find_element(By.ID, id)
,兩者獲得的結果徹底一致。
Selenium能夠驅動瀏覽器來執行一些操做,也就是說可讓瀏覽器模擬執行一些動做。比較常見的用法有:輸入文字時用send_keys()
方法,清空文字時用clear()
方法,點擊按鈕時用click()
方法。示例以下:
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('MAC') time.sleep(1) input.clear() input.send_keys('IPhone') button = browser.find_element_by_class_name('btn-search') button.click() browser.quit()
如今很多大網站有對selenium採起了監測機制。好比正常狀況下咱們用瀏覽器訪問淘寶等網站的 window.navigator.webdriver的值爲
undefined。而使用selenium訪問則該值爲true。那麼如何解決這個問題呢?
只須要設置Chromedriver的啓動參數便可解決問題。在啓動Chromedriver以前,爲Chrome開啓實驗性功能參數excludeSwitches
,它的值爲['enable-automation']
,完整代碼以下:
from selenium.webdriver import Chrome from selenium.webdriver import ChromeOptions option = ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation']) driver = Chrome(options=option)