python 爬蟲之selenium可視化爬蟲的實(shí)現(xiàn)
之所以把selenium爬蟲稱之為可視化爬蟲
主要是相較于前面所提到的幾種網(wǎng)頁解析的爬蟲方式
selenium爬蟲主要是模擬人的點(diǎn)擊操作
selenium驅(qū)動(dòng)瀏覽器并進(jìn)行操作的過程是可以觀察到的
就類似于你在看著別人在幫你操縱你的電腦,類似于別人遠(yuǎn)程使用你的電腦
當(dāng)然了,selenium也有無界面模式
快速入門
selenium基本介紹:
selenium 是一套完整的web應(yīng)用程序測試系統(tǒng),
包含了測試的錄制(selenium IDE),編寫及運(yùn)行(Selenium Remote Control)
和測試的并行處理(Selenium Grid)。
Selenium的核心Selenium Core基于JsUnit,
完全由JavaScript編寫,因此可以用于任何支持JavaScript的瀏覽器上。
selenium可以模擬真實(shí)瀏覽器,自動(dòng)化測試工具,支持多種瀏覽器,
爬蟲中主要用來解決JavaScript渲染問題。
用python寫爬蟲的時(shí)候,主要用的是selenium的Webdriver,
#安裝selenium庫 pip install selenium #安裝對應(yīng)瀏覽器驅(qū)動(dòng) # 我們可以通過下面的方式先看看Selenium.Webdriver支持哪些瀏覽器 from selenium import webdriver print(help(webdriver))
適用瀏覽器: PACKAGE CONTENTS android (package) blackberry (package) chrome (package) common (package) edge (package) firefox (package) ie (package) opera (package) phantomjs (package) remote (package) safari (package) support (package) webkitgtk (package) #這里要說一下比較重要的PhantomJS, #PhantomJS是一個(gè)而基于WebKit的服務(wù)端JavaScript API, #支持Web而不需要瀏覽器支持, #其快速、原生支持各種Web標(biāo)準(zhǔn):Dom處理,CSS選擇器,JSON等等。 #PhantomJS可以用用于頁面自動(dòng)化、網(wǎng)絡(luò)監(jiān)測、網(wǎng)頁截屏,以及無界面測試
谷歌瀏覽器驅(qū)動(dòng)下載地址
注意對應(yīng)版本號,chrome地址欄輸入chrome://version/ 查看自己的Chrome版本
我使用的是anaconda 下載好后丟入anaconda3\Scripts文件夾下就可以了
如果是其他ide如:pycharm、VScode但加載的還是anaconda的集成python,依然可以這么操作
簡單測試
from selenium import webdriver
# #聲明瀏覽器對象
browser1 = webdriver.Chrome()
browser2 = webdriver.Firefox()
# #訪問頁面
browser1.get("http://www.baidu.com")
print(browser1.page_source)
#關(guān)閉當(dāng)前窗口
browser1.close()
元素定位
要想對頁面進(jìn)行操作,首先要做的是選中頁面元素,
比較常見的八種元素定位方式,如下表
| 定位一個(gè)元素 | 定位多個(gè)元素 | 定位方式描述 |
|---|---|---|
| find_element_by_id | find_elements_by_id | 通過元素 id進(jìn)行定位 |
| find_element_by_name | find_elements_by_name | 通過元素 名稱進(jìn)行定位 |
| find_element_by_xpath | find_elements_by_xpath | 通過xpath路徑進(jìn)行定位 |
| find_element_by_link_text | find_elements_by_link_text | 通過完整超鏈接文本進(jìn)行定位 |
| find_element_by_partial_link_text | find_elements_by_partial_link_text | 通過部分超鏈接文本進(jìn)行定位 |
| find_element_by_tag_name | find_elements_by_tag_name | 通過標(biāo)記名稱進(jìn)行定位 |
| find_element_by_class_name | find_elements_by_class_name | 通過類名稱進(jìn)行定位 |
| find_element_by_css_selector | find_elements_by_css_selector | 通過css選擇器進(jìn)行定位 |
更詳細(xì)定位方式可以參考:《史上最全!Selenium元素定位的30種方式》
頁面操作
1.表單填充
# 找到用戶名輸入用戶名
user = drive.find_element_by_name("LoginForm[username]")
user.send_keys(username)
# 找到密碼輸入密碼
pwd=drive.find_element_by_id("LoginForm_password")
pwd.send_keys(password)
# 點(diǎn)擊登錄按鈕實(shí)現(xiàn)登錄
drive.find_element_by_class_name("login_btn").click()
2.窗口句柄
簡單講,句柄就是瀏覽器上方每一個(gè)窗口欄的唯一標(biāo)識(shí)

