javascript - هل يمكنني استخدام jQuery مع Node.js؟




(12)

زاحف بسيط باستخدام Cheerio

هذه هي الصيغة الخاصة بي لجعل زاحف بسيط في Node.js. هذا هو السبب الرئيسي للرغبة في القيام بتلاعب DOM على جانب الخادم وربما كان السبب في وصولك إلى هنا.

أولاً ، استخدم request تنزيل الصفحة ليتم تحليلها. عند اكتمال التنزيل ، قم بالتعامل مع cheerio وبدء معالجة DOM مثل استخدام jQuery.

مثال العمل:

var
    request = require('request'),
    cheerio = require('cheerio');

function parse(url) {
    request(url, function (error, response, body) {
        var
            $ = cheerio.load(body);

        $('.question-summary .question-hyperlink').each(function () {
            console.info($(this).text());
        });
    })
}

parse('http://stackoverflow.com/');

سوف يطبع هذا المثال إلى وحدة التحكم كافة الأسئلة الرئيسية التي تظهر على صفحة SO الرئيسية. هذا هو السبب في أنني أحب Node.js ومجتمعها. لا يمكن أن يكون أسهل من ذلك :-)

تثبيت الاعتماديات:

npm طلب تثبيت cheerio

وتشغيل (على افتراض أن البرنامج النصي أعلاه موجود في ملف crawler.js ):

العقدة crawler.js

التشفير

تحتوي بعض الصفحات على محتوى بخلاف اللغة الإنجليزية في تشفير معين ، وستحتاج إلى فك ترميزه إلى UTF-8 . على سبيل المثال ، من المرجح أن يتم ترميز صفحة باللغة البرتغالية البرازيلية (أو أي لغة أخرى ذات أصل لاتيني) في ISO-8859-1 (ويعرف أيضًا باسم "latin1"). عند الحاجة إلى فك التشفير ، أقول request عدم تفسير المحتوى بأي شكل من الأشكال وبدلا من ذلك استخدام iconv-lite للقيام بهذه المهمة.

مثال العمل:

var
    request = require('request'),
    iconv = require('iconv-lite'),
    cheerio = require('cheerio');

var
    PAGE_ENCODING = 'utf-8'; // change to match page encoding

function parse(url) {
    request({
        url: url,
        encoding: null  // do not interpret content yet
    }, function (error, response, body) {
        var
            $ = cheerio.load(iconv.decode(body, PAGE_ENCODING));

        $('.question-summary .question-hyperlink').each(function () {
            console.info($(this).text());
        });
    })
}

parse('http://stackoverflow.com/');

قبل تشغيل ، قم بتثبيت التبعيات:

طلب تثبيت npm iconv-lite cheerio

ثم أخيرا:

العقدة crawler.js

بعد الروابط

الخطوة التالية هي اتباع الروابط. لنفترض أنك تريد إدراج جميع الملصقات من كل سؤال في SO. يجب عليك أولاً سرد جميع الأسئلة الرئيسية (المثال أعلاه) ثم إدخال كل رابط ، تحليل صفحة كل سؤال للحصول على قائمة بالمستخدمين المشاركين.

عندما تبدأ باتباع الارتباطات ، يمكن أن تبدأ الجحيم رد الاتصال . لتجنب ذلك ، يجب عليك استخدام نوع من الوعود والعقود الآجلة أو أيا كان. أنا دائما تبقي async في بلدي toolbelt. لذلك ، إليك مثال كامل على برنامج الزاحف باستخدام async:

var
    url = require('url'),
    request = require('request'),
    async = require('async'),
    cheerio = require('cheerio');

var
    baseUrl = 'http://stackoverflow.com/';

// Gets a page and returns a callback with a $ object
function getPage(url, parseFn) {
    request({
        url: url
    }, function (error, response, body) {
        parseFn(cheerio.load(body))
    });
}

getPage(baseUrl, function ($) {
    var
        questions;

    // Get list of questions
    questions = $('.question-summary .question-hyperlink').map(function () {
        return {
            title: $(this).text(),
            url: url.resolve(baseUrl, $(this).attr('href'))
        };
    }).get().slice(0, 5); // limit to the top 5 questions

    // For each question
    async.map(questions, function (question, questionDone) {

        getPage(question.url, function ($$) {

            // Get list of users
            question.users = $$('.post-signature .user-details a').map(function () {
                return $$(this).text();
            }).get();

            questionDone(null, question);
        });

    }, function (err, questionsWithPosters) {

        // This function is called by async when all questions have been parsed

        questionsWithPosters.forEach(function (question) {

            // Prints each question along with its user list
            console.info(question.title);
            question.users.forEach(function (user) {
                console.info('\t%s', user);
            });
        });
    });
});

