使用selenium實作動态渲染頁面的爬取。selenium是浏覽器自動測試架構,模拟浏覽器,驅動浏覽器執行特定的動作,并可擷取浏覽器目前呈現的頁面的源代碼,可見即可爬。該工具支援
IE浏覽器、Mozilla Firefox及Google Chrome等
。
selenium安裝
通過 pip install selenium 指令安裝selenium子產品
下載下傳浏覽器驅動 "https://chromedriver.chromium.org/downloads"
這裡需要根據已經安裝的Google Chrome浏覽器的版本,以及自己的電腦的系統安裝浏覽器驅動。

下載下傳完成後,需要将檔案儲存在與python檔案同級路徑中,如下圖所示。
如果出現如下報錯。 Message: session not created: This version of ChromeDriver only supports Chrome version 79
請檢視谷歌浏覽器與驅動不一緻解決方案。此處筆者是重新安裝谷歌浏覽器79版本。
聲明浏覽器對象
import os
os.chdir(r'/Users/jim/Desktop/代碼')
from selenium import webdriver # 導入浏覽器驅動子產品
browser=webdriver.Chrome() # 會打開浏覽器
複制
selenium子產品的常用方法
driver.find_element_by_
常用方法 | 描述 |
---|---|
driver.find_element_by_id() | 根據id擷取節點,參數為字元類型id對應的值 |
driver.find_element_by_name() | 根據name擷取節點,參數為字元類型name對應的值 |
driver.find_element_by_xpath() | 根據XPath擷取節點,參數為字元類型的XPath |
driver.find_element_by_link_text() | 根據連結文本擷取節點,參數為字元類型連結文本 |
driver.find_element_by_tag_name() | 根據節點名稱擷取節點,參數為字元類型的節點名稱 |
driver.find_element_by_class_name() | 根據class擷取節點,參數為字元類型class對應的值 |
driver.find_element_by_css_selector | 根據CSS選擇器擷取節點,參數為字元類型的CSS選擇器文法 |
如需要擷取符合條件的多個節點時,在對應方法中element後面添加s。
driver.find_element(by='id', value=None)
by: 擷取節點的方式
value: 擷取方式對應的值(了解為條件)
擷取多個節點時使用
find_elements()
By屬性 | 用法 |
---|---|
By.ID | 根據id值擷取對應的節點 |
By.LINK_TEXT | 根據連結文本擷取對應的節點 |
By.PARTIAL_LINK_TEXT | 根據部分連結文本擷取對應的節點 |
By.NAME | 根據name值擷取對應的單個或多個節點 |
By.TAG_NAME | 根據節點名擷取節點 |
By.CLASS_NAME | 根據class值擷取節點 |
By.CSS_SELECTOR | 根據CSS選擇器擷取節點,對應的value字元串字元串CSS位置 |
By.XPATH | 根據By.XPATH擷取節點,對應的value字元串節點位置 |
擷取某個節點中的某個屬性對應的值時,可以使用
get_attribute()方法
來實作。
例
#根據name
_input=browser.find_element_by_name("q")
#根據css擷取,id名
input_second=browser.find_element_by_css_selector("#q")
#根據id擷取
input_third=browser.find_element(By.ID,"q")
複制
打開百度浏覽器,并查找元素
通過選擇元素按鈕找到百度搜尋框的HTML代碼,這裡通過他的
id='kw'
尋找到浏覽框,輸完内容後需點選"百度一下?imageView2/2/w/1620"
id='su'
import time
from selenium import webdriver
browser=webdriver.Chrome()#會打開浏覽器
browser.get('https://www.baidu.com/')
_input = browser.find_element_by_id('kw')#找百度的輸入框
# print(_input)
_input.send_keys('python')
_input=browser.find_element_by_id('su').click()#回車
time.sleep(10)
browser.close()#關閉浏覽器
複制
效果圖如下
擷取元素資訊,擷取屬性
#擷取元素資訊,擷取屬性
from selenium import webdriver
browser=webdriver.Chrome()
url="https://www.zhihu.com/explore"
browser.get(url)
logo=browser.find_element_by_class_name("ZhihuLogoLink")
print(logo)
print(logo.get_attribute("class"))
print(logo.text)
print(logo.id) #id
print(logo.location) #位置
print(logo.tag_name) #标簽名
print(logo.size) #大小
複制
<selenium.webdriver.remote.webelement.WebElement (session="b07f3d23e5f830581deddfa8a568631c", element="71a5b5b9-dc75-4bac-846a-484ba879ac48")> ZhihuLogoLink
71a5b5b9-dc75-4bac-846a-484ba879ac48 {'x': 16, 'y': 10} a {'height': 33, 'width': 64}
元素互動、下拉進度條
先找到搜尋框位置,和點選搜尋位置
import time
from selenium import webdriver
browser=webdriver.Chrome() #打開浏覽器
browser.get('https://www.jd.com/?cu=true&utm_source=baidu-pinzhuan&utm_medium=cpc&utm_campaign=t_288551095_baidupinzhuan&utm_term=0f3d30c8dba7459bb52f2eb5eba8ac7d_0_27b1bb5bc1cb4d2faf65fc59cdbfd1cc')
_input=browser.find_element_by_id('key')#
_input.send_keys('羽絨服')
_input.clear()
_input.send_keys('aj')
browser.find_element_by_class_name('button').click()#回車
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(2)
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
time.sleep(2)
browser.execute_script('window.scrollTo(0,0)')
#browser.close()#關閉浏覽器
複制
結果動态示範
等待
當進入一個網站時,網頁重新整理沒有那麼快,文字先出來,圖檔後出來。當網速很慢時尤其明顯,是以此時需要加入等待,等待分兩種,一種是隐式等待,一種是顯示等待。
隐式等待
即等待固定的時間
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
browser.implicitly_wait(3) # 等待固定時間
_input = browser.find_element_by_class_name('zu-button-more')
複制
顯示等待
根據實際情況,可設定最大等待時間,知道某個目标元素加載完成。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
wait = WebDriverWait(browser,10) # 最多等待十秒
# 等待到id='q'加載完成
_input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
# 等待到'.btn-search'可以點選
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
複制
浏覽器的前進和後退
from selenium import webdriver
import time
browser=webdriver.Chrome()
browser.get("https://www.taobao.com")
time.sleep(2)
browser.get("https://www.baidu.com")
browser.back()#後退
time.sleep(2)
browser.forward()#前進
time.sleep(3)
browser.refresh()#重新整理
time.sleep(3)
browser.close()
複制
頁籤管理
from selenium import webdriver
import time
browser=webdriver.Chrome()
browser.get("https://www.zhihu.com/explore")
browser.execute_script("window.open()")
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
browser.get("https://www.taobao.com")
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get("https://www.jd.com")
browser.close()
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.close()
複制
異常處理
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException
browser=webdriver.Chrome()
try:
browser.get("https://www.zhihu.com/explore")
except TimeoutException:
print("Time out")
try:
browser.find_element_by_id("hello")
except NoSuchElementException:
print("No Element")
finally:
browser.close()
複制
常用操作
#常用鍵的操作
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
driver.find_element_by_id('kw').send_keys('selenium')
#在搜尋框中輸入"selenium"
time.sleep(3)
driver.find_element_by_id('kw').send_keys(Keys.SPACE)
#輸入空格鍵
time.sleep(3)
driver.find_element_by_id('kw').send_keys('python')
#在搜尋框中輸入"python"
time.sleep(3)
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a')
#輸入Control+a模拟全選
time.sleep(3)
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'c')
#輸入Control+c模拟複制
time.sleep(3)
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'v')
#輸入Control+v模拟粘貼
time.sleep(3)
driver.find_element_by_id('kw').send_keys(Keys.ENTER)
#輸入回車代替點選搜尋按鈕
time.sleep(3)
driver.close()
複制
下面是一些常用的鍵盤事件
代碼 | 含義 |
---|---|
Keys.BACK_SPACE | 回退鍵(BackSpace) |
Keys.TAB | 制表鍵(Tab) |
Keys.ENTER | Enter鍵(Enter) |
Keys.SHIFT | 大小寫轉換鍵(Shift) |
Keys.CONTROL | Control鍵(Ctrl) |
Keys.ALT | ALT鍵(Alt) |
Keys.ESCAPE | 傳回鍵(Esc) |
Keys.SPACE | 空格鍵(Space) |
Keys.PAGE_UP | 翻頁鍵上(Page Up) |
Keys.PAGE_DOWN | 翻頁鍵下(Page Down) |
Keys.END | 行尾鍵(End) |
Keys.HOME | 行首鍵(Home) |
Keys.LEFT | 方向鍵左(Left) |
Keys.UP | 方向鍵上(Up) |
Keys.RIGHT | 方向鍵右(Right) |
Keys.DOWN | 方向鍵下(Down) |
Keys.INSERT | 插入鍵(Insert) |
DELETE | 删除鍵(Delete) |
NUMPAD0 ~ NUMPAD9 | 數字鍵1-9 |
F1 ~ F12 | F1 - F12鍵 |
(Keys.CONTROL, ‘a’) | 組合鍵Control+a,全選 |
(Keys.CONTROL, ‘c’) | 組合鍵Control+c,複制 |
(Keys.CONTROL, ‘x’) | 組合鍵Control+x,剪切 |
(Keys.CONTROL, ‘v’) | 組合鍵Control+v,粘貼 |
登入操作
browser=webdriver.Chrome()
url='''
https://passport.jd.com/new/login.aspx?
ReturnUrl=https%3A%2F%2Fwww.jd.com%2F%3Fcu%3
Dtrue%26utm_source%3Dbaidu-pinzhuan%26utm_me
dium%3Dcpc%26utm_campaign%3Dt_288551095_baid
upinzhuan%26utm_term%3D0f3d30c8dba7459bb52f2
eb5eba8ac7d_0_5c595fde6f6743c1a1878bfeaf4f21
5f'''
browser.get(url)
time.sleep(3)
button=browser.find_element_by_link_text('賬戶登入').click()
browser.find_element_by_id('loginname').send_keys('')#自己的使用者名
time.sleep(2)
browser.find_element_by_id("nloginpwd").send_keys('')#密碼
time.sleep(2)
browser.find_element_by_id('loginsubmit').click()#登入
複制