如何用Node寫頁面爬蟲的工具集
最近做了幾個寫爬蟲的小項目(從頁面端到APP端的都有),在網(wǎng)上搜尋了一番好用的爬蟲工具,做了個工具集整理:
Puppeteer
簡介
Puppeteer 是一個Node庫,它提供了一個高級 API 來通過 DevTools協(xié)議控制Chromium或Chrome。簡單點說,就是使用Node命令控制一個無需渲染至用戶界面的瀏覽器。
與使用 PhantomJS 搭配 Python 進行爬蟲抓取類似,其原理也是去完全地模擬一個瀏覽器進行頁面的渲染,從而抓取其中某些特定的內(nèi)容。
特性
Puppeteer 可以完整地模擬一個瀏覽器的行為,并且可以進行截圖、攔截瀏覽器請求、獲取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,每次都需要載入頁面再進行頁面分析,性能十分有限,下面提到的 cheerio 則可以從另一層面解決這個問題。
文檔
cheerio
cheerio 是一個輕型靈活,類jQuery的對HTML元素分析操作的工具。在進行一些server端渲染的頁面以及一些簡單的小頁面的爬取時, cheerio 十分好用且高效。
特性
cheerio 包括了jQuery的核心子集,意味著可以直接使用jQuery的API進行元素的操控,官方的例子:
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進行設(shè)備自動化操作,再通過代理進行請求數(shù)據(jù)的獲取,能繞開加固中難以破解的加密串。
特性
作為爬蟲工具,好處有:
- 采用JavaScript作為腳本語言開發(fā),JS開發(fā)者0成本接入;
- 兼容性良好,大多數(shù)任務(wù)不需要root權(quán)限;
- 自帶界面分析工具,方便定位需要操作的元素。
從Auto.js載入某個APP,并點擊進入某個頻道的例子:
// 聲明環(huán)境
auto();
// 設(shè)備常亮
device.keepScreenDim();
// 調(diào)起APP
launchApp('頭條');
sleep(10000);
// 找到某個頻道,并點擊進入
var rect = text('視頻').findOnce().bounds();
var x = rect.centerX();
var y = rect.centerY();
click(x, y);
// 點擊進入詳情,使用代理抓取并處理請求...
...
文檔
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
手把手教你把nodejs部署到linux上跑出hello world
本篇文章主要介紹了手把手教你把nodejs部署到linux上跑出hello world,非常具有實用價值,需要的朋友可以參考下2017-06-06
node express如何實現(xiàn)json轉(zhuǎn)Excel
這篇文章主要介紹了node express如何實現(xiàn)json轉(zhuǎn)Excel問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08
node.js中的fs.createWriteStream方法使用說明
這篇文章主要介紹了node.js中的fs.createWriteStream方法使用說明,本文介紹了fs.createWriteStream方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下2014-12-12
Node發(fā)出HTTP POST請求的方法實例小結(jié)
這篇文章主要介紹了Node發(fā)出HTTP POST請求的方法,結(jié)合實例形式總結(jié)分析了三種常用的post請求操作方法,以及相關(guān)庫操作注意事項,需要的朋友可以參考下2023-05-05
創(chuàng)建簡單的node服務(wù)器實例(分享)
下面小編就為大家?guī)硪黄獎?chuàng)建簡單的node服務(wù)器實例(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
Node.js?操作本地文件及深入了解fs內(nèi)置模塊
這篇文章主要介紹了Node.js?操作本地文件及深入了解fs內(nèi)置模塊,node.js作為服務(wù)端應(yīng)用,肯定少不了對本地文件的操作,像創(chuàng)建一個目錄、創(chuàng)建一個文件、讀取文件內(nèi)容等都是我們開發(fā)中經(jīng)常需要用到的功能2022-09-09

