مقالات آموزشی
استخراج قیمت سهام تسلا با استفاده از Node.js و Puppeteer
استخراج قیمت سهام تسلا با استفاده از Node.js و Puppeteer
در این آموزش، قصد دارم به شما نشان دهم که چگونه میتوانید آخرین قیمت سهام تسلا (Tesla) را با استفاده از Node.js و Puppeteer استخراج (Scrape) کنید.
پس بیایید شروع کنیم!
اول از همه، باید Puppeteer را نصب کنید. برای این کار از دستور زیر استفاده کنید:
npm i puppeteer
اگر هنوز
npm
،
package.json
، و
node_modules
را تنظیم نکردهاید، میتوانید از این آموزش استفاده کنید.
بعد از نصب Puppeteer، یک فایل JavaScript جدید ایجاد کنید و در خط اول، Puppeteer را فراخوانی کنید:
const puppeteer = require('puppeteer');
سپس یک تابع async ایجاد کنید که در آن کد اصلی ما نوشته خواهد شد:
const puppeteer = require('puppeteer');
async function start() {
}
start();
حالا آمادهایم تا استخراج دادهها را شروع کنیم.
ابتدا باید یک نمونه جدید از مرورگر (Browser) ایجاد کنید و URLای که قرار است اسکراپر به آن مراجعه کند را تعریف کنید:
const puppeteer = require('puppeteer');
async function start() {
const url = 'https://finance.yahoo.com/quote/TSLA?p=TSLA&.tsrc=fin-srch';
const browser = await puppeteer.launch({
headless: false
});
}
در این مرحله، باید یک صفحه جدید در مرورگر باز کنید و به URL تعریف شده بروید:
const puppeteer = require('puppeteer');
async function start() {
const url = 'https://finance.yahoo.com/quote/TSLA?p=TSLA&.tsrc=fin-srch';
const browser = await puppeteer.launch({
headless: false
});
const page = await browser.newPage();
await page.goto(url);
}
برای این مرحله، باید به این لینک بروید، روی قیمت فعلی سهام راستکلیک کنید و گزینه Inspect را انتخاب کنید:
یک پنجره در سمت راست صفحه شما ظاهر میشود. باید عنصر مربوط به قیمت سهام را پیدا کنید:
بعد از پیدا کردن عنصر، روی آن راستکلیک کرده و گزینه “Copy full Xpath” را انتخاب کنید. این کار به ما کمک میکند تا به عنصر قیمت سهام دسترسی پیدا کنیم.
بعد از کپی کردن Xpath، این سه خط کد را به تابع خود اضافه کنید:
var element = await page.waitForXPath("Xpath عنصر قیمت سهام را اینجا قرار دهید")
var price = await page.evaluate(element => element.textContent, element);
console.log(price);
تابع
page.waitForXPath()
عنصر قیمت سهام را پیدا میکند. سپس، تابع
page.evaluate
محتوای متنی عنصر را استخراج کرده و با استفاده از
console.log()
آن را چاپ میکند.
در این مرحله، کد شما باید چیزی شبیه به این باشد:
const puppeteer = require('puppeteer');
async function start() {
const url = 'https://finance.yahoo.com/quote/TSLA?p=TSLA&.tsrc=fin-srch';
const browser = await puppeteer.launch({
headless: false
});
const page = await browser.newPage();
await page.goto(url);
var element = await page.waitForXPath("/html/body/div[1]/div/div/div[1]/div/div[2]/div/div/div[5]/div/div/div/div[3]/div[1]/div[1]/span[1]")
var price = await page.evaluate(element => element.textContent, element);
console.log(price);
}
start()
اگر کد فعلی را اجرا کنید، متوجه خواهید شد که هنگام مراجعه به URL، یک پاپآپ ظاهر میشود:
برای حل این مشکل، این دو خط کد را قبل از تعریف متغیر `element` اضافه کنید:
var accept = ("#consent-page > div > div > div > form > div.wizard-body > div.actions.couple > button");
await page.click(accept)
این کد دکمه “Accept All” را پیدا کرده و روی آن کلیک میکند تا پاپآپ بسته شود.
حالا شما یک تابع کاربردی دارید که به URL تعریف شده مراجعه میکند، آخرین قیمت سهام تسلا را استخراج میکند و آن را در ترمینال چاپ میکند.
برای پیشرفت بیشتر، میتوانید این کدها را در یک حلقه `for` قرار دهید:
for(var k = 1; k < 2000; k++){
var element = await page.waitForXPath("/html/body/div[1]/div/div/div[1]/div/div[2]/div/div/div[5]/div/div/div/div[3]/div[1]/div[1]/span[1]")
var price = await page.evaluate(element => element.textContent, element);
console.log(price);
await page.waitForTimeout(1000);
}
تابع
page.waitForTimeout(1000)
باعث میشود که برنامه قبل از تکرار حلقه، 1000 میلیثانیه (1 ثانیه) صبر کند.
و در نهایت،
add a browser.close()
را بعد از حلقه `for` اضافه کنید تا مرورگر بسته شود و اجرای کد به پایان برسد:
const puppeteer = require('puppeteer');
async function start() {
const url = 'https://finance.yahoo.com/quote/TSLA?p=TSLA&.tsrc=fin-srch';
const browser = await puppeteer.launch({
headless: false
});
const page = await browser.newPage();
await page.goto(url);
var accept = ("#consent-page > div > div > div > form > div.wizard-body > div.actions.couple > button");
await page.click(accept);
for(var k = 1; k < 2000; k++){
var element = await page.waitForXPath("/html/body/div[1]/div/div/div[1]/div/div[2]/div/div/div[5]/div/div/div/div[3]/div[1]/div[1]/span[1]");
var price = await page.evaluate(element => element.textContent, element);
console.log(price);
await page.waitForTimeout(1000);
}
browser.close();
}
start();
این مقاله همچنین اینجا منتشر شده است.

