iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 3
4
Software Development

爬蟲始終來自於墮性系列 第 3

工欲善其事,必先利其器(下)

測試工具

Postman

postman 絕對是最好用的測試工具之一,除了可以記錄我們傳送過的內容,也能便利的直接 bulk edit 我們要傳送的參數,可以直接從 chrome 複製參數,然後完全無縫的貼上使用。

使用 postman,我們可以非常容易的模擬傳送各種 request,在製作 request 的時候,重點會放在四件事情上面:

  1. method
  2. Url
  3. header
  4. data(query params or post data)

模擬 request

模擬 request

當傳送 request 成功後,我們除了要觀察這個 request 的回傳結果外,我們也必須觀察這個 request 回傳的 header 和 cookie。另外,我們也能選用不同的顯示方式,讓我們在觀察的時候更加直覺。

產生程式碼

產生程式碼

除此之外,postman 也能自動產生 request 程式碼,幫助我們在實作過程中更加快速。這個功能很方便沒錯,但千萬記得一點,你看不懂的程式碼,請弄懂後再使用。


實作工具

這次主題都會以 node.js 來實作,所以在實作前必須先具備一些條件:

  • node.js 基本知識
  • npm 基本知識
  • 非同步、callback、promise

在 node.js 有著強大的 npm 作為後盾,所以我們在實作過程中,會直接使用適合的套件。

Request

https://www.npmjs.com/package/request
在模擬 request 的部分,我們會使用 request 來作為實作的套件。request 他有著許多可以客製化的設定,除此之外,postman 也是以 request 當作預設的程式碼所使用的套件。

var request = require('request');
var options = { 
  method: 'GET',
  url: 'https://ithelp.ithome.com.tw/search',
  qs: { search: '爬蟲', tab: 'question' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

Cookie

在實作過程中,很多的網站會使用 cookie,所以我們也會需要在傳送 request 的時候有處理 cookie 的方式。

var request = require('request').defaults({jar: true});
// 讓預設的 request 開啟 cookie

Cheerio

https://www.npmjs.com/package/cheerio
當我們收到 response 的時候,會使用 cheerio 來當作 dom 操作的工具。cheerio 是使用類 jQuery 的方式來解析網頁物件,所以當我們在選擇要抓取的資料時,可以用類似 jQuery 的 selector 來選擇我們要的 dom。

var request = require('request');
var options = { method: 'GET',
  url: 'https://ithelp.ithome.com.tw/search',
  qs: { search: '爬蟲', tab: 'question' } };

request(options, function (error, response, body) {
  if (error) throw new Error(error);
  var $ = cheerio.load(body);
  //
  // 現在你可以使用像是 jQuery 的 selector 去選擇資料
  //
});

Async

https://caolan.github.io/async/
在爬蟲抓取資料的過程當中,可能會是一個很大量且攏長的過程,我們若使用同步的寫法,那麼會大幅增加執行的時間,所以在一些抓取伺服器允許的狀況下,我們會使用非同步的方法,在這邊我們會使用 async 這個套件當作我們的流程管理工具,它提供了許多方便的函式,讓我們能更便利的控制執行順序。

在 async 所提供的函式裡面,我們常用的有:

  • parallel, series
    最一般的流程控制,可以全部同時執行,也能單一順序執行。
  • parallelLimit
    可以全部執行,並且限定同時最多跑幾個

Nightmare.js

https://github.com/segmentio/nightmare
當我們遇到透過 js 所渲染畫面的網站時,最原始的方法就是去解析他的 js 程式碼,但如此一來會耗費太多精力。我們可以透過高階的 browser 自動化工具來取得 js 執行後的結果,在這邊我們會使用 nightmare.js 這個套件來實作,他可以很輕易的模擬人工在網頁的操作流程。

Puppeteer.js - 感謝 Wolke 補充

https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md
跟上面 nightmare.js 一樣是 high-level browser animation,是由 chrome 自家提供 Node API 的 headless Chrome,想必在支援上肯定會跟 chrome 更加 match。不過我自己還沒實用過,所以也感謝 Wolke 推坑,這次就以 Puppetter 來實作過程。

ps. Puppeteer 還有提供 playground https://try-puppeteer.appspot.com/


上一篇
工欲善其事,必先利其器(上)
下一篇
小插曲 #1 - chrome v62 踩中地雷QQ
系列文
爬蟲始終來自於墮性34

1 則留言

2
Wolke
iT邦新手 3 級 ‧ 2017-12-06 11:18:43

Async
可以用 Promise取代了吧

沒提到 https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md

Howard iT邦新手 5 級‧ 2017-12-06 11:50:56 檢舉

當然都可以用 Promise 全部自己來,但額外的一些機制就要自己做了,例如 limit,我本意是想透過一些糖衣,讓上手變簡單點。

High-level browser animation tool solution 其實挺多的,不過我倒是沒用過 puppeteer,感謝推坑!

don 應該是 dom 才對
謝謝原 po 的文章~

Howard iT邦新手 5 級‧ 2017-12-18 18:07:13 檢舉

其實是因為我有個朋友叫做 don ....
難怪常常 typo

我要留言

立即登入留言