از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
با Express و Cheerio یک API Web-Scraped بسازید. رشد وب جهانی در چند دهه اخیر منجر به جمعآوری حجم عظیمی از دادهها و جمعآوری آنها در صفحات وب در سراسر اینترنت شده است. نتیجه این تولید و توزیع هذلولی محتوا روی وب درمان گسترده ای است…
سرفصلهای مطلب
رشد وب جهانی در طول چند دهه اخیر منجر به جمع آوری حجم عظیمی از داده ها و جمع آوری اطلاعات در صفحات وب در سراسر اینترنت شده است. نتیجه این تولید و توزیع هذلولی محتوا روی وب گردآوری حجم وسیعی از اطلاعات است که در صورت استخراج و جمعآوری مؤثر آن میتوان به روشهای متعددی از آن استفاده کرد.
رایج ترین روش های جمع آوری و تجمیع داده های موجود روی وب هستند (1) آن را از یک API با فناوری هایی مانند باقی مانده یا صابون و (2) برای نوشتن برنامه ای برای تجزیه یا خراش دادن آن از داده های با ساختار ضعیف، مانند HTML. روش اول تا حد زیادی روش ارجح برای برنامه نویسی است که اطلاعات را مصرف می کند، اما به دلیل زمان توسعه و منابع مورد نیاز این امکان وجود ندارد. روی سمت تولید کننده بنابراین، اغلب تنها ابزار موجود برای دستیابی به داده های ارزشمند، خراش دادن آن است.
این مقاله قصد دارد تکنیکی را برای ساخت یک برنامه مستقل Node.js ارائه دهد که دادههای مالیاتی را برای ایالت نبراسکا جمعآوری میکند (خراش میکند) و یا آن اطلاعات را به کاربر ارائه میدهد یا بر اساس مالیات محاسبه میکند. روی یک شهر و مقدار عرضه شده
فناوری های مورد استفاده عبارتند از:
- Node.js: یک زمان اجرا جاوا اسکریپت ساخته شده است روی موتور V8 کروم
- Express: یک چارچوب وب Node.js
- Cheerio: یک کتابخانه تجزیه HTML که منعکس کننده چیزهای آشناست
jQuery
کتابخانه API
کد منبع را می توان یافت روی GitHub اینجا.
راه اندازی پروژه پایه
این آموزش از Node Package Manager (npm) برای راه اندازی اولیه پروژه، نصب کتابخانه ها و مدیریت وابستگی ها استفاده می کند. قبل از شروع، مطمئن شوید که npm را برای محیط خود پیکربندی کرده اید.
پروژه را با پذیرش گزینه های پیش فرض اولیه راه اندازی کنید:
نصب وابستگی ها:
ساختار اصلی پروژه:
بیان
استفاده خواهیم کرد بیان برای ساختن API RESTful ما برای برنامه محاسبه مالیات. Express یک چارچوب برنامه کاربردی وب برای برنامههای Node است که هم از این نظر انعطافپذیر است که محدودیتهای کمی در روش توسعه برنامههای شما اعمال میکند، اما بسیار قدرتمند است زیرا چندین ویژگی مفید را ارائه میدهد که در بسیاری از برنامههای کاربردی وب استفاده میشوند.
راه اندازی اکسپرس
که در server.js
، تعدادی کد راه اندازی اکسپرس دیگ بخار را اضافه می کنیم که برنامه اکسپرس را ایجاد می کند، سپس ماژول مسیرهایی را که در بخش فرعی بعدی می سازیم ثبت می کنیم. در پایان فایل، به اپلیکیشن Express دستور می دهیم که به پورت ارائه شده یا 3500 که یک پورت هاردکد است گوش دهد.
که در server.js
در کد زیر کپی و پیست کنید:
'use strict';
const express = require('express');
const app = express();
const port = process.env.PORT || 3500;
const routes = require('./api/routes');
routes(app);
app.listen(port);
console.log("Node application running روی port " + port);
مسیرها
ما مسیریابی را در برنامه خود راه اندازی می کنیم تا به درخواست های ارائه شده به مسیرهای URI خاص و معنی دار پاسخ دهیم. ممکن است بپرسید منظور من از معنی دار چیست؟ خوب در پارادایم REST مسیرهای مسیر به گونه ای طراحی شده اند که منابع درون برنامه را به روش های خود توصیفی نشان دهند.
در فایل routes/index.js کد زیر را کپی و پیست کنید:
'use strict';
const taxCtrl = require('../controllers');
module.exports = (app) => {
app.use(('/calculate/:stateName/:cityName/:amount', '/taxrate/:stateName/:cityName'), (req, res, next) => {
const state = req.params.stateName;
if (!taxCtrl.stateUrls.hasOwnProperty(state.toLowerCase())) {
res.status(404)
.send({message: `No state info found for ${state}`});
} else {
next();
}
});
app.route('/taxrate/:stateName/:cityName')
.get(taxCtrl.getTaxRate);
app.route('/calculate/:stateName/:cityName/:amount')
.get(taxCtrl.calculateTaxes);
app.use((req, res) => {
res.status(404)
.send({url: `sorry friend, but url ${req.originalUrl} is not found`});
});
}
دو مسیری که در این ماژول تعریف می شود عبارتند از /taxrate/:stateName/:cityName
و /calculate/:stateName/:cityName/:amount
. آنها با ثبت نام هستند app
شی که از server.js
اسکریپتی که در بالا با فراخوانی متد route توضیح داده شد روی را app
. در روش route مسیر مشخص می شود و سپس get
روش نامیده می شود، یا زنجیره ای، روی نتیجه فراخوانی مسیر درون متد chained get یک تابع callback وجود دارد که در بخش بیشتر به آن خواهیم پرداخت روی کنترل کننده ها این روش برای تعریف مسیرها به «زنجیرهسازی مسیر» معروف است.
اولین مسیر یک نقطه پایانی را توصیف می کند که نرخ مالیات ایالتی و شهری را در پاسخ به درخواست GET مربوط به نشان می دهد. :stateName
و :cityName
، به ترتیب. در Express شما آنچه را که به عنوان «پارامترهای مسیر» شناخته میشود، با قرار دادن قسمتی از مسیر که بین اسلشهای رو به جلو با دو نقطه مشخص شده است، مشخص میکنید تا یک مکان نگهدار برای پارامتر مسیر معنیدار مشخص شود. مسیر دوم /calculate/:stateName/:cityName/:amount نقطه پایانی را توصیف می کند که مبالغ مالیات شهر و ایالت و همچنین مبلغ کل را محاسبه می کند روی پارامتر مقدار مسیر
دو فراخوان دیگر از app
شی در حال مشخص کردن میان افزار هستند. میانافزار Express.js یک ویژگی فوقالعاده مفید است که دارای برنامههای کاربردی بسیاری است که به راحتی میتوانند مجموعه مقالات خود را تضمین کنند، بنابراین، در اینجا به عمق زیاد نخواهم پرداخت. فقط بدانید که میان افزارها توابعی هستند که می توانند hook به درخواست، پاسخ، خطا، و اشیاء بعدی یک چرخه درخواست-پاسخ سریع، دسترسی داشته باشید و تغییر دهید.
شما یک تابع میان افزار را با فراخوانی ثبت می کنید use
روش روی را app
شی و عبور در ترکیبات منحصر به فرد مسیرها و توابع برگشت به تماس. اولین میان افزار اعلام شد روی شی برنامه دو نشانی وب ما را در یک آرایه و یک تابع پاسخ به تماس را مشخص می کند که بررسی می کند آیا وضعیتی که برای درخواست اطلاعات مالیاتی منتقل می شود در دسترس است یا خیر.
این برنامه آزمایشی فقط برای پاسخ به درخواستهای شهرهای نبراسکا توسعه مییابد، اما با توجه به اینکه یک وب استاتیک در دسترس عموم دارد، کسی میتواند به راحتی آن را با سایر ایالتها گسترش دهد. page از اطلاعات مشابه میانافزار دوم بهعنوان همه مسیرهای URL درخواستی که مشخص نشدهاند، عمل میکند.
کنترل کننده ها
کنترلرها بخشی از برنامه اکسپرس هستند که درخواست های واقعی ارسال شده به مسیرهای تعریف شده را رسیدگی می کند و پاسخی را برمی گرداند. به طور دقیق، کنترلرها برای توسعه برنامه های Express الزامی نیستند. یک تابع تماس، ناشناس یا غیره، می تواند مورد استفاده قرار گیرد، اما استفاده از کنترلرها منجر به سازماندهی بهتر کد و جداسازی نگرانی ها می شود. همانطور که گفته شد، ما از کنترلرها استفاده خواهیم کرد، زیرا همیشه دنبال کردن بهترین شیوه ها ایده خوبی است.
در فایل controllers/index.js کد زیر را کپی و پیست کنید.
'use strict';
const svc = require('../services');
const getTaxRate = (req, res) => {
const state = req.params.stateName;
svc.scrapeTaxRates(state, stateUrls(state.toLowerCase()), (rates) => {
const rate = rates.find(rate => {
return rate.city.toLowerCase() === req.params.cityName.toLowerCase();
});
res.send(rate);
});
}
const calculateTaxes = (req, res) => {
const state = req.params.stateName;
svc.scrapeTaxRates(state, stateUrls(state.toLowerCase()), (rates) => {
const rate = rates.find(rate => {
return rate.city.toLowerCase() === req.params.cityName.toLowerCase();
});
res.send(rate.calculateTax(parseFloat(req.params.amount)));
});
}
const stateUrls = {
nebraska: 'http://www.revenue.nebraska.gov/question/sales.html';
};
module.exports = {
getTaxRate,
calculateTaxes,
stateUrls
};
اولین چیزی که در ماژول کنترلرها وارد و اعلام می شود، یک ثابت فراخوانی است svc
که مخفف «خدمت» است. این شیء سرویس به عنوان یک قابلیت قابل استفاده مجدد برای درخواست یک وب عمل می کند page و HTML حاصل را تجزیه کنید. در بخش بیشتر به عمق خواهم پرداخت روی Cheerio و خدمات روی چی شده روی در پشت صحنه با این شی سرویس، اما در حال حاضر فقط بدانید که HTML را برای بیت های معنی دار مورد علاقه ما (یعنی نرخ مالیات) تجزیه می کند.
دو عملکردی که بیشتر به آنها علاقه مندیم عبارتند از getTaxRate
و calculateTaxes
. هر دو تابع در درخواست و پاسخ ارسال می شوند (req
و res
) اشیاء از طریق route.get(...)
روش ها در ماژول مسیرها را getTaxRate
تابع به stateName
پارامتر route از شی params شی درخواست.
نام ایالت و URL هدف مربوطه آن (در این مورد فقط نبراسکا و صفحه وب دولتی آن که اطلاعات مشمول مالیات را نمایش می دهد) به روش شیء سرویس منتقل می شود. scrapeTaxRates
. یک تابع تماس به عنوان پارامتر سوم برای فیلتر کردن و پاسخگویی با اطلاعات شهر مربوط به آن ارسال می شود cityName
پارامتر موجود در مسیر مسیر
عملکرد کنترل کننده دوم، calculateTaxes
، دوباره از روش سرویس استفاده می کند scrapeTaxRates
برای درخواست و تجزیه HTML، اما این بار مالیات ها را از طریق روشی در داخل محاسبه می کند TaxRate
کلاس، که در ادامه در بخش به آن خواهیم پرداخت روی مدل ها.
مدل ها
شبیه به کنترلرها، مدل ها چیزی نیستند که به شدت برای یک برنامه Express مورد نیاز باشند. با این حال، زمانی که میخواهیم دادهها (وضعیت) و رفتار (عملکردها) را در برنامههایمان بهصورت سازمانیافته محصور کنیم، مدلها کاملاً مفید هستند.
در فایل models/index.js کد زیر را کپی و پیست کنید:
'use strict'
class TaxRate {
constructor(state, city, localRate, stateRate) {
this.state = state;
this.city = city;
this.localRate = localRate;
this.stateRate = stateRate;
}
calculateTax (subTotal) {
const localTax = this.localRate * subTotal;
const stateTax = this.stateRate * subTotal;
const total = subTotal + localTax + stateTax;
return {
localTax,
stateTax,
total
};
}
}
module.exports = TaxRate;
تنها مدلی (یا به درستی بیان شده: class) که در برنامه خود تعریف خواهیم کرد این است TaxRate
. TaxRate
شامل فیلدهای عضو برای نگهداری داده ها است روی ایالت، شهر، نرخ مالیات محلی و نرخ مالیات ایالتی. اینها فیلدهای کلاس هستند که وضعیت شی را تشکیل می دهند. فقط یک روش کلاس وجود دارد، calculateTax(...)
، که پارامتری را می گیرد که نشان دهنده مقدار فرعی ارسال شده به مسیر است /calculate/:stateName/:cityName/:amount مسیر و یک شی را نشان می دهد که مقادیر مالیات محاسبه شده و مبلغ کل نهایی را نشان می دهد.
Cheerio
Cheerio یک کتابخانه جاوا اسکریپت سبک وزن است که پیاده سازی می کند jQuery
هسته برای دسترسی، انتخاب و جستجوی HTML در برنامه های سمت سرور. در مورد ما، ما از Cheerio برای تجزیه HTML در صفحه وب ثابتی که از وبسایت دولت نبراسکا درخواست میکنیم که اطلاعات مالیاتی را نمایش میدهد، استفاده میکنیم.
خدمات
در برنامه کوچک خود ما از یک ماژول خدمات سفارشی برای پیاده سازی درخواست HTML استفاده خواهیم کرد page از وب سایت دولت نبراسکا و همچنین تجزیه HTML حاصل برای استخراج داده های مورد نظر ما.
در فایل services/index.js کد زیر را کپی و پیست کنید:
'use strict';
const http = require('http');
const cheerio = require('cheerio');
const TaxRate = require('../models');
const scrapeTaxRates = (state, url, cb) => {
http.get(url, (res) => {
let html = '';
res.روی('data', chunk => {
html += chunk;
});
res.روی('end', () => {
const parser = new Parser(state);
const rates = parser.parse(html);
cb(rates);
});
});
};
class Parser {
constructor(state) {
this.state = state;
}
parse(html) {
switch(this.state.toLowerCase()) {
case 'nebraska':
return this.parseNebraska(html);
default:
return null;
}
}
parseNebraska(html) {
const $ = cheerio.load(html);
let rates = ();
$('tr').each((idx, el) => {
const cells = $(el).children('td');
if (cells.length === 5 && !$(el).attr('bgcolor')) {
const rawData = {
city: $(cells(0)).first().text(),
cityRate: $(cells(1)).first().text(),
totalRate: $(cells(2)).first().text()
};
rawData.cityRate = parseFloat(rawData.cityRate.replace('%', ''))/100;
rawData.totalRate = parseFloat(rawData.totalRate.substr(0, rawData.totalRate.indexOf('%')))/100;
rawData.stateRate = rawData.totalRate - rawData.cityRate;
rates.push(new TaxRate('Nebraska', rawData.city, rawData.cityRate, rawData.stateRate));
}
});
return rates;
}
}
module.exports = {
scrapeTaxRates;
};
سه خط اول در حال وارد کردن (از طریق require()
) برخی از اشیاء سطح ماژول http
، cheerio
، و TaxRate
. TaxRate
در بخش قبل توضیح داده شد روی ماژولها را در نظر نگیریم تا اسب مرده ضرب المثل را شکست ندهیم و استفاده از آن را با جزئیات زیاد بررسی نکنیم، بنابراین کافی است بگوییم که برای ذخیره دادههای نرخ مالیات و محاسبه مالیات استفاده میشود.
را http
شی یک ماژول Node است که برای درخواست از سرور به منبع شبکه ای دیگر استفاده می شود، که در مورد ما صفحه وب نرخ مالیات از دولت نبراسکا است. مورد باقی مانده Cheerio است که برای تجزیه HTML با استفاده از آشنا استفاده می شود jQuery
API.
ماژول خدمات تنها یک تابع در دسترس عموم به نام را نشان می دهد scrapeTaxRates
، که یک رشته نام ایالت، رشته URL (برای ایالت page نمایش نرخ مالیات)، و یک تابع تماس به process نرخ های مالیات به روش های منحصر به فرد مشخص شده توسط کد مشتری تماس گیرنده.
درون بدنه scrapeTaxRates
تابع get
روش به http
شی برای درخواست صفحه وب در URL مشخص شده فراخوانی می شود. تابع callback به http.get(...)
روش پردازش پاسخ را مدیریت می کند. در پردازش پاسخ، یک رشته از HTML ساخته شده و در متغیری به نام ذخیره می شود html
. این کار به صورت افزایشی انجام می شود data
رویداد فعال می شود و یک تکه داده بافر شده از پاسخ بازگردانده می شود.
با شلیک از end
یک تابع تماس نهایی فراخوانی می شود. در داخل این پاسخ تماس Parser
کلاس نمونه سازی می شود و متد تجزیه فراخوانی می شود تا HTML را تجزیه کند و اطلاعات خاص ساختار و طرح صفحه وب نبراسکا را استخراج کند. داده های تجزیه شده در یک سری از بارگذاری می شوند TaxRate
اشیاء در یک آرایه ذخیره می شوند و به تابع callback ارسال می شوند تا منطق مشخص شده در کد کلاینت فراخوانی را اجرا کنند (در مورد ما، در توابع کنترلر که قبلا توضیح داده شد). در این آخرین مرحله است که داده ها سریال می شوند و به عنوان پاسخ به تماس گیرنده REST API ارسال می شوند.
نتیجه
در این مقاله کوتاه، روش طراحی یک برنامه کاربردی Node.js سبک وزن را بررسی کردیم که اطلاعات مفید نرخ مالیات را از یک وب سایت دولتی حذف می کند، که می تواند برای برنامه های تجارت الکترونیک مفید باشد. دو هدف اصلی برنامه جمع آوری نرخ های مالیات و نمایش آن اطلاعات برای یک شهر خاص یا محاسبه مالیات بر اساس روی یک ایالت، شهر و کل فرعی.
به عنوان مثال، در زیر تصاویری از برنامه را مشاهده خواهید کرد که مالیات شهر اوماها را نشان می دهد و مالیات را برای مجموع 1000 دلار محاسبه می کند. به منظور تست این برنامه cd
به درون root دایرکتوری و تایپ کنید $ node server.js
به درون console. پیامی را مشاهده خواهید کرد که می گوید: «برنامه Node در حال اجرا است روی پورت 3500 اینچ
امیدوارم این مقاله الهام بخش شما باشد تا دنیای خراش دادن داده ها را بیشتر بررسی کنید تا بتوانید برنامه های کاربردی مفید و محصولات داده معنی دار ایجاد کنید. مثل همیشه، من از همه نظرات زیر استقبال می کنم.
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-27 12:11:05