#獲取當(dāng)前窗口所有句柄 handles = drive.window_handles #通過句柄 切換到第2個(gè)標(biāo)簽頁 drive.switch_to.window(handles[2]) """操作完成""" #關(guān)閉當(dāng)前窗口 driver.close() #通過句柄 切換到第1個(gè)標(biāo)簽頁 drive.switch_to.window(handles[0]) time.sleep(random.uniform(2,3))
3.url加載和獲取
#url加載 drive.get(url) # 獲取當(dāng)前頁面url并斷言 currentPageUrl = driver.current_url
4.cookie處理
- get_cookies:獲取cookie信息
- add_cookie:添加cookie信息
drive.get("http://www.baidu.com")
cookie = {'name':'foo','value':'bar'}
drive.add_cookie(cookie)
drive.get_cookies()
等待方式
現(xiàn)在很多網(wǎng)站采用 Ajax技術(shù)
無法確定網(wǎng)頁元素什么時(shí)候能被完全加載
所以網(wǎng)頁元素的選取比較困難
此時(shí)就需要設(shè)置等待(等待網(wǎng)頁加載完成)
selenium有兩種等待方式:
- 顯式等待
- 隱式等待
1.顯式等待
顯式等待是一種條件觸發(fā)式等待
直到設(shè)置的某一條件達(dá)成時(shí)才會(huì)繼續(xù)執(zhí)行
可以設(shè)置超時(shí)時(shí)間,如果超過超時(shí)時(shí)間元素依然沒被加載,就會(huì)拋出異常
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
drive = webdriver.Chrome()
url = 'http://www.baidu.com/'
drive.get(url)
try:
WebDriverWait(self.driver,10).until(EC.presence_of_element_located(By.ID,"LoginForm[username]")) #顯示等待
except:
print('%s頁面未找到元素'% loc)
以上代碼加載 'http://www.baidu.com/'頁面
并定位id為"LoginForm[username]"的元素
設(shè)置超時(shí)時(shí)間10秒,webDriverWait默認(rèn)會(huì)500ms檢測一下元素是否存在
selenium提供了一些內(nèi)置的用于顯示等待的方法,
位于expected_conditions類中,詳細(xì)見下表
| 內(nèi)置方法 | 功能 |
|---|---|
| title_is | 判斷當(dāng)前頁面的title是否等于預(yù)期內(nèi)容 |
| title_contains | 判斷當(dāng)前頁面的title是否包含預(yù)期字符串 |
| presence_of_element_located | 判斷某個(gè)元素是否被加到了dom樹里, 并不代表該元素一定可見 |
| presence_of_all_element_located | 判斷是否至少有1個(gè)元素存在于dom樹里 |
| visibility_of_element_located | 判斷某個(gè)元素是否可見 |
| visibility_of | 判斷某個(gè)元素是否可見 |
| invisibility_of_element_located | 判斷某個(gè)元素是否不存在于dom樹里或不可見 |
| text_to_be_present_in_element | 判斷元素中的text是否包含了預(yù)期的字符串 |
| text_to_be_present_in_element_value | 判斷元素中的value屬性是否包含了預(yù)期字符 |
| frame_to_be_available_and_switch_to_it | 判斷該frame是否可以切換進(jìn)去,如果可以, 返回True并切換進(jìn)去,否則返回False |
| element_to_be_clickable | 判斷某個(gè)元素是否可見并且是enable的 |
| staleness_of | 等待某個(gè)元素從dom樹中移除 |
| element_to_be_selected | 判斷某個(gè)元素是否被選中了,一般用于下拉列表 |
| element_located_to_be_selected | 判斷某個(gè)元素是否被選中了,一般用于下拉列表 |
| element_selection_state_to_be | 判斷某個(gè)元素的選中狀態(tài)是否符合預(yù)期 |
| element_located_selection_state_to_be | 判斷某個(gè)元素的選中狀態(tài)是否符合預(yù)期 |
| alert_is_present | 判斷頁面上是否存在alert框 |
2.隱式等待
隱式等待是在嘗試定位某個(gè)元素時(shí),如果沒能立刻發(fā)現(xiàn),就等待固定時(shí)長
類似于socket超時(shí),默認(rèn)設(shè)置是0秒,即相當(dāng)于最長等待時(shí)長
在瀏覽器界面直觀感受是:
等待直到網(wǎng)頁加載完成(地址欄這個(gè)地方不是× 變成如下)時(shí)繼續(xù)執(zhí)行,
網(wǎng)頁加載超過設(shè)置等待時(shí)長才報(bào)錯(cuò)

