【小白學爬蟲連載(6)】--Selenium庫詳解

歡迎大家關注公眾號【哈希大數(shù)據(jù)】
Selenium庫是Python的自動化測試工具绽昼,它支持多種瀏覽器包括Chrome、Mozilla Firefox河狐、PhantomJS等征椒。在爬蟲中主要解決因為利用JavaScript渲染操作不能利用Requests庫獲取網(wǎng)頁內容的問題。利用JavaScript渲染的網(wǎng)站有很多典型的如淘寶末荐、今日頭條侧纯、一點資訊、快遞100等甲脏。
Selenium安裝與測試
對于Windows平臺:首先介紹一種簡單的安裝包的方法眶熬,打開cmd,執(zhí)行pip install selenium。如果第一種方法出現(xiàn)如timeout等問題块请,我們還可以采用手動方法安裝娜氏,步驟如下:
1、登陸該網(wǎng)站(https://www.lfd.uci.edu/~gohlke/pythonlibs/)下載你所需要的第三包的whl文件(用Ctrl+F命令搜索你想安裝的第三方包)墩新,建議存儲在Python安裝目錄中的\Lib\site-packages目錄下贸弥。
2、下載完成后打開命令行海渊,輸入pip install 文件絕對路徑 绵疲,然后點擊回車就OK啦。
完成Selenium庫的安裝后臣疑,我們需要下載一些瀏覽器驅動器盔憨,這里建議大家使用Chrome瀏覽器,為此我們需要在電腦上下載一個chromedriver讯沈,下載chromedriver時需要注意的問題是與電腦上的chrome瀏覽器版本要對應郁岩。大家可以按下面這個連接中給定的映射關系進行下載:http://blog.csdn.net/huilan_same/article/details/51896672,感謝huilan_same的分享缺狠。chromedriver的下載地址:http://npm.taobao.org/mirrors/chromedriver/
下載的chromedriver需要配置進path環(huán)境變量问慎,也可以用我下面的語句加入executable_path參數(shù),后面為 chromedriver的絕對路徑儒老,chromedriver_win32為存放chromedriver.exe的文件夾蝴乔。下面對Selenium進行簡單的測試:

browser = webdriver.Chrome(executable_path=r'E:\EXE\chromedriver_win32\chromedriver')# executable_path后面跟的是chromedriver的絕對路徑
browser.get("http://www.baidu.com")
print(browser.page_source)
browser.close() 

查找元素

1.查找單個元素

selenium查找元素的方法有很多:

find_element_by_name
find_element_by_id
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

下面舉一個例子:


from selenium import webdriver
browser = webdriver.Chrome(executable_path=r'E:\EXE\chromedriver_win32\chromedriver')# executable_path后面跟的是chromedriver的絕對路徑
browser.get("http://www.taobao.com")
input_first = browser.find_element_by_id("q")
input_second = browser.find_element_by_css_selector("#q")
input_third = browser.find_element_by_xpath('//*[@id="q"]')
print(input_first)
print(input_second)
print(input_third)
browser.close()

例子中通過三種不同的方式去獲取響應的元素记餐,第一種是通過id的方式驮樊,第二個中是CSS選擇器,第三種是xpath選擇器,結果都是相同的

2.查找多個元素

查找多元素與查找單個元素的區(qū)別不大囚衔,在函數(shù)名上多加了一個s例如:find_elements_by_name挖腰。查找大哥元素返回的是符合查找條件的第一個標簽,查找多個元素返回的是符合條件的所有標簽练湿。

3.獲取元素屬性

在查找到相應元素后可以利用get_attribute(屬性名稱)函數(shù)獲取屬性值

舉一個簡單的例子如下:


from selenium import webdriver
browser = webdriver.Chrome(executable_path=r'E:\EXE\chromedriver_win32\chromedriver')# executable_path后面跟的是chromedriver的絕對路徑
browser.get('https://www.taobao.com/')
input_str = driver.find_element_by_id('q')
print(input_str.get_attribute('aria-label'))

得到的結果是:"請輸入搜索文字"

4.獲取文本值

與獲取元素屬性類似猴仑,不過更簡單,直接在查找到元素后利用其text方法

5.獲取標簽位置及大小

與獲取文本值一樣肥哎,獲取位置的方法為location辽俗,獲取大小的方法為size


from selenium import webdriver
browser = webdriver.Chrome(executable_path=r'E:\EXE\chromedriver_win32\chromedriver')# executable_path后面跟的是chromedriver的絕對路徑
browser.get('https://www.taobao.com/')
input_str = driver.find_element_by_id('q')
print(input_str.location)
print(input_str.size)

模擬操作

1.元素交互操作

元素交互操作是指咱們經(jīng)常用到的如查詢操作,登陸操作等

下面舉一個查詢操作的例子:


from selenium import webdriver
browser = webdriver.Chrome(executable_path=r'E:\EXE\chromedriver_win32\chromedriver')# executable_path后面跟的是chromedriver的絕對路徑
browser.get('http://www.kuaidi100.com/')
# print('cookies:', driver.get_cookies())
browser.find_element_by_name("postid").clear() # 清空輸入框內容
browser.find_element_by_name("postid").send_keys('3346535929281') # 輸入訂單號
browser.find_element_by_id("query").click() # 點擊搜索按鈕

該例是在快遞100中查詢一個訂單的物流信息篡诽。

2.執(zhí)行JavaScript操作

這是一個非常有用的方法崖飘,這里就可以直接調用js方法來實現(xiàn)一些操作,下面的例子是打開快遞100通過js翻到頁面底部


from selenium import webdriver
browser = webdriver.Chrome(executable_path=r'E:\EXE\chromedriver_win32\chromedriver')# executable_path后面跟的是chromedriver的絕對路徑
browser.get('http://www.kuaidi100.com/')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

切換Frame

frame標簽是比較特殊的杈女,定位該標簽內部的元素時必須先切換到對應的frame內朱浴,通過下面的例子演示這里常用的是switch_to.frame()和switch_to.parent_frame():

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementExceptionbrowser = webdriver.Chrome()
browser.get('http://bj.96weixin.com/')
browser.switch_to.frame('ueditor_1')
source = browser.find_element_by_class_name('view')
print(source)
try: 
logo = browser.find_element_by_xpath('//*[@id="main"]/div[1]/div/div/div[1]/a/h1/img')except NoSuchElementException: print('NO LOGO')browser.switch_to.parent_frame()logo = browser.find_element_by_xpath('//*[@id="main"]/div[1]/div/div/div[1]/a/h1/img')
print(logo)print(logo.get_attribute('src'))

很多時候網(wǎng)頁中要獲取的內容顯示其在一個框框里面,大家就要查看其是不是在各個框架內达椰,避免出錯翰蠢。

等待

網(wǎng)頁中很多內容是通過Ajax加載,需要一定時間才能加載出來啰劲,但selenium默認的是打開網(wǎng)頁后變開始定位元素梁沧,這樣容易出現(xiàn)找不到元素這樣的問題,不過selenium提供了兩種等待元素出現(xiàn)的方式:顯示等待和隱式等待蝇裤。

1.顯示等待

指定一個等待條件趁尼,并且指定一個最長等待時間,會在這個時間內進行判斷是否滿足等待條件猖辫,如果成立就會立即返回酥泞,如果不成立,就會一直等待啃憎,直到等待你指定的最長等待時間芝囤,如果還是不滿足,就會拋出異常辛萍,如果滿足了就會正常返回悯姊。


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()
browser.get('https://www.taobao.com/')
wait = WebDriverWait(browser, 10)
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)

