用Node寫頁面爬蟲的工具集

最近作了幾個寫爬蟲的小項目(從頁面端到APP端的都有),在網上搜尋了一番好用的爬蟲工具,作了個工具集整理:html

Puppeteer

簡介

Puppeteer是一個Node庫,它提供了一個高級 API 來經過 DevTools協議控制Chromium或Chrome。簡單點說,就是使用Node命令控制一個無需渲染至用戶界面的瀏覽器。
與使用PhantomJS搭配Python進行爬蟲抓取相似,其原理也是去徹底地模擬一個瀏覽器進行頁面的渲染,從而抓取其中某些特定的內容。git

特性

Puppeteer能夠完整地模擬一個瀏覽器的行爲,而且能夠進行截圖、攔截瀏覽器請求、獲取Cookie、經過Node注入JS代碼等操做,使用Chrome瀏覽器開發者工具能作到的,Puppeteer也能作到,能夠說是騷得一匹(誤
使用起來也十分的簡單,如下是官方的例子:github

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的代碼,歡迎查看:
github.com/SP-Lyu/pupp…api

因爲Puppeteer基於Chromium,每次都須要載入頁面再進行頁面分析,性能十分有限,下面提到的cheerio則能夠從另外一層面解決這個問題。瀏覽器

文檔

GitHub
中文API地址bash

cheerio

cheerio是一個輕型靈活,類jQuery的對HTML元素分析操做的工具。在進行一些server端渲染的頁面以及一些簡單的小頁面的爬取時,cheerio十分好用且高效。markdown

特性

cheerio包括了jQuery的核心子集,意味着能夠直接使用jQuery的API進行元素的操控,官方的例子:cookie

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>
複製代碼

本身寫的獲取某個網站的全部a連接:dom

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);
    });
})();
複製代碼

文檔

GitHubasync

Auto.js

國人開發的,使用js編寫代碼操做Android設備的自動化工具,對於爬取某些加固措施較好的APP來講十分有用,並且有很是完善的文檔以及社區,十分良心。
使用Auto.js進行設備自動化操做,再經過代理進行請求數據的獲取,能繞開加固中難以破解的加密串。

特性

做爲爬蟲工具,好處有:

  1. 採用JavaScript做爲腳本語言開發,JS開發者0成本接入;
  2. 兼容性良好,大多數任務不須要root權限;
  3. 自帶界面分析工具,方便定位須要操做的元素。

從Auto.js載入某個APP,並點擊進入某個頻道的例子:

// 聲明環境
auto();
// 設備常亮
device.keepScreenDim();
// 調起APP
launchApp('頭條');
sleep(10000);
// 找到某個頻道,並點擊進入
var rect = text('視頻').findOnce().bounds();
var x = rect.centerX();
var y = rect.centerY();
click(x, y);
// 點擊進入詳情,使用代理抓取並處理請求...
...
複製代碼

文檔

GitHub
中文文檔
社區

相關文章
相關標籤/搜索