Python學(xué)習(xí)之路-爬蟲提高:selenium
什么是selenium
Selenium是一個Web的自動化測試工具,最初是為網(wǎng)站自動化測試而開發(fā)的,Selenium 可以直接運行在瀏覽器上,它支持所有主流的瀏覽器(包括PhantomJS這些無界面的瀏覽器),可以接收指令,讓瀏覽器自動加載頁面,獲取需要的數(shù)據(jù),甚至頁面截屏
PhantomJS的介紹
PhantomJS 是一個基于Webkit的“無界面”(headless)瀏覽器,它會把網(wǎng)站加載到內(nèi)存并執(zhí)行頁面上的 JavaScript
- 下載地址:http://phantomjs.org/download.html
Chromedriver的介紹
Chromedriver 也是一個能夠被selenium驅(qū)動的瀏覽器,但是和PhantomJS的區(qū)別在于它是有界面的
- 下載地址:https://npm.taobao.org/mirrors/chromedriver
driver的安裝
最簡單的安裝方式是:解壓后把bin目錄下的可執(zhí)行文件移動到環(huán)境變量下,比如/usr/bin
或者是/usr/local/bin
下面
注意:Chromedriver和電腦上的chrome版本有對應(yīng)關(guān)系,建議使用最新的Chromedriver版本并且更新chrome瀏覽器到最新版
selenium的入門使用
-
知識點:
- 掌握如何發(fā)送請求,加載網(wǎng)頁
- 掌握如何進(jìn)行簡單的元素定位
- 掌握如何從獲取瀏覽器中的數(shù)據(jù)
-
加載網(wǎng)頁: selenium通過控制瀏覽器,所以對應(yīng)的獲取的數(shù)據(jù)都是elements中的內(nèi)容
from selenium import webdriver driver = webdriver.PhantomJS(“c:…/pantomjs.exe”) driver.get("http://www.baidu.com/") driver.save_screenshot("長城.png")
-
定位和操作:
driver.find_element_by_id(“kw”).send_keys(“長城”) driver.find_element_by_id("su").click()
-
查看請求信息:
driver.page_source driver.get_cookies() driver.current_url
-
退出
driver.close() #退出當(dāng)前頁面 driver.quit() #退出瀏覽器
selenium的定位操作
-
知識點:
- 掌握定位元素的方法
- 掌握獲取元素中數(shù)據(jù)的方法
-
定位元素語法:
find_element_by_id (返回一個元素) find_elements_by_xpath (返回一個包含元素的列表) find_elements_by_link_text (根據(jù)連接文本獲取元素列表) find_elements_by_partial_link_text (根據(jù)連接包含的文本獲取元素列表) find_elements_by_tag_name (根據(jù)標(biāo)簽名獲取元素列表) find_elements_by_class_name (根據(jù)類名獲取元素列表)
注意:
find_element
和find_elements
的區(qū)別by_link_text
和by_partial_link_tex
的區(qū)別:全部文本和包含某個文本 -
使用:
以豆瓣首頁為例:https://www.douban.com/
from selenium import webdriver driver =webdriver.Chrome() driver.get("https://www.douban.com/") ret1 = driver.find_element_by_id("anony-nav") print(ret1) # 輸出為:<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")> ret2 = driver.find_elements_by_id("anony-nav") print(ret2) #輸出為:[<selenium.webdriver.remote.webelement.WebElement (session="ea6f94544ac3a56585b2638d352e97f3", element="0.5335773935305805-1")>] ret3 = driver.find_elements_by_xpath("http://*[@id='anony-nav']/h1/a") print(len(ret3)) #輸出為:1 ret4 = driver.find_elements_by_tag_name("h1") print(len(ret4)) #輸出為:1 ret5 = driver.find_elements_by_link_text("下載豆瓣 App") print(len(ret5)) #輸出為:1 ret6 = driver.find_elements_by_partial_link_text("豆瓣") print(len(ret6)) #輸出為:28 driver.close()
-
獲取數(shù)據(jù)語法
- find_element僅僅能夠獲取元素,不能顧直接獲取其中的數(shù)據(jù),
find_element_by_xapth
也是這樣 - 獲取文本:
element.text
- 獲取屬性值:
element.get_attribute("href")
- find_element僅僅能夠獲取元素,不能顧直接獲取其中的數(shù)據(jù),
-
使用示例:
from selenium import webdriver driver =webdriver.Chrome() driver.get("https://www.douban.com/") ret4 = driver.find_elements_by_tag_name("h1") print(ret4[0].text) #輸出:豆瓣 ret5 = driver.find_elements_by_link_text("下載豆瓣 App") print(ret5[0].get_attribute("href")) #輸出:https://www.douban.com/doubanapp/app?channel=nimingye driver.close()
selenium 處理cookie
通過driver.get_cookies()
能夠獲取所有的cookie
# 把cookie轉(zhuǎn)化為字典
{cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}
#刪除一條cookie
driver.delete_cookie("CookieName")
# 刪除所有的cookie
driver.delete_all_cookies()
頁面等待
-
為什么需要等待
如果網(wǎng)站采用了動態(tài)html技術(shù),那么頁面上的部分元素出現(xiàn)時間便不能確定,這個時候就可以設(shè)置一個等待時間,強(qiáng)制要求在時間內(nèi)出現(xiàn),否則報錯
-
頁面等待的方法
time.sleep(10)
使用selenium切換frame
frame是html中常用的一種技術(shù),即一個頁面中嵌套了另一個網(wǎng)頁,selenium默認(rèn)是訪問不了frame中的內(nèi)容的,對應(yīng)的解決思路是 driver.switch_to.frame()
動手:模擬登陸qq郵箱文章來源:http://www.zghlxwxcb.cn/news/detail-829884.html
在使用selenium登錄qq郵箱的過程中,我們會發(fā)現(xiàn),無法在郵箱的登錄input標(biāo)簽中輸入內(nèi)容,通過觀察源碼可以發(fā)現(xiàn),form表單在一個frame中,所以需要切換到frame中文章來源地址http://www.zghlxwxcb.cn/news/detail-829884.html
selenium的優(yōu)缺點
- selenium能夠執(zhí)行頁面上的js,對于js渲染的數(shù)據(jù)和模擬登陸處理起來非常容易
- selenium由于在獲取頁面的過程中會發(fā)送很多請求,所以效率非常低,所以在很多時候需要酌情使用
到了這里,關(guān)于Python學(xué)習(xí)之路-爬蟲提高:selenium的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!