【Python3 爬蟲學習筆記】動態渲染頁面爬取 2
動作鏈
在互動操作中,一些互動動作都是針對某個節點執行的。比如,對於輸入框,我們就呼叫它的輸入文字和清空文字方法;對於按鈕,就呼叫它的點選方法。其實,還有另外一些操作,它們沒有特定的執行物件,比如滑鼠拖曳、鍵盤按鍵等,這些動作用另一種方式來執行,那就是動作鏈。 比如,現在實現一個節點的拖曳操作,將某個節點從一處拖曳到另外一處,可以這樣實現:
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()
首先,開啟頁面中的一個拖曳例項,然後依次選中拖曳的節點和拖曳到的目標及誒單,接著宣告ActionChains物件並將其賦值為actions變數的drag_and_drop()方法,再呼叫perform()方法執行動作,此時就完成了拖曳操作,如圖所示:
執行JavaScript
對於某些操作,Selenium API並沒有提供。比如,下拉進度條,它可以直接模擬執行JavaScript,此時使用execute_script()方法即可實現,程式碼如下:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script( 'alert("To Bottom")')
這裡就利用execute_script()方法將進度條下拉到最底部,然後彈出alert提示框。
獲取節點資訊
獲取屬性
我們可以使用get_attribute()方法來獲取節點的屬性,但是其前提是先選中這個節點,示例如下:
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = 'http://www.zhihu.com/explore'
browser.get(url)
logo = browser.find_element_by_id('zh-top-link-logo')
print(logo)
print(logo.get_attribute('class'))
執行之後,程式便會驅動瀏覽器開啟知乎頁面,然後獲取知乎的logo節點,最後打印出它的class。 控制檯的輸出結果如下:
<selenium.webdriver.remote.webelement.WebElement (session="fd40d4cef02f55c619eeaa3c61d5cec0", element="0.4295620491046377-1")>
zu-top-link-logo
通過get_attribute()方法,然後傳入想要獲取的屬性名,就可以得到它的值了。
獲取文字值
每個WebElement節點都有text屬性,直接呼叫這個屬性就可以得到節點內部的文字資訊,這相當於Beautiful Soup的get_text()方法、pyquery的text()方法,示例如下:
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.text)
控制檯的輸出結果如下:
提問
獲取id、位置、標籤名和大小
另外,WebElement節點還有一些其他屬性,比如id屬性可以獲取節點id,location屬性可以獲取該節點在頁面中的相對位置,tag_name屬性可以獲取標籤名稱,size屬性可以獲取節點的大小,也就是寬高,這些屬性有時候還是很有用的。示例如下:
from selenium import webdriver
browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)
這裡首先獲得“提問”按鈕這個節點,然後呼叫其id、location、tag_name、size屬性來獲取對應的屬性值。