قبل التشغيل:

npm تثبيت طلب متزامن cheerio

قم بإجراء اختبار:

العقدة crawler.js

إخراج العينة:

Is it possible to pause a Docker image build?
    conradk
    Thomasleveil
PHP Image Crop Issue
    Elyor
    Houston Molinar
Add two object in rails
    user1670773
    Makoto
    max
Asymmetric encryption discrepancy - Android vs Java
    Cookie Monster
    Wand Maker
Objective-C: Adding 10 seconds to timer in SpriteKit
    Christian K Rider

وهذا هو الأساس الذي يجب أن تعرفه لبدء صنع برامج الزحف الخاصة بك :-)

المكتبات المستخدمة

  • request
  • iconv-lite
  • cheerio
  • async

هل من الممكن استخدام jQuery selectors / DOM التلاعب على جانب الخادم باستخدام Node.js؟


أعتقد أن الإجابة على هذا هي الآن نعم.
https://github.com/tmpvar/jsdom

var navigator = { userAgent: "node-js" };  
var jQuery = require("./node-jquery").jQueryInit(window, navigator);

باستخدام jsdom يمكنك الآن. ما عليك سوى الاطلاع على مثال مسجها في دليل الأمثلة.


بديل هو استخدام Underscore.js . يجب أن توفر ما كنت قد ترغب في جانب الخادم من JQuery.


في عام 2016 الأمور هي أسهل طريقة. تثبيت jquery إلى node.js باستخدام وحدة التحكم الخاصة بك:

npm install jquery

ربط المتغير $ (على سبيل المثال - أنا معتاد على ذلك) في رمز node.js الخاص بك:

var $ = require("jquery");

افعل اشياء:

$.ajax({
    url: 'gimme_json.php',
    dataType: 'json',
    method: 'GET',
    data: { "now" : true }
});

يعمل أيضا لالجرعة كما هو مبني على node.js.


في وقت كتابة هذا المقال ، يوجد أيضًا " Cheerio .

تنفيذ سريع ، مرن ، وعجاف لـ jQuery الأساسي المصمم خصيصًا للخادم.


ليس هذا ما أعلمه عن. DOM هو شيء جانب العميل (jQuery لا يقوم بتحليل HTML ، ولكن DOM).

فيما يلي بعض المشاريع Node.js الحالية:

http://wiki.github.com/ry/node

و djangode djangode هو بارد جدا لعنة ...


نعم ، يمكنك استخدام مكتبة أنشأتها تسمى nodeQuery https://github.com/tblobaum/nodeQuery

var Express = require('express')
    , dnode = require('dnode')
    , nQuery = require('nodeQuery')
    , express = Express.createServer();

var app = function ($) {
    $.on('ready', function () {
        // do some stuff to the dom in real-time
        $('body').append('Hello World');
        $('body').append('<input type="text" />');
        $('input').live('click', function () {
            console.log('input clicked');
            // ...
        });
    });
};

nQuery
    .use(app);

express
    .use(nQuery.middleware)
    .use(Express.static(__dirname + '/public'))
    .listen(3000);

dnode(nQuery.middleware).listen(express);

يجب أن تحصل على الإطار باستخدام واجهة برمجة تطبيقات JSDOM الجديدة.

const jsdom = require("jsdom");
const { window } = new jsdom.JSDOM(`...`);
var $ = require("jquery")(window);

يمكن تثبيت وحدة jQuery باستخدام:

npm install jquery

مثال:

var $ = require('jquery');
var http = require('http');

var options = {
    host: 'jquery.com',
    port: 80,
    path: '/'
};

var html = '';
http.get(options, function(res) {
res.on('data', function(data) {
    // collect the data chunks to the variable named "html"
    html += data;
}).on('end', function() {
    // the whole of webpage data has been collected. parsing time!
    var title = $(html).find('title').text();
    console.log(title);
 });
});

مراجع jQuery في Node.js **:


npm install jquery --save #note ALL LOWERCASE

npm install jsdom --save

const jsdom = require("jsdom");
const dom = new jsdom.JSDOM(`<!DOCTYPE html>`);
var $ = require("jquery")(dom.window);


$.getJSON('https://api.github.com/users/nhambayi',function(data) {
  console.log(data);
});

تحديث : (أواخر 2013) استلم فريق jQuery الرسمي إدارة حزمة jquery على npm:

npm install jquery

ثم:

require("jsdom").env("", function(err, window) {
    if (err) {
        console.error(err);
        return;
    }

    var $ = require("jquery")(window);
});




node.js