如何用Node寫頁面爬蟲的工具集
最近做了幾個寫爬蟲的小項目(從頁面端到APP端的都有),在網(wǎng)上搜尋了一番好用的爬蟲工具,做了個工具集整理:
Puppeteer
簡介
Puppeteer 是一個Node庫,它提供了一個高級 API 來通過 DevTools協(xié)議控制Chromium或Chrome。簡單點說,就是使用Node命令控制一個無需渲染至用戶界面的瀏覽器。
與使用 PhantomJS 搭配 Python 進(jìn)行爬蟲抓取類似,其原理也是去完全地模擬一個瀏覽器進(jìn)行頁面的渲染,從而抓取其中某些特定的內(nèi)容。
特性
Puppeteer 可以完整地模擬一個瀏覽器的行為,并且可以進(jìn)行截圖、攔截瀏覽器請求、獲取Cookie、通過Node注入JS代碼等操作,使用Chrome瀏覽器開發(fā)者工具能做到的,Puppeteer也能做到。
使用起來也十分的簡單,以下是官方的例子:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://example.com'); await page.screenshot({path: 'example.png'}); await browser.close(); })();
在GitHub上放了一份自己寫的使用Puppeteer獲取微博cookie的代碼,歡迎查看:
https://github.com/SP-Lyu/puppeteer_weibo_cookie/blob/master/index.js
由于 Puppeteer 基于Chromium,每次都需要載入頁面再進(jìn)行頁面分析,性能十分有限,下面提到的 cheerio 則可以從另一層面解決這個問題。
文檔
cheerio
cheerio 是一個輕型靈活,類jQuery的對HTML元素分析操作的工具。在進(jìn)行一些server端渲染的頁面以及一些簡單的小頁面的爬取時, cheerio 十分好用且高效。
特性
cheerio 包括了jQuery的核心子集,意味著可以直接使用jQuery的API進(jìn)行元素的操控,官方的例子:
const cheerio = require('cheerio') const $ = cheerio.load('<h2 class="title">Hello world</h2>') $('h2.title').text('Hello there!') $('h2').addClass('welcome') $.html() //=> <h2 class="title welcome">Hello there!</h2>
自己寫的獲取某個網(wǎng)站的所有a鏈接:
const cheerio = require('cheerio'); const get = function(){/*HTTP get請求...*/} (async ()=>{ const html = await get(`http://example.com`); const $ = cheerio.load(html); const $dom_arr = $('a'); $dom_arr.each((index, elem)=>{ const url = $(elem).attr('href') || ''; console.log(url); }); })();
文檔
Auto.js
國人開發(fā)的,使用js編寫代碼操作Android設(shè)備的自動化工具,對于爬取某些加固措施較好的APP來說十分有用,而且有非常完善的文檔以及社區(qū),十分良心。
使用Auto.js進(jìn)行設(shè)備自動化操作,再通過代理進(jìn)行請求數(shù)據(jù)的獲取,能繞開加固中難以破解的加密串。
特性
作為爬蟲工具,好處有:
- 采用JavaScript作為腳本語言開發(fā),JS開發(fā)者0成本接入;
- 兼容性良好,大多數(shù)任務(wù)不需要root權(quán)限;
- 自帶界面分析工具,方便定位需要操作的元素。
從Auto.js載入某個APP,并點擊進(jìn)入某個頻道的例子:
// 聲明環(huán)境 auto(); // 設(shè)備常亮 device.keepScreenDim(); // 調(diào)起APP launchApp('頭條'); sleep(10000); // 找到某個頻道,并點擊進(jìn)入 var rect = text('視頻').findOnce().bounds(); var x = rect.centerX(); var y = rect.centerY(); click(x, y); // 點擊進(jìn)入詳情,使用代理抓取并處理請求... ...
文檔
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
NodeJS?基于?Dapr?構(gòu)建云原生微服務(wù)應(yīng)用快速入門教程
Dapr?是一個可移植的、事件驅(qū)動的運(yùn)行時,它使任何開發(fā)人員能夠輕松構(gòu)建出彈性的、無狀態(tài)和有狀態(tài)的應(yīng)用程序,并可運(yùn)行在云平臺或邊緣計算中,它同時也支持多種編程語言和開發(fā)框架,本文重點介紹NodeJS云原生微服務(wù)應(yīng)用,感興趣的朋友一起看看吧2022-07-07Node?文件查找優(yōu)先級及?Require?方法文件查找策略
這篇文章主要介紹了Node文件查找優(yōu)先級及Require方法文件查找策略。文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09Windows下Node.js安裝及環(huán)境配置方法
這篇文章主要為大家介紹一下Node.js安裝及環(huán)境配置方法,這也是腳本之家小編發(fā)現(xiàn)的比較詳細(xì)的教程了,從安裝到配置都很詳細(xì),想學(xué)習(xí)Node.js的朋友可以參考一下2017-09-09Nest.js系列學(xué)習(xí)之初識nest項目框架及服務(wù)
這篇文章主要為大家介紹了Nest.js系列學(xué)習(xí)之初識nest項目框架及服務(wù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02如何在node環(huán)境實現(xiàn)“get數(shù)據(jù)解析”代碼實例
這篇文章主要介紹了如何在node環(huán)境實現(xiàn)“get數(shù)據(jù)解析”代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07使用基于Node.js的構(gòu)建工具Grunt來發(fā)布ASP.NET MVC項目
這篇文章主要介紹了使用基于Node.js的構(gòu)建工具Grunt來發(fā)布ASP.NET MVC項目的教程,自動化構(gòu)建工具Grunt具有編譯壓縮單元測試等功能,十分強(qiáng)大,需要的朋友可以參考下2016-02-02