1. 采用google瀏覽器(試驗時有頭瀏覽器方便檢測,代碼完成后改為無頭瀏覽)
注意: 需要提前安裝google的chrome.exe到python默認執行目錄。否則python.exe不知道從哪里調用chrome,會報錯。
from selenium import webdriver ## 1. 默認有頭瀏覽器 driver = webdriver.Chrome() driver.get("http://sns.sseinfo.com") # 2. 配置無頭瀏覽器 chrome_options = webdriver.chrome.options.Options(); chrome_options.add_argument('--headless') driver = webdriver.Chrome(chrome_options=chrome_options) driver.get("http://sns.sseinfo.com")
2. 模擬鼠標點擊
webserver 提供了鼠標操作的封裝類ActiionChains(包括單擊、雙擊、右擊、懸停、拖動等)。
ActionChains類提供的鼠標操作方法:
- perform( ):執行ActionChains中存儲的所有行為。(ActionChians類實例化為對象后,通過perform( )依次執行操作)
- click( ):單擊
- context_click( ) : 右擊
- double_click( ) : 雙擊
- drag_and_drop( source, target ) : 拖動 (從一個位置到另一個位置,可用於某種拖動型的驗證碼)
- move_to_element ( ) : 鼠標懸停。(有些網頁需要鼠標在特定位置懸停,才會顯示待選項,進而點擊進入下一個頁面。比如https://www.baidu.com/,右上角的設置按鈕,鼠標懸停才能出現備選項)
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains # 引入ActionChains類
# ----------------------- driver=webdriver.Chrome()## 啟動Chrome瀏覽器驅動 driver.get('https://www.baidu.com'); content_to_process=driver.find_element_by_link_text('新聞'); try: ActionChains(driver).click(content_to_process).perform( ) print 'success to click' except Exception as e: print 'fail'
其中的核心語句(尋找內容並點擊)
ActionChains(driver).click(content_to_process).perform( )
可以分解為以下幾個步驟:
driver=webdriver.Chrome( );
driver.get('http://www.baidu.com') action=ActionChains(driver)#步驟1:調用ActionChains()類,並將網頁作為參數傳入,實例化為具體的待操作對象 content_to_process=driver.find_element_by_link_text('新聞')#步驟2: 在網頁中,定位“新聞”的坐標;可輸出action,查看坐標內容和格式 action.click(content_to_process)#步驟3:傳入元素的定位坐標,模擬鼠標點擊 action.perform()#步驟4:執行ActionChains()中儲存的所有操作,即執行之前的一系列操作;如果沒有perform(),則只彈出百度網頁(執行到driver.get('www.baidu.com'),而后續核心的點擊操作不會執行。)
為什么要設置perform( )語句?方便執行??有點像pyplot的show ( )。 中間環節全部處理完,最后統一顯示/執行。
==》ActionChains的perform( ) 執行原理:當調用ActionChains的方法時,不會立即執行,而是會將所有的操作按順序存放在一個隊列里,當你調用perform()方法時,隊列中的事件會依次執行。
==》注意:webdriver本身也帶有click( )功能;如果只是單擊,可以直接這樣操作
driver=webdriver.Chrome( ); driver.get('http://www.baidu.com') driver.find_element_by_link_text('新聞').click() while 1: continue ##保留頁面顯示
參考:1. https://www.cnblogs.com/jasontang369/p/9212381.html(這篇博客示例有錯誤,錯誤很容易辨別。可作為參考)
2. https://www.jb51.net/article/92682.htm
3. 定位坐標(無論鼠標單擊、雙擊、懸停、拖動,還是在搜索框輸入文字,都需要對操作的對象定位)
定位的實質是匹配(比如查找‘新聞’按鈕的位置,此處無須使用正則表達式)。定位方式主要包括根據網頁上的文字定位、根據網頁源代碼的標簽定位。
參考:1. https://www.cnblogs.com/kitty-zhou/p/5438273.html
2. https://www.cnblogs.com/yoyoketang/p/6551274.html (好文章,自己嘗試下)
3.https://www.cnblogs.com/yoyoketang/p/6557421.html
4.http://www.cnblogs.com/yufeihlf/p/5717291.html (重要,可以詳細了解定位方法)
5.https://blog.csdn.net/a6864657/article/details/80616418(學一下xpath定位)
4. 搜索框輸入關鍵字並檢索(1. 定位;2. 輸入;3. 確認搜索(enter))
先看示例:
from selenium import webdriver driver=webdriver.Chrome() # 啟動瀏覽器 driver.get('https://www.baidu.com');# 獲取百度頁面 driver.find_element_by_id('kw').clear() ## 輸入框清空(在百度首頁,按F12,源碼中id=‘kw’唯一對應搜索框) driver.find_element_by_id('kw').send_keys('selenium')# 輸入搜索內容,此處我們搜索‘selenium’ driver.find_element_by_id('su').click()#百度首頁的源碼中, id=‘su’唯一對應‘百度一下’搜索按鈕。
搜索框輸入文字,主要是在定位后(找到輸入框),利用send_keys()輸入。send_keys(string)除了輸入字符,還可以模擬鍵盤上的特定按鍵,實現一些特殊功能。鍵盤按鈕通過Key()類封裝到Keys:
- send_keys(Keys.BACK_SPACE): 刪除鍵(backspace)
- send_keys(Keys.SPACE) : 空格鍵(SPACE)
- send_keys( Keys.TAB) :制表位
-send_keys(Keys.ENTER): 回車鍵(Enter)
- send_keys(Keys.CONTROL,'a'): 全選(Ctrl+A);
- send_keys(Keys.CONTROL,'c'): 復制(Ctrl+C);
-send_keys(Keys.CONTROL,'v'): 粘貼(Ctrl+V);(ctrol+x 剪切同理)
- send_keys(Keys.F1) 鍵盤F1
- send_keys(Keys.UP) : 方向鍵(上下左右,分別為UP、DOWN、LEFT,RIGHT,均為大寫)
參考:https://www.cnblogs.com/c1116p1212/p/9482265.html
from selenium import webdriver from selenium.webdriver.common.keys import Keys ## 引入Keys 模塊 # --------------------- driver=webdriver.Chrome(); driver.get('http://www.baidu.com') # 輸入框輸入內容 driver.find_element_by_id('kw').send_keys('seleniumm')## 詞尾多輸入了一個‘m’ driver.find_element_by_id('kw').send_keys(Keys.BACK_SPACE)# 重新定位,刪除多余的‘m’。 driver.find_element_by_id('kw').send_keys(Keys.SPACE)# 輸入空格 driver.find_element_by_id('kw').send_keys(u'教程') driver.find_element_by_id('su').send_keys(Keys.ENTER)## 點擊確定,此處也可以用click()替代send_keys(Keys.ENTER); # driver.quit()
5. 定位完成后,從網頁提取所需信息(此時瀏覽器網頁已經跳轉到我們所期望的頁面,有效信息都已經展示出來)
提取所需信息,可以通過兩種途徑。如下舉例,a標簽下的文本內容為你好,標簽內屬性有href,class,name,id。
<a href=xxx class=xxx name=xxx id=xxx > 你好 </a>
第一種方法:直接從源碼中提取,
- finde_element().text : 獲取標簽的文本值(<a>和</a>構成一組標簽,一開一閉。.text 獲取標簽之間的文本)
- find_element().get_attribute(): 獲取屬性值(即href,class,name,id的值)
第二種方法:采用BeatifulSoup等專門用來解析源碼的安裝包
- driver.page_source: 獲取當前網頁的所有源碼
-soup=BeautifulSoup(driver.page_source,features='lxml') : 轉化成BS對象,專門用來分析標簽(需要學習BeautifulSoup教程)
