爬蟲應用示例--puppeteer數據抓取的實現方法

一、背景

軟件機器人自動化(RPA)技術近兩年來應用越來越廣泛,市面上也有比較多成熟的RPA產品。

利用puppeteer實現的RPA,可以實現遠程數據自動抓取的爬蟲應用功能。

二、需求描述

在一個指定的遠程網站上,通過RPA輸入查詢條件執行查詢后顯示出結果清單,獲取這個清單中的數據后執行翻頁,直至取到全部數據為止。

三、實現思路

Puppeteer 是一個node庫,內含了一個chrome瀏覽器(正是因為包含了這個導致安裝非常麻煩),以及一組用來操縱Chrome的API。因此基于Puppeteer實現RPA就非常簡單了,有了RPA我們就可以模擬手工操作進行遠程數據的自動抓取,而這恰恰就是網絡爬蟲要實現的功能。

實現以上思路的基本流程為:
1、打開內含的chrome瀏覽器
2、進入指定的網站
3、找到條件輸入框,輸入查詢條件(查詢條件包括input、select,所以識別和處理方式并不相同)
4、點擊查詢按鈕,執行查詢,結果以分頁方式顯示
5、取到第一頁的全部數據
6、檢測是否有下一頁數據,如果有則點擊下一頁的按鈕
7、重復5、6兩步直至結果的所有頁面都獲取完畢
8、多獲取到的數據進行后續加工處理

四、代碼示例

import puppeteer from 'puppeteer'? ? //引入puppeteer組件
。。。。。。
puppeteer.launch({啟動參數}).then(async browser => {
? ? let page = await browser.newPage();? ? ? //在chrome中打開一個標簽頁
? ? await page.setJavaScriptEnabled(true);? ?
? ? ?await page.goto("遠程網絡地址");? ? ? ? ?//在該標簽頁上打開指定網址,如www.baidu.com
? ? ?let?companyName = await page.$("#aa");? ? //輸入條件是一個input,id="aa"
? ? ? await companyName.focus();? ? ? ? ??
? ? ??await page.keyboard.type("華為");? ? ?//在該input中輸入查詢條件,如"華為"
? ? ??await page.waitFor('#bb');? ? ? ? ? ? ? //輸入條件是一個select,id="bb"
? ? ? await page.select('#bb','11');? ? ? ? ? //select的列表中有一個選擇項value=11,自動選擇value=11的選擇項作為該輸入條件的值
? ? ??let btnSearch = await page.$("#cc");? ? //執行查詢的按鈕是一個button,id="cc"
? ? ? await btnSearch.click();? ? ? ? ? ? ? ? ? ? ?//自動點擊該按鈕,觸發該按鈕的click事件
? ? ? ?let btnNext = {} ;? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//下面開始處理結果集合
? ? ? ?do{? ? ? ? ??
? ? ? ? ? ?await page.waitFor('#table1');? ? ?//結果結合顯示在一個table中,其id="table1"
? ? ? ? ? ?let data1 = await page.$$eval('# table1 tr', tds => tds.map((tr) => {
? ? ? ? ? ? ? ? ?return tr.innerText.split('\t');
? ? ? ? ? ? }));? ? ? //當前頁得所有數據都保存在data1中, data1是一個二維數組,data1[i]存儲每一行數據,data1[i][j]存放第1行得第j列數據。
? ? ? ? ? ?btnNext = await page.$eval("#btnNext",obj => obj.href);? ?//下一頁放在一個id=btnNext的a中,這個功能是獲取下一頁這個超鏈的跳轉地址,如果還有下一頁則結果就是跳轉地址,如果沒有下一頁,則返回空
? ? ? ? ? ??if(btnNext){? ? ? ? ? ? ? ? ?//有下一頁的處理
? ? ? ? ? ? ? ? ?btnNext = await page.$("#btnNext");? ?
? ? ? ? ? ? ? ? ?await btnNext.click();? ? ? ? ? // 自動點擊下一頁的a,觸發該a的click事件
? ? ? ? ? ? ?};
? ? ? ? ? } while(btnNext) ;
? ? ? ?。。。。。處理采集的數據
? ? ? ?await browser.close();? ? //關閉瀏覽器
});

五、后續

以上實現思路好理解,具體實現代碼是個難點,不過通過上面的代碼示例就可以輕松解決這個難點。

遺留的另外一個難點就是puppeteer組件的安裝問題,具體另文再詳細講解。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容