利用node.js做個簡單的網路蜘蛛(Web Spider)

5 / 14, 2013 node.js

我看過許多網路蜘蛛(Web Spider,又稱「網路機器人」),通常是用PHP、Python、Ruby等等程式寫成,但是卻沒有人想到node.js可以撰寫網頁蜘蛛,而且效果很好,所以我利用非同步(Asynchronous)I/O提供一個快速,穩定、簡單的node.js網絡蜘蛛,在這裡,我將會制作一個網路蜘蛛,並希望你能有所得益,甚至以此為本編程你自己的網路蜘蛛。
此篇文章翻譯自Create a simple web spider in node.js,且已經取得授權,如果有翻譯不好,歡迎修正


web-spider
網頁蜘蛛一個在網路上找到的網站並記錄、收錄內容的程式,是個長期運作的程式,找到並收錄後,我們可以藉由收尋這些網路蜘蛛爬行所得收錄的記錄,來找到我們要的資訊,這就是一個非常基本的網路蜘蛛。
首先,我們需要一個收尋連結的「基礎網站」,並把在這網站找到的記錄輸入進資料庫,在來從這個網站依循網站中的連結慢慢往外找尋收錄。
以下是我們要用到的模組,這些模組可以協助我們完成網路蜘蛛的程式
1.request (幫助我們找尋網站)
2.cheerio (協助解碼)
3.Mysql (收錄找到的紀錄)
4.async (輔助的函式庫)
以下則是程式碼:

  • Runie

    @s3131212:disqus 你好!
    我最近想做一個網路蜘蛛,找到此網站有簡易的架設
    但是我照作者的程式瑪以及環境去設定,但是跑出

    C:Usersuserspider test>node main.js

    Crawling “交換連結 | 電腦故我在" | http://s3131212.com/links/

    TypeError: Object 0 has no method ‘replace’
    at Object.SqlString.format (C:Usersnode_modulesmysqllibprotocolSqlStri
    ng.js:70:14)
    at Connection.format (C:Usersnode_modulesmysqllibConnection.js:208:20)
    at Connection.query (C:Usersnode_modulesmysqllibConnection.js:163:20)
    at C:Usersnode_modulesasynclibasync.js:227:13
    at C:Usersnode_modulesasynclibasync.js:111:13
    at _each (C:Usersnode_modulesasynclibasync.js:35:13)
    at async.each (C:Usersnode_modulesasynclibasync.js:110:9)
    at _asyncMap (C:Usersnode_modulesasynclibasync.js:226:9)
    at Object.map (C:Usersnode_modulesasynclibasync.js:204:23)
    at getInfo (C:Usersuserspider testcrawler.js:50:9)

    此錯誤,請問是我哪邊環境沒設定到嗎?

    • s3131212

      看來是Mysql模組有些問題,你試著把Mysql重新安裝看看

      • Runie

        模組跟資料庫都重灌過了,還是一樣會跑出這個形態錯誤

        • s3131212

          那很抱歉我不太清楚囉….

  • Did you use Google Translate as a guide? Some sentence’s tune is strange. I think “在這裡,我要創造一個自己的網路蜘蛛,並歡迎你創建自己的網路蜘蛛。” should be translated to “我將會制作一個網路蜘蛛,並希望你能有所得益,甚至以此為本編程你自己的網路蜘蛛。”. (Typing Chinese is a disaster.)

    • s3131212

      基本上這篇文章我還是自己翻為主,除了一些部分(如你舉例的部份)可能因為我看不懂或看的懂但是不知道如何用中文表達,才參考了一下Google翻譯。
      註:請問你是用何種方式打中文的(注音?手寫?倉頡?)

      • Actually I used my phone to type the chinese characters in.

        • s3131212

          打中文很快就會習慣了啦~