上述的例子中的條件:EC.presence_of_element_located()是確認元素是否已經(jīng)出現(xiàn)了EC.element_to_be_clickable()是確認元素是否是可點擊的

常用的判斷條件:

title_is 標題是某內容
title_contains 標題包含某內容
presence_of_element_located 元素加載出,傳入定位元組贩毕,如(By.ID, 'p')
visibility_of_element_located 元素可見悯许,傳入定位元組
visibility_of 可見,傳入元素對象
presence_of_all_elements_located 所有元素加載出
text_to_be_present_in_element 某個元素文本包含某文字
text_to_be_present_in_element_value 某個元素值包含某文字
frame_to_be_available_and_switch_to_it frame加載并切換
invisibility_of_element_located 元素不可見
element_to_be_clickable 元素可點擊
staleness_of 判斷一個元素是否仍在DOM辉阶,可判斷頁面是否已經(jīng)刷新
element_to_be_ 元素可選擇先壕,傳元素對象
element_located_to_be_selected 元素可選擇瘩扼,傳入定位元組
element_selection_state_to_be 傳入元素對象以及狀態(tài),相等返回True垃僚,否則返回False
element_located_selection_state_to_be 傳入定位元組以及狀態(tài)集绰,相等返回True,否則返回False
alert_is_present 是否出現(xiàn)Alert