使用方法
from selenium import webdriver
drive = webdriver.Chrome()
url = 'http://www.baidu.com/'
#設(shè)置最大等待時(shí)長 10秒
drive.implicitly_wait(10)
drive.get(url)
user = drive.find_element_by_name("LoginForm[username]")
3.線程休眠
time.sleep(time)是比較常用的線程休眠方式
為了避免風(fēng)險(xiǎn),我個(gè)人比較喜歡隨機(jī)休眠
time.sleep(random.uniform(4,5))
擴(kuò)展程序加載
# 設(shè)置好應(yīng)用擴(kuò)展
chrome_options.add_extension(extension_path)
#添加下載路徑
#download.default_directory:設(shè)置下載路徑 profile.default_content_settings.popups:設(shè)置為 0 禁止彈出窗口
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory':tmp_path}
chrome_options.add_experimental_option('prefs', prefs)
到此這篇關(guān)于python 爬蟲之selenium可視化爬蟲的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)selenium可視化爬蟲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- selenium+python設(shè)置爬蟲代理IP的方法
- 詳解Selenium+PhantomJS+python簡單實(shí)現(xiàn)爬蟲的功能
- python爬蟲系列Selenium定向爬取虎撲籃球圖片詳解
- python爬蟲selenium和phantomJs使用方法解析
- python利用selenium進(jìn)行瀏覽器爬蟲
- 利用selenium爬蟲抓取數(shù)據(jù)的基礎(chǔ)教程
- Python3爬蟲中Selenium的用法詳解
- python爬蟲開發(fā)之selenium模塊詳細(xì)使用方法與實(shí)例全解
- python網(wǎng)絡(luò)爬蟲 Scrapy中selenium用法詳解
- Python selenium爬蟲實(shí)現(xiàn)定時(shí)任務(wù)過程解析
相關(guān)文章
基于Python+Matplotlib實(shí)現(xiàn)直方圖的繪制
Matplotlib是Python的繪圖庫,它能讓使用者很輕松地將數(shù)據(jù)圖形化,并且提供多樣化的輸出格式。本文將為大家介紹如何用matplotlib繪制直方圖,感興趣的朋友可以學(xué)習(xí)一下2022-04-04
Python實(shí)現(xiàn)基于二叉樹存儲(chǔ)結(jié)構(gòu)的堆排序算法示例
這篇文章主要介紹了Python實(shí)現(xiàn)基于二叉樹存儲(chǔ)結(jié)構(gòu)的堆排序算法,結(jié)合實(shí)例形式分析了Python二叉樹的定義、遍歷及堆排序算法相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12
python 高效去重復(fù) 支持GB級別大文件的示例代碼
今天小編就為大家分享一篇python 高效去重復(fù) 支持GB級別大文件的示例代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
Python數(shù)據(jù)類型相互轉(zhuǎn)換
當(dāng)涉及數(shù)據(jù)類型轉(zhuǎn)換時(shí),Python提供了多種內(nèi)置函數(shù)來執(zhí)行不同類型之間的轉(zhuǎn)換,本文主要介紹了Python數(shù)據(jù)類型相互轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
詳解Python中的__getitem__方法與slice對象的切片操作
Python中想要使類的實(shí)例像list一樣使用下標(biāo),可以用__getitem__方法,而配合slice對象則可以實(shí)現(xiàn)list一樣的切片,詳解Python中的__getitem__方法與slice對象的切片操作2016-06-06
Pandas庫中dataframe.corr()函數(shù)的使用
dataframe.corr()是Pandas庫中的一個(gè)函數(shù),用于計(jì)算DataFrame中各列之間的相關(guān)系數(shù),本文主要介紹了Pandas庫中dataframe.corr()函數(shù)的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
Python如何讀取txt文件,獲取指定行中指定位置數(shù)據(jù)
這篇文章主要介紹了Python如何讀取txt文件,獲取指定行中指定位置數(shù)據(jù),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03

