1import { Actor } from 'apify';
2import { chromium } from 'playwright';
3
4await Actor.init();
5
6const tickers = [
7 "TCS:NSE", "RVNL:NSE", "IRFC:NSE", "ANGELONE:NSE",
8 "NIFTY_50:INDEXNSE", "NIFTY_BANK:INDEXNSE"
9];
10
11const browser = await chromium.launch();
12const page = await browser.newPage();
13
14try {
15 let iteration = 0;
16 const maxIterations = 100;
17
18 while (iteration < maxIterations) {
19 for (const ticker of tickers) {
20 const url = `https://www.google.com/finance/quote/${ticker}`;
21 try {
22 await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000 });
23
24 let price;
25 try {
26
27 price = await page.$eval('div.YMlKec.fxKbKc', el => el.textContent.trim());
28 } catch {
29
30 price = await page.$eval('div.YMlKec', el => el.textContent.trim());
31 }
32
33
34 if (!price || isNaN(parseFloat(price.replace(/[^0-9.]/g, '')))) {
35 throw new Error(`Invalid price format for ${ticker}: ${price}`);
36 }
37
38 const result = {
39 ticker,
40 price,
41 scrapedAt: new Date().toISOString()
42 };
43
44 console.log('✅ Scraped:', result);
45 await Actor.pushData(result);
46 } catch (err) {
47 console.error(`❌ Failed to scrape ${ticker}:`, err.message);
48
49
50
51 }
52 }
53 iteration++;
54 await new Promise(res => setTimeout(res, 5000));
55 }
56} finally {
57 await browser.close();
58 await Actor.exit();
59}