selenium是一個自動化測試工具,支持Firefox,Chrome等衆多瀏覽器javascript
在爬蟲中的應用主要是用來解決JS渲染的問題。css
1.使用前須要安裝這個第三方庫,CMD下:html
pip install seleniumjava
2.爲你的測試瀏覽器下載驅動,我用的是Chrome,對應的去百度一下Chrome webdrive下載,並解壓到python安裝目錄scripts下。python
開始使用linux
from selenium import webdrive browser = webdrive.Chrome() browser.get('http://www.baidu.com')
運行代碼就會彈出一個Chrome瀏覽器,並執行了一個get請求到達了百度。c++
若是是像微博這樣的頁面通過大量JS代碼渲染過的,僅僅使用requests來打印頁面源碼,看到的時很簡單的html和少許JS代碼,這就獲取不了咱們須要的內容web
因此,selenium解決了這個問題,經過模擬瀏覽器的訪問,實現了頁面源碼的完整打印windows
from selenium import webdrive browser = webdrive.Chrome() browser.get('https://www.zhihu.com/explore') print(browser.page_source)
browser.close() #源碼打印後,能夠選擇自動關閉或者手動關閉
這樣的話,頁面徹底加載後,源碼所有打印。瀏覽器
元素查找
單個元素查找
查找方法有如下七種:
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
以淘寶做爲示例,下面是淘寶輸入框的html代碼
<input id="q" name="q" aria-label="請輸入搜索文字" accesskey="s" autofocus="autofocus" autocomplete="off" class="search-combobox-input" aria-haspopup="true" aria-combobox="list" role="combobox" x-webkit-grammar="builtin:translate" tabindex="0">
其中id爲q
使用三種方式進行查找
from selenium import webdriver browser = webdriver.Chrome()
browser.get('http://www.taobao.com') input_first = browser.find_element_by_id('q') input_sec = browser.find_element_by_css_selector('#q') #在進行css選擇時,class以#代替 input_third = browser.find_element_by_xpath('//*[@id="q"]') print(input_first, input_sec, input_third)
輸出信息:能夠看到三者的element值所有相同
<selenium.webdriver.remote.webelement.WebElement (session="058a6d63356b317ab154f05c765c965c", element="0.10777909912780625-1")>
<selenium.webdriver.remote.webelement.WebElement (session="058a6d63356b317ab154f05c765c965c", element="0.10777909912780625-1")>
<selenium.webdriver.remote.webelement.WebElement (session="058a6d63356b317ab154f05c765c965c", element="0.10777909912780625-1")>
另外一種查找方式:
這種查找方式無非就是將查找方式做爲參數傳入,相比仍是上一種更簡潔
from selenium import webdriver from selenium.webdriver.common.by import By browser = webdriver.Chrome() browser.get('http://www.taobao.com') input_fir = browser.find_element(By.ID, 'q') input_sec = browser.find_element(By.CSS_SELECTOR, '#q') input_thi = browser.find_element(By.XPATH, '//*[@id="q"]') print(input_fir, input_sec, input_thi)
輸出:三者的element值仍是相同的
<selenium.webdriver.remote.webelement.WebElement (session="0b52c54d919026a491c53474b4e148c7", element="0.8407035458653862-1")>
<selenium.webdriver.remote.webelement.WebElement (session="0b52c54d919026a491c53474b4e148c7", element="0.8407035458653862-1")>
<selenium.webdriver.remote.webelement.WebElement (session="0b52c54d919026a491c53474b4e148c7", element="0.8407035458653862-1")>
多元素查找
find_elements_by_xxx,find_elements(By.xxxxx)
淘寶元素查找示例,服務導航條的html代碼以下
<ul class="service-bd" role="menubar">
<li data-closeper="" aria-label="查看更多" role="menuitem" aria-haspopup="true" data-groupid="101" class="J_Cat a-all">
查找service-bd下級的li標籤
from selenium import webdriver from selenium.webdriver.common.by import By browser = webdriver.Chrome() browser.get('http://www.taobao.com') a = browser.find_elements_by_css_selector('.service-bd li') # b = browser.find_elements(By.CSS_SELECTOR, '.service-bd li') #第二種的參數傳入查找方式
print(a)
結果:li標籤的值仍然是相同的,多元素查找時,返回的時list集合
[<selenium.webdriver.remote.webelement.WebElement (session="387a43bf87c016a86c80f072f4a62aca", element="0.4632603097227008-1")>,
<selenium.webdriver.remote.webelement.WebElement (session="387a43bf87c016a86c80f072f4a62aca", element="0.4632603097227008-2")>,
<selenium.webdriver.remote.webelement.WebElement (session="387a43bf87c016a86c80f072f4a62aca", element="0.4632603097227008-3")>,
.......]
元素交互操做
由網頁get--->>>元素查找---->>>鍵值插入及刪除--->>>點擊事件
如下代碼實現的過程是:到達淘寶--->>>查找輸入框id爲q的元素--->>>鍵入值---等待---從新鍵入值-----提交按鈕元素查找---點擊
from selenium import webdriver import time browser = webdriver.Chrome() browser.get('http://www.taobao.com') input = browser.find_element_by_id('q') input.send_keys('iPhone') time.sleep(2) input.clear() input.send_keys('gigabyte') button = browser.find_element_by_class_name('btn-search') button.click() print(browser.current_url) # 打印當前頁面的url
執行JS語句
from selenium import webdriver #執行js語句:實現一個網頁下拉動做
browser = webdriver.Chrome() browser.get('http://www.zhihu.com/explore') browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') browser.execute_script('alert("succ")')
前進與後退操做
>>> from selenium import webdriver >>> driver = webdriver.Chrome() >>> driver.get('http://www.baidu.com') >>> driver.get('http://www.sina.com') >>> driver.back() >>> driver.forward()
標籤頁的增長
from selenium import webdriver driver = webdriver.Chrome() driver.get('http://www.zhihu.com/explore') driver.execute_script('window.open()') print(driver.window_handles) driver.switch_to.window(driver.window_handles[0]) driver.get('http://www.taobao.com') driver.switch_to.window(driver.window_handles[1]) driver.get('http://m.weibo.com') driver.close()
今天博客園抽風了,截圖上傳不了...
我用selenium作了模擬登錄百度,不過驗證碼須要本身手打
驗證碼問題的解決須要依賴PIL庫,我還沒學習過。。
from selenium import webdriver import time #聲明瀏覽器對象
browser = webdriver.Chrome() browser.get('https://passport.baidu.com/v2/?login&fr=old&login&tpl=mn') username = browser.find_element_by_id('TANGRAM__PSP_3__userName') username.send_keys('account') password = browser.find_element_by_id('TANGRAM__PSP_3__password') password.send_keys('passwd') time.sleep(5) button = browser.find_element_by_id('TANGRAM__PSP_3__submit') button.click() # sendcode = browser.find_element_by_class_name('forceverify-button forceverify-button-send') # sendcode.click() # # time.sleep(10) # # finalogin = browser.find_element_by_id('TANGRAM__28__button_submit') # finalogin.click()
若是不須要顯示的調用瀏覽器,可使用第三方瀏覽器:PhantomJS
phantomjs介紹
(1)一個基於webkit內核的無頭瀏覽器,即沒有UI界面,即它就是一個瀏覽器,只是其內的點擊、翻頁等人爲相關操做須要程序設計實現。
(2)提供javascript API接口,即經過編寫js程序能夠直接與webkit內核交互,在此之上能夠結合java語言等,經過java調用js等相關操做,從而解決了之前c/c++才能比較好的基於webkit開發優質採集器的限制。
(3)提供windows、linux、mac等不一樣os的安裝使用包,也就是說能夠在不一樣平臺上二次開發採集項目或是自動項目測試等工做。
Windows下安裝使用:
pip install PhantomJS
用法
from selenium import webdriver browser = webdriver.PhantomJS()
只有聲明瀏覽器對象時不一樣,其餘用法所有相同
異常的捕獲:
http://selenium-python.readthedocs.io/index.html