python 爬蟲之selenium可視化爬蟲的實現(xiàn)
之所以把selenium爬蟲稱之為可視化爬蟲
主要是相較于前面所提到的幾種網(wǎng)頁解析的爬蟲方式
selenium爬蟲主要是模擬人的點擊操作
selenium驅(qū)動瀏覽器并進行操作的過程是可以觀察到的
就類似于你在看著別人在幫你操縱你的電腦,類似于別人遠程使用你的電腦
當然了,selenium也有無界面模式
快速入門
selenium基本介紹:
selenium 是一套完整的web應用程序測試系統(tǒng),
包含了測試的錄制(selenium IDE),編寫及運行(Selenium Remote Control)
和測試的并行處理(Selenium Grid)。
Selenium的核心Selenium Core基于JsUnit,
完全由JavaScript編寫,因此可以用于任何支持JavaScript的瀏覽器上。
selenium可以模擬真實瀏覽器,自動化測試工具,支持多種瀏覽器,
爬蟲中主要用來解決JavaScript渲染問題。
用python寫爬蟲的時候,主要用的是selenium的Webdriver,
#安裝selenium庫 pip install selenium #安裝對應瀏覽器驅(qū)動 # 我們可以通過下面的方式先看看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是一個而基于WebKit的服務端JavaScript API, #支持Web而不需要瀏覽器支持, #其快速、原生支持各種Web標準:Dom處理,CSS選擇器,JSON等等。 #PhantomJS可以用用于頁面自動化、網(wǎng)絡監(jiān)測、網(wǎng)頁截屏,以及無界面測試
谷歌瀏覽器驅(qū)動下載地址
注意對應版本號,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)閉當前窗口 browser1.close()
元素定位
要想對頁面進行操作,首先要做的是選中頁面元素,
比較常見的八種元素定位方式,如下表
定位一個元素 | 定位多個元素 | 定位方式描述 |
---|---|---|
find_element_by_id | find_elements_by_id | 通過元素 id進行定位 |
find_element_by_name | find_elements_by_name | 通過元素 名稱進行定位 |
find_element_by_xpath | find_elements_by_xpath | 通過xpath路徑進行定位 |
find_element_by_link_text | find_elements_by_link_text | 通過完整超鏈接文本進行定位 |
find_element_by_partial_link_text | find_elements_by_partial_link_text | 通過部分超鏈接文本進行定位 |
find_element_by_tag_name | find_elements_by_tag_name | 通過標記名稱進行定位 |
find_element_by_class_name | find_elements_by_class_name | 通過類名稱進行定位 |
find_element_by_css_selector | find_elements_by_css_selector | 通過css選擇器進行定位 |
更詳細定位方式可以參考:《史上最全!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) # 點擊登錄按鈕實現(xiàn)登錄 drive.find_element_by_class_name("login_btn").click()
2.窗口句柄
簡單講,句柄就是瀏覽器上方每一個窗口欄的唯一標識
#獲取當前窗口所有句柄 handles = drive.window_handles #通過句柄 切換到第2個標簽頁 drive.switch_to.window(handles[2]) """操作完成""" #關(guān)閉當前窗口 driver.close() #通過句柄 切換到第1個標簽頁 drive.switch_to.window(handles[0]) time.sleep(random.uniform(2,3))
3.url加載和獲取
#url加載 drive.get(url) # 獲取當前頁面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)頁元素什么時候能被完全加載
所以網(wǎng)頁元素的選取比較困難
此時就需要設置等待(等待網(wǎng)頁加載完成)
selenium有兩種等待方式:
- 顯式等待
- 隱式等待
1.顯式等待
顯式等待是一種條件觸發(fā)式等待
直到設置的某一條件達成時才會繼續(xù)執(zhí)行
可以設置超時時間,如果超過超時時間元素依然沒被加載,就會拋出異常
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]"的元素
設置超時時間10秒,webDriverWait默認會500ms檢測一下元素是否存在
selenium提供了一些內(nèi)置的用于顯示等待的方法,
位于expected_conditions類中,詳細見下表
內(nèi)置方法 | 功能 |
---|---|
title_is | 判斷當前頁面的title是否等于預期內(nèi)容 |
title_contains | 判斷當前頁面的title是否包含預期字符串 |
presence_of_element_located | 判斷某個元素是否被加到了dom樹里, 并不代表該元素一定可見 |
presence_of_all_element_located | 判斷是否至少有1個元素存在于dom樹里 |
visibility_of_element_located | 判斷某個元素是否可見 |
visibility_of | 判斷某個元素是否可見 |
invisibility_of_element_located | 判斷某個元素是否不存在于dom樹里或不可見 |
text_to_be_present_in_element | 判斷元素中的text是否包含了預期的字符串 |
text_to_be_present_in_element_value | 判斷元素中的value屬性是否包含了預期字符 |
frame_to_be_available_and_switch_to_it | 判斷該frame是否可以切換進去,如果可以, 返回True并切換進去,否則返回False |
element_to_be_clickable | 判斷某個元素是否可見并且是enable的 |
staleness_of | 等待某個元素從dom樹中移除 |
element_to_be_selected | 判斷某個元素是否被選中了,一般用于下拉列表 |
element_located_to_be_selected | 判斷某個元素是否被選中了,一般用于下拉列表 |
element_selection_state_to_be | 判斷某個元素的選中狀態(tài)是否符合預期 |
element_located_selection_state_to_be | 判斷某個元素的選中狀態(tài)是否符合預期 |
alert_is_present | 判斷頁面上是否存在alert框 |
2.隱式等待
隱式等待是在嘗試定位某個元素時,如果沒能立刻發(fā)現(xiàn),就等待固定時長
類似于socket超時,默認設置是0秒,即相當于最長等待時長
在瀏覽器界面直觀感受是:
等待直到網(wǎng)頁加載完成(地址欄這個地方不是× 變成如下)時繼續(xù)執(zhí)行,
網(wǎng)頁加載超過設置等待時長才報錯
使用方法
from selenium import webdriver drive = webdriver.Chrome() url = 'http://www.baidu.com/' #設置最大等待時長 10秒 drive.implicitly_wait(10) drive.get(url) user = drive.find_element_by_name("LoginForm[username]")
3.線程休眠
time.sleep(time)是比較常用的線程休眠方式
為了避免風險,我個人比較喜歡隨機休眠
time.sleep(random.uniform(4,5))
擴展程序加載
# 設置好應用擴展 chrome_options.add_extension(extension_path) #添加下載路徑 #download.default_directory:設置下載路徑 profile.default_content_settings.popups:設置為 0 禁止彈出窗口 prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory':tmp_path} chrome_options.add_experimental_option('prefs', prefs)
到此這篇關(guān)于python 爬蟲之selenium可視化爬蟲的實現(xiàn)的文章就介紹到這了,更多相關(guān)selenium可視化爬蟲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- selenium+python設置爬蟲代理IP的方法
- 詳解Selenium+PhantomJS+python簡單實現(xiàn)爬蟲的功能
- python爬蟲系列Selenium定向爬取虎撲籃球圖片詳解
- python爬蟲selenium和phantomJs使用方法解析
- python利用selenium進行瀏覽器爬蟲
- 利用selenium爬蟲抓取數(shù)據(jù)的基礎教程
- Python3爬蟲中Selenium的用法詳解
- python爬蟲開發(fā)之selenium模塊詳細使用方法與實例全解
- python網(wǎng)絡爬蟲 Scrapy中selenium用法詳解
- Python selenium爬蟲實現(xiàn)定時任務過程解析
相關(guān)文章
python開發(fā)之字符串string操作方法實例詳解
這篇文章主要介紹了python開發(fā)之字符串string操作方法,以實例形式較為詳細的分析了Python針對字符串的轉(zhuǎn)義、連接、換行、輸出等操作技巧,需要的朋友可以參考下2015-11-11Python基于scapy實現(xiàn)修改IP發(fā)送請求的方法示例
這篇文章主要介紹了Python基于scapy實現(xiàn)修改IP發(fā)送請求的方法,涉及Python網(wǎng)絡編程中使用scapy操作IP的相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2017-07-07opencv-python+yolov3實現(xiàn)目標檢測
因為最近的任務有用到目標檢測,快速地了解了目標檢測這一任務,并且實現(xiàn)了使用opencv進行目標檢測。感興趣的可以了解一下2021-06-06Python統(tǒng)計一個字符串中每個字符出現(xiàn)了多少次的方法【字符串轉(zhuǎn)換為列表再統(tǒng)計】
這篇文章主要介紹了Python統(tǒng)計一個字符串中每個字符出現(xiàn)了多少次的方法,涉及Python字符串轉(zhuǎn)換及列表遍歷、統(tǒng)計等相關(guān)操作技巧,需要的朋友可以參考下2019-05-05使用Tensorflow實現(xiàn)可視化中間層和卷積層
今天小編就為大家分享一篇使用Tensorflow實現(xiàn)可視化中間層和卷積層,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01