python3爬蟲學習筆記之分析動態渲染網頁爬取Selenium+Chrome(九)

JavaScript動態渲染並不是只有Ajax這一種,一些頁面並不能通過前面章節的分析方法分析並爬取數據,所以就有了模擬瀏覽器運行的方式來實現爬取,這樣在瀏覽器中看到是什麼樣,抓取的源碼就是什麼樣的,無需考慮用了什麼方式渲染頁面。Python提供了很多模擬瀏覽器的庫,這裏我們介紹selenium的使用。

Selenium是一個自動化測試工具,利用它就可以驅動瀏覽器執行特定的人任務,如點擊、下拉等操作,同時還可獲取瀏覽器當前呈現的頁面的源代碼。

1. 準備工作

以Chrome爲例使用Selenium,所以在之前,確保安裝好Chrome並配置好ChromeDriver,安裝好selenium庫。

2. 基本使用

確定環境安裝完整之後,可以看一下selenium的一些功能。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()
try:
    browser.get('https://www.baidu.com')
    input = browser.find_element_by_id('kw')
    input.send_keys('Python')
    input.send_keys(Keys.ENTER)
    wait = WebDriverWait(browser,10)
    wait.until(EC.presence_of_all_elements_located((By.ID,'content_left')))
    print(browser.current_url)
    print(browser.get_cookies())
    print(browser.page_source)
finally:
    browser.close()
    browser.quit()

運行代碼後發現,會自動彈出一個Chrome瀏覽器,瀏覽器首先跳轉到百度首頁,然後在搜索框中輸入Python,接着跳轉到搜索結果頁。搜索結果加載出來後,控制檯分別會輸出當前的URL、當前的Cookies和網頁源代碼,最後關閉瀏覽器。

3. 聲明瀏覽器對象

Selenium支持非常多的瀏覽器,如Chrome、Firefox、Edge、PhantomJS等,可以用如下方式聲明瀏覽器對象:

from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.PhantomJS()

接下來要做的就是調用瀏覽器對象,讓其執行各個動作以模擬瀏覽器操作。

4. 訪問頁面

我們可以用get( )方法來請求網頁,參數輸入鏈接URL即可,如下:

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
print(browser.page_source)
browser.close()

運行之後,彈出了瀏覽器並且自動訪問了淘寶,然後控制檯輸出淘寶頁面的源碼,隨後關閉瀏覽器。

5. 查找節點

Selenium可以驅動瀏覽器完成各種操作,比如填充表單、模擬點擊等。比如,我們要向某個輸入框中輸入文字內容,總需要知道這個輸入框在哪裏?而Selenium提供了一系列查找節點的方法,我們可以用這些方法來獲取想要的節點,以便下一步執行一些動作或者提供信息。

·單個節點

比如,想要從淘寶頁面中提取搜索框這個節點,首先觀察它的源代碼,

 

可以發現,它的id是mq,name是q。此外,還有其他屬性,我們可以用多種方式獲取它。find_element_by_name( )根據name值獲取,find_element_by_id( )根據id值獲取。另外還有XPath、CSS選擇器等獲取方式。

from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://world.taobao.com')
input_first = browser.find_element_by_id('mq')
input_second = browser.find_element_by_name('q')
input_third = browser.find_element_by_xpath('//*[@id="mq"]')
input_fourth = browser.find_element_by_css_selector('#mq')
print(input_first,input_second,input_third,input_fourth)
browser.close()

運行結果如下,獲取節點完全一致:

 

這裏列出所有獲取單個節點的方法:

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

另外,還提供了通用方法find_element( ),它需要出入兩個參數:查找方式By和值。

·多個節點

如果查找的目標在網頁中只有一個,那麼可以用find_element( )方法。但如果有多個節點,需要用find_elements( )方法。

獲取多個節點的方法:

find_elements_by_id
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
find_elements

6. 節點交互

Selenium可以驅動瀏覽器來執行一些操作,也就是可以讓瀏覽器模擬執行一些操作。比較常見的有:輸入文字時用send_keys( )方法,清空文字時用clear( )方法,點擊按鈕時用click( )方法。示例:

from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input = browser.find_element_by_id('q')
input.send_keys('iPhone')
time.sleep(1)
input.clear()
input.send_keys('iPad')
#input.send_keys(Keys.ENTER)
button = browser.find_element_by_class_name('btn-search')
button.click()browser.close()

以上是一個簡單的輸入框輸入文字和點擊按鈕的操作,更多的操作可以查看文檔。

7. 動作鏈

8. 執行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")')

9. 獲取節點信息

a. 獲取屬性

get_attribute()

b. 獲取文本

節點text屬性

c. id、位置、標籤和大小

 

如果對你有用,點個贊  手動笑臉(*_*)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章