用rpa必须会用python语言_几步教你用 Python 制作一个 RPA 机器人!
那么我們能不能通過機器去自動完成這些固定流程且繁瑣的工作呢?答案是肯定的。現階段,我們可以通過引入 RPA 來實現整個流程的打通。
什么是 RPA
RPA 是機器人流程自動化的簡稱,聽起來很高大上的名字,實際上本質就是自動化,讓機器幫人去做一些流程固定的事情,機器可以 7* 24小時不停轉的完成工作。但是人最多只能 996,畢竟還是要睡覺的,不能剝削的太狠。
RPA 工具選型
RPA 其實出現的時間不短,但是在國內興起也就最近幾年的事情,成熟的產品并不多,例如阿里云的RPA、國外的uiPath 等等,但是這些工具對于平臺依賴性較大,他們只能部署在Windows 操作系統上,而我們希望部署在Linux 服務器上,在命令行模式下運行,這樣可以節省資源。
基于此,我們決定通過 Python 來實現自動化,由于我們所需要對接的系統大部分都不會給我們提供現成的 API 接口,我們一開始通過 requests 來模擬登錄獲取coookies 進行請求,但是這個過程中發現很多頁面都是異步加載數據,而 requests 是同步的,無法獲取數據,且內部系統做了非常嚴格的認證鑒權,僅僅靠 requests、Beautiful Soup 等是搞不定這些鑒權的。因此我們需要一些工具來實現模擬瀏覽器請求爬取數據,對比了目前比較流行的幾款開源的自動化工具:
Selenium:老牌自動化測試工具,優點是支持大部分主流瀏覽器,它提供了功能豐富的API接口,且支持瀏覽器無頭模式,但是缺點也很明顯,比如速度太慢、對版本配置要求嚴苛,最麻煩是經常要更新對應的驅動,每次瀏覽器升級都需要去重新安裝 Chromedriver。
Puppeteer Puppeteer:是一個 Node 庫,它提供了高級 API 來通過 DevTools 協議控制 Chrome 或 Chromium,簡單理解成我們日常使用的 Chrome 的無界面版本,可以使用 js 接口進行進行操控。意味凡是 Chrome 瀏覽器能干的事情,Puppeteer 都能出色的完成。
RPAfor Python:這個是我們最開始使用的一款 RPA 工具,它可以很好的滿足我們的需求,且操作也比較簡單, 通過 Xpath 定位元素就可以對 DOM 進行操作,但是其與 Selenium 有著相同的缺點即速度慢,且不支持瀏覽器無頭模式運行,也就是說它需要一個桌面環境,對資源消耗較大,尤其是 Chromium 這種吃內存較大的程序。而我們希望將其部署到 Linux 服務器上去,所以 Rap for Python 也就無法滿足需求了。
經過對比,最終我們選擇了 Puppeteer 的 Python 版本 Pyppeteer 來作為 RPA 工具
Pyppeteer 是什么
Puppeteer(中文翻譯”木偶”) 是 Google Chrome 團隊官方的無界面(Headless)Chrome 工具,它是一個 Node庫,提供了一個高級的 API 來控制 DevTools協議上的無頭版 Chrome 。也可以配置為使用完整(非無頭)的 Chrome。它非常適合前端開發者進行自動化測試,而我們除了使用這個自動化工具,還有一些其他功能是基于 Python 來開發的,比如使用pandas 處理表格,做數據分析,所以我們選擇了一個社區維護的 Pyppeteer ,他的功能幾乎和 Puppeteer 一樣,所以即使是去看 Puppeteer 的文檔也沒多大問題。
puppeteer 可以做很多事情,簡單來說你可以在瀏覽器中手動完成的大部分事情都可以使用Puppeteer完成!例如:
生成頁面的截圖和PDF。
抓取SPA并生成預先呈現的內容(即“SSR”)。
從網站抓取你需要的內容。
自動表單提交,UI測試,鍵盤輸入等
創建一個最新的自動化測試環境。使用最新的Java和瀏覽器功能,直接在最新版本的Chrome中運行測試。
捕獲您的網站的時間線跟蹤,以幫助診斷性能問題。
開始使用 Pyppeteer
1.無頭模式配置
在打開瀏覽器的時候,我們需要設定一些參數,如果你需要它跑在容器里面或純字符模式的 Linux 中,則 headless 參數必須設置為 true,同時 args 中的參數也要加上,它主要是關閉Chrome 一些沒有必要的功能,例如擴展、flash、音頻和gpu等,以達到節省資源的目的,executablePath 可以指定瀏覽器的目錄,默認 Pyppeteer 會自動去執行 Pyppeteer-install 來下載 Chromium,在國內下載極其慢,建議提前安裝好 Chromium。
參數含義
2.異步編碼
由于 Pyppeteer 是異步的因此在 Python 中 需要使用async def 來增加方法。
3.注入cookie
在一些場合,我們需要與 requests 進行結合,因為整體上 requets 的效率和實現相對比較容易些,可以在必要的時候調用 Pyppeteer 喚起瀏覽器,因此可以通過設置cookie 來讓 Pyppeteer 登錄某個頁面
4.阻塞
在一些場景,我們需要進行阻塞,比如說頁面加載中,但是程序執行的很快,可能還沒加載完就執行其他語句了,這樣就拿不到想要的數據,這個時候可以使用page.waitFor 讓頁面進行等待,不要去使用 time.sleep
一些頁面要善于使用 Page.waitFor。因為有些click 事件程序觸發過短會無法喚起
一些頁面要善于使用 Page.waitFor。因為有些click 事件程序觸發過短會無法喚起
5.定位元素
在獲取頁面某個標簽內的元素是比較常用的方法,可以通過querySelector 先定位到元素,然后通過 page.evaluate 執行js 原生方法來拿到標簽內的文本
6.截圖
有時候我們需要對頁面的某一段元素進行截圖,我們可以使用page.J 先定位到元素,然后調用 screenshot 進行截圖
截圖的時候需要設置瀏覽器的分辨率
7.快速查找元素
很多時候我們不能通過 id、 class 來定位頁面元素的具體路徑,可以借助 Chrome 的開發者工具,對元素進行定位,快速的找到元素,而 Pyppeteer 提供了多種方式查找元素,如選擇器、xpath
例如:
8.Page.waitFor
page.waitFor(selectorOrFunctionOrTimeout[, options[, …args]]) 下面三個的綜合 API
page.waitForFunction(pageFunction[, options[, …args]]) 等待 pageFunction 執行完成之后
page.waitForNavigation(options) 等待頁面基本元素加載完之后,比如同步的 HTML, CSS, JS 等代碼
page.waitForSelector(selector[, options]) 等待某個選擇器的元素加載之后,這個元素可以是異步加載的。
9.使用工具自動生成代碼
如果你對編寫這種枯燥乏味的元素定位感到厭煩,不妨試試Chrome 的插件 Puppeteer recorder ,他可以錄制你的頁面操作,當然很多時候并不是很準,但是通過它來輔助開發,可以大大提升你的開發效率。
10.執行程序
由于是異步的,因此我們需要通過異步的方式來調用,同時使用 loop的create_task 方法獲取回調拿到返回值。
11.無頭模式下的調試
在我們爬取一些網站時候發現在正常有Headless 的情況下可以得到最終的效果,但是在無頭模式下會拿不到元素,提示超時。報類似 下面這樣的超時錯誤。
這種情況下我們可以通過上面說的截圖的方式進行Debug,看下當前報錯的頁面是否與實際頁面一致,建議配置上 User-Agent。因為某些情況下系統會把頁面當成移動端來訪問,導致獲取到的頁面元素與實際不一致。
12.pypuppet 整合 requests
很多時候,一些系統都會提供接口,如果我們能夠直接請求這些接口,效率會更高,但是內部系統會使用非常嚴格的校驗,普通的登錄方式是走不通的。不過 pypuppet 可以幫我們繞過鑒權限制,并拿到對應系統的cookies。
當我們拿到 cookies 后我們就可以通過 requests 模擬 HTTP 請求了,這樣在一些非異步加載的頁面下可以直接爬取接口,節省了大量的時間和精力。
這里可以把緩存信息寫到 Redis 中去,設置下過期時間,這樣只需要在首次進行登錄,后面直接讀取cookies 進行請求,與此同時,一些網站的請求頭中加了一些自定義的頭,如果缺少這些頭,則無法進行請求,這時候,我們可以通過page.on 來攔截請求或響應信息,例如抓取特定的url,拿到對應的 headers 將其進行緩存,然后讀取 headers 信息放到請求頭中去,完美的繞過鑒權。
13.服務器環境依賴
我們是將其部署在虛擬機上,由于單位提供的鏡像非常精簡,如果想讓程序能夠在無頭模式下運行,只需要安裝 Xvfb 即可,Xvfb是一個實現了X11顯示服務協議的顯示服務器。不同于其他顯示服務器,Xvfb在內存中執行所有的圖形操作,不需要借助任何顯示設備。執行下面的命令即可安裝:
然后默認centos 的源中是沒有 Chromium 的,需要安裝 epel-release 然后執行:
接著就可以部署到服務端運行了。
不過需要注意了,如果你的服務器沒有安裝中文字體。Chromium 中會顯示方塊字。這個時候只需要安裝上對應的中文字體就行
案例演示
下面是一個使用 pyppeteer 登錄某網站,我們可以看到這個網站需要輸入手機號、密碼還有
那么我們怎么使用 Pyppeteer 開完成呢?
定義一個函數用戶打開網站,輸入用戶名和密碼以及驗證碼 page.type 中的元素地址,我們可以參考上面快速查找元素部分來通過chrome 開發者模式調試獲取元素路徑,我們可以看到這個網站他的id 為 userLoginCode 的 input 有2個,但是他們的name 是不一樣的,所以我們可以這樣去選擇。
下面是這個登錄函數的代碼:
通過上述方式我們登錄成功后,就可以拿到cookies。并可以通過定義一個 Session,然后去請求啦。
好了,以上就是關于使用Python 制作 RPA 機器人的分享。
總結
以上是生活随笔為你收集整理的用rpa必须会用python语言_几步教你用 Python 制作一个 RPA 机器人!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab氢原子杂化轨道,原子及分子轨
- 下一篇: echarts图表入门级教程(An in