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、位置、標籤和大小
如果對你有用,點個贊 手動笑臉(*_*)