天天看點

網絡爬蟲 | selenium 爬取動态加載資訊

使用selenium實作動态渲染頁面的爬取。selenium是浏覽器自動測試架構,模拟浏覽器,驅動浏覽器執行特定的動作,并可擷取浏覽器目前呈現的頁面的源代碼,可見即可爬。該工具支援

IE浏覽器、Mozilla Firefox及Google Chrome等

selenium安裝

通過 pip install selenium 指令安裝selenium子產品

下載下傳浏覽器驅動 "https://chromedriver.chromium.org/downloads"

這裡需要根據已經安裝的Google Chrome浏覽器的版本,以及自己的電腦的系統安裝浏覽器驅動。

網絡爬蟲 | selenium 爬取動态加載資訊

下載下傳完成後,需要将檔案儲存在與python檔案同級路徑中,如下圖所示。

網絡爬蟲 | selenium 爬取動态加載資訊
如果出現如下報錯。

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 爬取動态加載資訊

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")
           

複制

打開百度浏覽器,并查找元素

網絡爬蟲 | selenium 爬取動态加載資訊

通過選擇元素按鈕找到百度搜尋框的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()#關閉浏覽器
           

複制

效果圖如下

網絡爬蟲 | selenium 爬取動态加載資訊

擷取元素資訊,擷取屬性

#擷取元素資訊,擷取屬性
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}

元素互動、下拉進度條

先找到搜尋框位置,和點選搜尋位置

網絡爬蟲 | selenium 爬取動态加載資訊
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()#關閉浏覽器
           

複制

結果動态示範

網絡爬蟲 | selenium 爬取動态加載資訊

等待

當進入一個網站時,網頁重新整理沒有那麼快,文字先出來,圖檔後出來。當網速很慢時尤其明顯,是以此時需要加入等待,等待分兩種,一種是隐式等待,一種是顯示等待。

網絡爬蟲 | selenium 爬取動态加載資訊

隐式等待

即等待固定的時間

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,粘貼

登入操作

網絡爬蟲 | selenium 爬取動态加載資訊
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()#登入           

複制