2.隱式等待

到了一定的時間發(fā)現(xiàn)元素還沒有加載谆棺,則繼續(xù)等待我們指定的時間栽燕,如果超過了我們指定的時間還沒有加載就會拋出異常,如果沒有需要等待的時候就已經(jīng)加載完畢就會立即執(zhí)行改淑。


from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
print(input)

選項卡管理

通過執(zhí)行window.open()實現(xiàn)新開選項卡
通過browser.window_handles函數(shù)可以獲得選項卡列表
通過browser.window_handles[n]就可以操作第n個選項卡
通過browser.close()關閉當前選項卡

from selenium import webdriver
browser = webdriver.Chrome()browser.get('https://www.baidu.com')
browser.execute_script('window.open()')# 打開一個新的選項卡print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])#切換到第二個選項卡碍岔,注意這里0為第一個
browser.get('https://www.taobao.com')time.sleep(1)browser.close()#關閉當前選項卡
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')

小結
本文介紹了selenium庫的安裝和測試方法,本文主要介紹selenium驅動chrome瀏覽器的相關操作朵夏,其他瀏覽器基本一樣只是需要添加對應的瀏覽器驅動付秕,后面主要介紹了如何查找元素、獲取屬性值侍郭、模擬人的操作询吴、操作frame內的元素、等待亮元、選項卡管理猛计。更多的內容請到:
http://selenium-python.readthedocs.io/api.html

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爆捞,隨后出現(xiàn)的幾起案子奉瘤,更是在濱河造成了極大的恐慌,老刑警劉巖煮甥,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盗温,死亡現(xiàn)場離奇詭異,居然都是意外死亡成肘,警方通過查閱死者的電腦和手機卖局,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來双霍,“玉大人砚偶,你說我怎么就攤上這事∪髡ⅲ” “怎么了染坯?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長丘逸。 經(jīng)常有香客問我单鹿,道長,這世上最難降的妖魔是什么深纲? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任仲锄,我火速辦了婚禮劲妙,結果婚禮上,老公的妹妹穿的比我還像新娘昼窗。我一直安慰自己,他們只是感情好涛舍,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布澄惊。 她就那樣靜靜地躺著,像睡著了一般富雅。 火紅的嫁衣襯著肌膚如雪掸驱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天没佑,我揣著相機與錄音毕贼,去河邊找鬼。 笑死蛤奢,一個胖子當著我的面吹牛鬼癣,可吹牛的內容都是我干的。 我是一名探鬼主播啤贩,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼待秃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痹屹?” 一聲冷哼從身側響起章郁,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎志衍,沒想到半個月后暖庄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡楼肪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年培廓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片春叫。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡医舆,死狀恐怖,靈堂內的尸體忽然破棺而出象缀,到底是詐尸還是另有隱情蔬将,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布央星,位于F島的核電站霞怀,受9級特大地震影響,放射性物質發(fā)生泄漏莉给。R本人自食惡果不足惜毙石,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一廉沮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧徐矩,春花似錦滞时、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鳞骤,卻和暖如春窒百,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豫尽。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工篙梢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人美旧。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓渤滞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親榴嗅。 傳聞我的和親對象是個殘疾皇子蔼水,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內容

  • Selenium是一款強大的基于瀏覽器的開源自動化測試工具,最初由 Jason Huggins 于 2004 年在...
    FifiZhuang閱讀 7,587評論 5 71
  • 洞見SELENIUM自動化測試 寫在最前面:目前自動化測試并不屬于新鮮的事物录肯,或者說自動化測試的各種方法論已經(jīng)層出...
    厲鉚兄閱讀 6,718評論 3 47
  • 第一次去海邊的時候天氣很不好趴腋,沒有看到日出,稍有遺憾论咏,這次來到海邊优炬,一定要看到海邊日出。 早上五點起床去海邊厅贪,一個...
    馬曉迎閱讀 512評論 0 0
  • 動物題材的影片對于鏟屎官們的殺傷力都好大蠢护,估計養(yǎng)過寵物的人都會希望自己的萌寵起死回生吧。據(jù)說有的場次哭聲一片养涮,據(jù)說...
    火瓏果閱讀 2,636評論 0 5
  • 《西游記》是我國古代的四大名著之一葵硕,里面講述的唐僧師徒四人去西天取經(jīng)的故事大家耳熟能詳。有那么一天贯吓,我坐著發(fā)呆時突...
    靜默心谷閱讀 404評論 0 1