Làm sao về tính hợp pháp của việc thu thập dữ liệu trên Yahoo Finance? Liệu nó có được công nhận là hoạt động bất hợp pháp?
Hãy bình tĩnh. Hầu hết dữ liệu trên trang web Yahoo Finance là mã nguồn mở và thông tin công khai. Dữ liệu Yahoo Finance mà chúng ta có thể thu thập bao gồm:
Mặc dù điều này là đúng về nguyên tắc, bạn vẫn nên chú ý đến luật và quy định về thu thập dữ liệu web ở địa phương phòng trường hợp.
Trước khi thu thập, điều quan trọng là phải tìm ra lý do. Tại sao chúng ta nên thu thập nó? Ở đây chúng tôi có thể cung cấp cho bạn phân tích.
Bằng cách thu thập dữ liệu gần đây, các nhà đầu tư có thể nhận được giá cổ phiếu, khối lượng giao dịch và động lực thị trường mới nhất, để đưa ra quyết định kịp thời. Ngoài ra, bằng cách phân tích dữ liệu lịch sử, các nhà đầu tư có thể xây dựng các mô hình cơ bản để dự đoán xu hướng giá cổ phiếu và hỗ trợ trong việc xây dựng chiến lược đầu tư.
Chúng ta luôn sợ rủi ro. Chúng ta có thể thu thập dữ liệu hiệu suất của các cổ phiếu khác nhau để giúp chúng ta tối ưu hóa danh mục đầu tư của mình nhằm giảm thiểu rủi ro.
Báo cáo tài chính, tin tức và các sự kiện khác có tác động đáng kể đến giá cổ phiếu. Bằng cách thu thập dữ liệu, chúng ta có thể hiểu rõ thị trường chứng khoán và giúp các nhà đầu tư đưa ra quyết định chính xác.
Sau một chu kỳ đầu tư, chúng ta cần đưa ra một bản tóm tắt phản hồi về sự phát triển của các quỹ đã đầu tư. Sử dụng Browserless để thu thập dữ liệu có thể kịp thời và hiệu quả kiểm tra dữ liệu lịch sử và xác minh hiệu quả của các chiến lược giao dịch, qua đó nâng cao tỷ lệ thành công của các giao dịch.
Tuy nhiên, Yahoo Finance có thể sử dụng các biện pháp như chặn IP, CAPTCHA và giới hạn tốc độ yêu cầu để ngăn chặn việc thu thập dữ liệu tự động. Và bởi vì một số dữ liệu có thể được tải động thông qua JavaScript, chúng ta cần sử dụng một chương trình mạnh mẽ và ổn định hơn để xử lý các trang web động.
Đừng buồn! Browserless hoạt động tốt để giải quyết những vấn đề này.
Browserless là một giải pháp dựa trên đám mây được thiết kế cho tự động hóa trình duyệt có khả năng mở rộng, thu thập dữ liệu web và thử nghiệm web. Browserless có khả năng tương thích tự nhiên với Playwright và Puppeteer. Nó cũng được thiết kế với khả năng giải quyết captcha tự động và dịch vụ proxy. Bên cạnh đó, nó trang bị một nền tảng có thể mở rộng với API để tích hợp các chế độ xem thời gian thực và truy xuất nhật ký và bản ghi.
Browserless hiện đã hoàn toàn để thử nghiệm!
Bạn có bất kỳ ý tưởng tuyệt vời nào hay nghi ngờ gì về thu thập dữ liệu web và Browserless?
Hãy xem những gì các nhà phát triển khác đang chia sẻ trên Discord!
Dịch vụ Browserless là cần thiết để chúng ta có thể thu thập dữ liệu Yahoo Finance. Browserless của Nstbrowser là một công cụ hiệu quả để giải quyết các tác vụ thu thập dữ liệu web phức tạp và tự động hóa quy mô lớn, và nó hỗ trợ triển khai đám mây được quản lý đầy đủ.
Browserless áp dụng cách tiếp cận tập trung vào trình duyệt, cung cấp khả năng triển khai headless mạnh mẽ và cung cấp hiệu suất và độ tin cậy cao hơn. Để biết thêm thông tin về Browserless, bạn có thể tìm hiểu từ tài liệu Browserless của chúng tôi.
puppeteer-core
nhẹ hơn:# pnpm
pnpm i puppeteer-core
# yarn
yarn add puppeteer-core
# npm
npm i --save puppeteer-core
apiKey
và proxy
để bắt đầu các hoạt động Browserless tiếp theo:import puppeteer from "puppeteer-core";
const apiKey = "your ApiKey"; // bắt buộc
const config = {
proxy: 'your proxy', // bắt buộc; định dạng đầu vào: schema://user:password@host:port ví dụ: http://user:password@localhost:8080
// platform: 'windows', // hỗ trợ: windows, mac, linux
// kernel: 'chromium', // chỉ hỗ trợ: chromium
// kernelMilestone: '128', // hỗ trợ: 128
// args: {
// "--proxy-bypass-list": "detect.nstbrowser.io"
// }, // đối số trình duyệt
// fingerprint: {
// userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.85 Safari/537.36', // userAgent được hỗ trợ từ phiên bản v0.15.0
// },
};
const query = new URLSearchParams({
token: apiKey, // bắt buộc
config: JSON.stringify(config),
});
const browserlessWSEndpoint = `https://less.nstbrowser.io/connect?${query.toString()}`;
Trước khi bắt đầu thu thập dữ liệu Yahoo Finance, chúng ta có thể quan sát URL của Yahoo Finance trước: https://finance.yahoo.com/quote/AAPL/. Trong đó, AAPL
là mã cổ phiếu.
Rõ ràng, bạn có thể chuyển sang trang cổ phiếu bạn cần thu thập bằng cách thay đổi đường dẫn mã cổ phiếu. Sau đó, mở công cụ dành cho nhà phát triển (F12) để kiểm tra cấu trúc HTML của trang và đặt con trỏ vào giá thị trường hiện tại.
Tiếp theo, chúng ta sẽ thử thu thập giá này:
Trong các bước chuẩn bị ở trên, chúng ta đã có được cổng kết nối Browserless, do đó chúng ta có thể bắt đầu thu thập trực tiếp.
// kết nối với browserless
const browser = await puppeteer.connect({
browserWSEndpoint: browserlessWSEndpoint,
defaultViewport: null,
})
const page = await browser.newPage();
await page.goto('https://finance.yahoo.com/quote/AAPL');
// Thêm ảnh chụp màn hình để hỗ trợ khắc phục sự cố sau này
await page.screenshot({ path: 'yahoo.png' });
const selector = '[data-symbol="AAPL"][data-field="regularMarketPrice"]';
// Trích xuất văn bản bên trong của một phần tử phù hợp với bộ chọn (ví dụ: giá cổ phiếu)
const regularMarketPrice = await page.$eval(selector, el => el.innerText);
console.log(`Apple Giá cổ phiếu hiện tại là:${regularMarketPrice}`);
Chờ đã! Nếu chúng ta chạy tập lệnh trên ngay bây giờ, rất có thể nó sẽ thất bại. Tại sao? Hãy cùng xem ảnh chụp màn hình finance.png
được tạo ra khi tôi chạy tập lệnh.
Có thể thấy rằng lỗi thu thập là do chúng ta chưa thực hiện xác thực cookie. Sau đó, chúng ta sẽ sử dụng Puppeteer để giúp chúng ta bỏ qua xác thực cookie:
Chấp nhận tất cả
theo cách tương tự và lấy bộ chọn lớp tương ứngCác hoạt động trên có thể dễ dàng hoàn thành chỉ với một vài dòng mã đơn giản!
Mã sau được sử dụng để chờ phần tử có lớp .consent-overlay
xuất hiện trên trang, sau đó nhấp vào nút "Chấp nhận tất cả" (.accept-all
) trong lớp. Và chúng ta cần sử dụng try catch
để loại trừ trường hợp cookie đã được xác thực.
try {
await page.waitForSelector('.consent-overlay');
// nhấp vào nút "chấp nhận tất cả"
await page.click('.consent-overlay .accept-all');
} catch (e) {
console.log('Cookie đã được xác thực');
}
import puppeteer from "puppeteer-core";
const apiKey = "your ApiKey"; // 'your proxy'
const config = {
proxy: 'your proxy', // bắt buộc; định dạng đầu vào: schema://user:password@host:port ví dụ: http://user:password@localhost:8080
// platform: 'windows', // hỗ trợ: windows, mac, linux
// kernel: 'chromium', // chỉ hỗ trợ: chromium
// kernelMilestone: '128', // hỗ trợ: 128
// args: {
// "--proxy-bypass-list": "detect.nstbrowser.io"
// }, // đối số trình duyệt
// fingerprint: {
// userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.85 Safari/537.36', // userAgent được hỗ trợ từ phiên bản v0.15.0
// },
};
const query = new URLSearchParams({
token: apiKey, // bắt buộc
config: JSON.stringify(config),
});
const browserlessWSEndpoint = `https://less.nstbrowser.io/connect?${query.toString()}`;
const browser = await puppeteer.connect({
browserWSEndpoint: browserlessWSEndpoint,
defaultViewport: null,
})
const page = await browser.newPage();
await page.goto('https://finance.yahoo.com/quote/AAPL/');
await page.screenshot({ path: 'yahoo.png' });
try {
await page.waitForSelector('.consent-overlay');
// nhấp vào nút "chấp nhận tất cả"
await page.click('.consent-overlay .accept-all');
} catch (e) {
console.log('Cookie đã được xác thực');
}
const selector = '[data-symbol="AAPL"][data-field="regularMarketPrice"]';
const regularMarketPrice = await page.$eval(selector, el => el.innerText);
console.log(`Apple Giá cổ phiếu hiện tại là:${regularMarketPrice}`);
Tuy nhiên, việc viết mã cổ phiếu trực tiếp trong mã không đủ linh hoạt. Vì vậy, chúng ta nên thêm mã sau vào đầu tập lệnh. Mã sau sẽ buộc tập lệnh phải chạy với tham số tập lệnh: mã cổ phiếu.
const tickerSymbols = process.argv.slice(2);
if (tickerSymbols.length === 0) {
console.error('Thiếu đối số dòng lệnh mã chứng khoán!');
process.exit(2);
}
Vì có thể có nhiều mã cổ phiếu, chúng ta cần định nghĩa một mảng (stockList
) để nhận kết quả thu thập. Trong mã sau, chúng ta sẽ sử dụng một vòng lặp đơn giản để duyệt và xử lý danh sách mã cổ phiếu được nhập.
// Một mảng chứa tất cả dữ liệu thu thập
const stockList = [];
for (const tickerSymbol of tickerSymbols) {
console.log(`Đang thu thập dữ liệu cho: ${tickerSymbol}`);
// Điều hướng đến trang Yahoo Finance
await page.goto(`https://finance.yahoo.com/quote/${tickerSymbol}`);
try {
await page.waitForSelector('.consent-overlay');
// Nhấp vào nút "chấp nhận tất cả"
await page.click('.consent-overlay .accept-all');
} catch (e) { }
// Định nghĩa bộ chọn bằng cách sử dụng chuỗi mẫu và ký hiệu chứng khoán
const selectors = {
regularMarketPrice: `[data-symbol="${tickerSymbol}"][data-field="regularMarketPrice"]`,
regularMarketChange: `[data-symbol="${tickerSymbol}"][data-field="regularMarketChange"]`,
regularMarketChangePercent: `[data-symbol="${tickerSymbol}"][data-field="regularMarketChangePercent"]`,
preMarketPrice: `[data-symbol="${tickerSymbol}"][data-field="preMarketPrice"]`,
preMarketChange: `[data-symbol="${tickerSymbol}"][data-field="preMarketChange"]`,
preMarketChangePercent: `[data-symbol="${tickerSymbol}"][data-field="preMarketChangePercent"]`
};
// Khởi tạo một đối tượng trống để lưu trữ dữ liệu tài chính
const financialData = { tickerSymbol };
// Lặp qua từng bộ chọn để trích xuất nội dung văn bản
for (const [key, selector] of Object.entries(selectors)) {
try {
financialData[key] = await page.$eval(selector, el => el.innerText);
// Loại bỏ dấu ngoặc đơn cho giá trị phần trăm
if (key.includes('ChangePercent')) {
financialData[key] = financialData[key].replace('(', '').replace(')', '');
}
} catch {
financialData[key] = 'N/A'; // Nếu không tìm thấy phần tử, giá trị được đặt thành N/A
}
}
// Thêm dữ liệu tài chính của ký hiệu chứng khoán hiện tại vào mảng chứng khoán
stockList.push(financialData);
}
console.log(JSON.stringify(stockList, null, 2));
Chạy tập lệnh sau:
node yahoo.mjs AAPL TSLA
Nếu thành công, kết quả sau sẽ được in trên bảng điều khiển:
Rõ ràng, để phân tích dữ liệu tốt hơn, chỉ cần in dữ liệu trên bảng điều khiển là chưa đủ. Đây là một ví dụ đơn giản. Chỉ cần nối thủ công CSV sau, sau đó sử dụng mô-đun fs để tạo một tệp CSV của kết quả thu thập:
// Tạo chuỗi csv và ghi vào tệp csv
let csvData = 'Ticker Symbol,Regular Market Price,Regular Market Change,Regular Market Change Percent,Pre Market Price,Pre Market Change,Pre Market Change Percent\n';
stockList.forEach(stock => {
csvData += `${stock.tickerSymbol},${stock.regularMarketPrice},${stock.regularMarketChange},${stock.regularMarketChangePercent},${stock.preMarketPrice},${stock.preMarketChange},${stock.preMarketChangePercent}\n`;
});
fs.writeFileSync('stocks_data.csv', csvData);
import puppeteer from "puppeteer-core";
import fs from 'fs'
const tickerSymbols = process.argv.slice(2);
if (tickerSymbols.length === 0) {
console.error('Thiếu đối số dòng lệnh mã chứng khoán!');
process.exit(2);
}
const apiKey = "your ApiKey"; // 'your proxy'
const config = {
proxy: 'your proxy', // bắt buộc; định dạng đầu vào: schema://user:password@host:port ví dụ: http://user:password@localhost:8080
// platform: 'windows', // hỗ trợ: windows, mac, linux
// kernel: 'chromium', // chỉ hỗ trợ: chromium
// kernelMilestone: '128', // hỗ trợ: 128
// args: {
// "--proxy-bypass-list": "detect.nstbrowser.io"
// }, // đối số trình duyệt
// fingerprint: {
// userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.6613.85 Safari/537.36', // userAgent được hỗ trợ từ phiên bản v0.15.0
// },
};
const query = new URLSearchParams({
token: apiKey, // bắt buộc
config: JSON.stringify(config),
});
const browserlessWSEndpoint = `https://less.nstbrowser.io/connect?${query.toString()}`;
const browser = await puppeteer.connect({
browserWSEndpoint: browserlessWSEndpoint,
defaultViewport: null,
})
console.info('Đã kết nối!');
const page = await browser.newPage();
// Một mảng chứa tất cả dữ liệu thu thập
const stockList = [];
for (const tickerSymbol of tickerSymbols) {
console.log(`Đang thu thập dữ liệu cho: ${tickerSymbol}`);
// Điều hướng đến trang Yahoo Finance
await page.goto(`https://finance.yahoo.com/quote/${tickerSymbol}`);
try {
await page.waitForSelector('.consent-overlay');
// Nhấp vào nút "chấp nhận tất cả"
await page.click('.consent-overlay .accept-all');
} catch (e) { }
// Định nghĩa bộ chọn bằng cách sử dụng chuỗi mẫu và ký hiệu chứng khoán
const selectors = {
regularMarketPrice: `[data-symbol="${tickerSymbol}"][data-field="regularMarketPrice"]`,
regularMarketChange: `[data-symbol="${tickerSymbol}"][data-field="regularMarketChange"]`,
regularMarketChangePercent: `[data-symbol="${tickerSymbol}"][data-field="regularMarketChangePercent"]`,
preMarketPrice: `[data-symbol="${tickerSymbol}"][data-field="preMarketPrice"]`,
preMarketChange: `[data-symbol="${tickerSymbol}"][data-field="preMarketChange"]`,
preMarketChangePercent: `[data-symbol="${tickerSymbol}"][data-field="preMarketChangePercent"]`
};
// Khởi tạo một đối tượng trống để lưu trữ dữ liệu tài chính
const financialData = { tickerSymbol };
// Lặp qua từng bộ chọn để trích xuất nội dung văn bản
for (const [key, selector] of Object.entries(selectors)) {
try {
financialData[key] = await page.$eval(selector, el => el.innerText);
// Loại bỏ dấu ngoặc đơn cho giá trị phần trăm
if (key.includes('ChangePercent')) {
financialData[key] = financialData[key].replace('(', '').replace(')', '');
}
} catch {
financialData[key] = 'N/A'; // Nếu không tìm thấy phần tử, giá trị được đặt thành N/A
}
}
// Thêm dữ liệu tài chính của ký hiệu chứng khoán hiện tại vào mảng chứng khoán
stockList.push(financialData);
}
console.log(JSON.stringify(stockList, null, 2));
// Tạo chuỗi csv và ghi vào tệp csv
let csvData = 'Ticker Symbol,Regular Market Price,Regular Market Change,Regular Market Change Percent,Pre Market Price,Pre Market Change,Pre Market Change Percent\n';
stockList.forEach(stock => {
csvData += `${stock.tickerSymbol},${stock.regularMarketPrice},${stock.regularMarketChange},${stock.regularMarketChangePercent},${stock.preMarketPrice},${stock.preMarketChange},${stock.preMarketChangePercent}\n`;
});
fs.writeFileSync('stocks_data.csv', csvData);
await browser.close();
Bây giờ, sau khi chạy tập lệnh, bạn không chỉ có thể thấy bảng điều khiển in ra, mà còn có thể thấy tệp stocks_data.csv
được ghi trong đường dẫn hiện tại.
Bạn có thể xem thống kê cho các yêu cầu gần đây và thời gian phiên còn lại trong menu Browserless của ứng dụng khách Nstbrowser.
Browserless của Nstbrowser là một công cụ thu thập dữ liệu web và tự động hóa mạnh mẽ. Nó có thể dễ dàng bỏ qua việc phát hiện và đảm bảo sự ổn định khi thu thập giá cổ phiếu. Trong hướng dẫn này, bạn đã học được:
Yahoo Finance là một trang web động điển hình với công nghệ bảo vệ dữ liệu tiên tiến được tích hợp dựa trên các chức năng mạnh mẽ của JavaScript.
Vì vậy, nếu bạn muốn dễ dàng thu thập dữ liệu Yahoo Finance, bạn phải sử dụng một công cụ thu thập dữ liệu mạnh mẽ tương đương. Browserless miễn phí của chúng tôi cung cấp cho bạn cách thức thuận tiện và nhanh nhất để thu thập. Chỉ cần gọi một vài dòng mã, và bạn có thể làm được.
Bắt đầu sử dụng miễn phí ngay bây giờ!
Lưu ý: Bất kỳ dữ liệu và trang web nào được đề cập trong bài viết này chỉ nhằm mục đích minh họa. Chúng tôi kiên quyết phản đối các hoạt động bất hợp pháp và xâm phạm bản quyền. Nếu bạn có bất kỳ câu hỏi hoặc mối quan tâm nào, vui lòng liên hệ với chúng tôi ngay lập tức.