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)用程序測(cè)試系統(tǒng),
包含了測(cè)試的錄制(selenium IDE),編寫及運(yùn)行(Selenium Remote Control)
和測(cè)試的并行處理(Selenium Grid)。
Selenium的核心Selenium Core基于JsUnit,
完全由JavaScript編寫,因此可以用于任何支持JavaScript的瀏覽器上。
selenium可以模擬真實(shí)瀏覽器,自動(dòng)化測(cè)試工具,支持多種瀏覽器,
爬蟲中主要用來解決JavaScript渲染問題。
用python寫爬蟲的時(shí)候,主要用的是selenium的Webdriver,
#安裝selenium庫 pip install selenium #安裝對(duì)應(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)測(cè)、網(wǎng)頁截屏,以及無界面測(cè)試
谷歌瀏覽器驅(qū)動(dòng)下載地址
注意對(duì)應(yīng)版本號(hào),chrome地址欄輸入chrome://version/ 查看自己的Chrome版本
我使用的是anaconda 下載好后丟入anaconda3\Scripts文件夾下就可以了
如果是其他ide如:pycharm、VScode但加載的還是anaconda的集成python,依然可以這么操作
簡單測(cè)試
from selenium import webdriver # #聲明瀏覽器對(duì)象 browser1 = webdriver.Chrome() browser2 = webdriver.Firefox() # #訪問頁面 browser1.get("http://www.baidu.com") print(browser1.page_source) #關(guān)閉當(dāng)前窗口 browser1.close()
元素定位
要想對(duì)頁面進(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檢測(cè)一下元素是否存在
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)容請(qǐng)搜索腳本之家以前的文章或繼續(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開發(fā)之字符串string操作方法實(shí)例詳解
這篇文章主要介紹了python開發(fā)之字符串string操作方法,以實(shí)例形式較為詳細(xì)的分析了Python針對(duì)字符串的轉(zhuǎn)義、連接、換行、輸出等操作技巧,需要的朋友可以參考下2015-11-11Python基于scapy實(shí)現(xiàn)修改IP發(fā)送請(qǐng)求的方法示例
這篇文章主要介紹了Python基于scapy實(shí)現(xiàn)修改IP發(fā)送請(qǐng)求的方法,涉及Python網(wǎng)絡(luò)編程中使用scapy操作IP的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-07-07opencv-python+yolov3實(shí)現(xiàn)目標(biāo)檢測(cè)
因?yàn)樽罱娜蝿?wù)有用到目標(biāo)檢測(cè),快速地了解了目標(biāo)檢測(cè)這一任務(wù),并且實(shí)現(xiàn)了使用opencv進(jìn)行目標(biāo)檢測(cè)。感興趣的可以了解一下2021-06-06Python統(tǒng)計(jì)一個(gè)字符串中每個(gè)字符出現(xiàn)了多少次的方法【字符串轉(zhuǎn)換為列表再統(tǒng)計(jì)】
這篇文章主要介紹了Python統(tǒng)計(jì)一個(gè)字符串中每個(gè)字符出現(xiàn)了多少次的方法,涉及Python字符串轉(zhuǎn)換及列表遍歷、統(tǒng)計(jì)等相關(guān)操作技巧,需要的朋友可以參考下2019-05-05python實(shí)現(xiàn)柵欄加解密 支持密鑰加密
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)柵欄加解密,支持密鑰加密,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03使用Tensorflow實(shí)現(xiàn)可視化中間層和卷積層
今天小編就為大家分享一篇使用Tensorflow實(shí)現(xiàn)可視化中間層和卷積層,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01