1. 程式人生 > >【Python3 爬蟲學習筆記】動態渲染頁面爬取 2

【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屬性來獲取對應的屬性值。