1.selenium的介紹selenium是一個(gè)web自動(dòng)化測(cè)試用的框架. 程序員可以通過代碼實(shí)現(xiàn)對(duì)瀏覽器的控制, 比如打開網(wǎng)頁, 點(diǎn)擊網(wǎng)頁中的元素, 實(shí)現(xiàn)鼠標(biāo)滾動(dòng)等操作. 它支持多款瀏覽器, 如谷歌瀏覽器, 火狐瀏覽器等等, 當(dāng)然也支持無頭瀏覽器.
使用selenium的目的 在爬取數(shù)據(jù)的過程中, 經(jīng)常遇到動(dòng)態(tài)數(shù)據(jù)加載, 一般動(dòng)態(tài)數(shù)據(jù)加載有兩種, 一種通過ajax請(qǐng)求加載數(shù)據(jù), 另一種通過js代碼加載動(dòng)態(tài)數(shù)據(jù). selenium可以模擬人操作真實(shí)瀏覽器, 獲取加載完成的頁面數(shù)據(jù) ajax: url有規(guī)律且未加密, 直接構(gòu)建url連接請(qǐng)求 url加密過無法破解規(guī)律 --> selenium js動(dòng)態(tài)數(shù)據(jù)加載 --> selenium
2.selenium的安裝安裝三要素: 瀏覽器、驅(qū)動(dòng)程序、selenium框架 瀏覽器: 推薦谷歌瀏覽器, 標(biāo)準(zhǔn)穩(wěn)定版本 推薦谷歌的理由是因?yàn)楣雀韬糜? 并且大多數(shù)程序員都在用
驅(qū)動(dòng)程序: 下載地址 驅(qū)動(dòng)程序的下載版本需要和谷歌的版本一致, 前三位一致即可(例:76.0.3809)
框架: 自己搭建即可 以上完成后直接在控制臺(tái)輸入: pip install selenium 3.selenium常用操作常用操作有很多種, 比如: 獲取頁面元素、輸入內(nèi)容、點(diǎn)擊、退出… ↓ 3.1 測(cè)試一下你的selenium# 從selenium中導(dǎo)入驅(qū)動(dòng)程序
from selenium import webdriver
# 實(shí)例化瀏覽器對(duì)象
browser = webdriver.Chrome('driverpath')
# 發(fā)送get請(qǐng)求:
browser.get('https://www.baidu.com')
dirverpath: 驅(qū)動(dòng)的存儲(chǔ)路徑, 可以直接將驅(qū)動(dòng)放在當(dāng)前腳本所在的文件夾, 如果放在本地文件夾還是無法執(zhí)行, 那就將驅(qū)動(dòng)放在谷歌瀏覽器的Application文件夾當(dāng)中, 并指明路徑
3.2 獲取頁面元素find_element_by_id(): 根據(jù)元素的id獲取元素
find_element_by_name(): 根據(jù)元素的name獲取元素
find_element_by_xpath(): 根據(jù)xpath表達(dá)式獲取元素
find_element_by_class_name(): 根據(jù)class的值
find_element_by_css_selector(): 根據(jù)css選擇器
3.3 節(jié)點(diǎn)交互操作click(): 點(diǎn)擊
send_keys(): 輸入內(nèi)容
clear(): 清空操作
execute_script(js代碼): 執(zhí)行指定的js代碼
quit(): 退出瀏覽器
列舉一段自己常用的js代碼: window.scrollTo(0, document.body.scrollHeight) 可以模擬鼠標(biāo)滾動(dòng)一屏高度
3.4 獲取網(wǎng)頁的數(shù)據(jù)browser.page_source: 獲取網(wǎng)頁的源碼, str類型
3.5 子頁面# 如果一個(gè)頁面是有嵌套關(guān)系的話, 可以使用frame進(jìn)入指定的頁面, 例如QQ空間
switch_to.frame('frame')
4.使用selenium模擬登錄qq空間import time
from selenium import webdriver
# 此處driverpath需要存放自己下載驅(qū)動(dòng)的路徑
browser = webdriver.Chrome(r'driverpath')
# 獲取QQ空間的url, 并發(fā)送請(qǐng)求
url = 'https://qzone.qq.com/'
browser.get(url)
# qq空間使用的是組建嵌套,登錄要先選擇進(jìn)入到子頁面
browser.switch_to.frame('login_frame')
# 獲取賬號(hào)密碼登錄連接的id, 然后點(diǎn)擊賬號(hào)密碼登錄
a_tag = browser.find_element_by_id('switcher_plogin')
a_tag.click()
# 在下面會(huì)多次用到sleep讓休眠幾秒鐘, 目的就是避免訪問過快造成被誤認(rèn)為腳本
time.sleep(2)
# 獲取賬號(hào)文本框并輸入賬號(hào)
user = browser.find_element_by_id('u')
user.send_keys('自己的QQ賬號(hào)')
time.sleep(2)
# 獲取密碼框并寫入密碼
pwd = browser.find_element_by_id('p')
pwd.send_keys('自己的QQ密碼')
time.sleep(2)
# 獲取登錄按鈕并點(diǎn)擊
button = browser.find_element_by_id('login_button')
button.click()
5.谷歌無頭瀏覽器from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 實(shí)例化Options對(duì)象
chrome_options = Options()
# 增加一個(gè)參數(shù), 告訴瀏覽器是無頭瀏覽器
chrome_options.add_argument('--headless')
# 增加一個(gè)參數(shù), 告訴瀏覽器不需要使用GPU渲染
chrome_options.add_argument('--disable-gpu')
# 驅(qū)動(dòng)路徑, 谷歌的驅(qū)動(dòng)存放路徑
path = r'driverpath'
# 實(shí)例化瀏覽器對(duì)象
browser = webdriver.Chrome(executable_path=path, options=chrome_options)
# 打開指定的頁面
browser.get('https://www.baidu.com')
# 打印訪問頁面的源碼
print(browser.page_source)
# 將頁面源碼寫入到文件當(dāng)中
with open('bai_du.html', 'w', encoding='utf-8') as f:
f.write(browser.page_source)
|