Lấy dữ liệu giá cổ phiếu từ website bằng Python hay code VBA

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài
Em không biết về DLL ạ. Em cảm ơn anh.
ồ DLL không biết thì chỉ cần biết Copy file về xong biết gõ cộp cộp như nói trên xong Enter là ok rồi

còn lại không cần thiết quan tâm làm chi .. sau này kiến thức khá hơn chút tự khắc nhận ra thôi
 
Kính gửi anh/chị trên diễn đàn,
Em muốn lấy dữ liệu giá cổ phiếu trên website:

Anh/ chị hỗ trợ giúp em code Python hoặc VBA để lấy dữ liệu lịch sử giao dịch cổ phiếu giúp em ạ (Nếu có thể chọn thời gian lấy dữ liệu thì quá tốt ạ). Hiện tại khi em muốn lấy dữ liệu, em chỉ kết xuất dữ liệu được từng trang và tổng hợp thủ công lại ạ. Anh/chị xem giúp em ạ. Em cảm ơn nhiều ạ.
Bạn tham khảo thử, mình dùng VBA
 
Bạn tham khảo thử, mình dùng VBA
Em cảm ơn anh nhiều.
 
Dạ, anh cho em xin DLL với ạ.
BẠN HÃY THỬ HẾT các mã có sẳn trên VBA đi xem tình hình sao ... để tôi tinh chỉnh lại chút xem có gì úp sau

mấy code trên VBA sử dụng HTMLFile tôi mới thử lỗi trên Windows 11 ... còn tại sao thì tôi cũng ko quan tâm lắm

1725850102596.png
 
Kính gửi anh/chị trên diễn đàn,
Em muốn lấy dữ liệu giá cổ phiếu trên website:

Anh/ chị hỗ trợ giúp em code Python hoặc VBA để lấy dữ liệu lịch sử giao dịch cổ phiếu giúp em ạ (Nếu có thể chọn thời gian lấy dữ liệu thì quá tốt ạ). Hiện tại khi em muốn lấy dữ liệu, em chỉ kết xuất dữ liệu được từng trang và tổng hợp thủ công lại ạ. Anh/chị xem giúp em ạ. Em cảm ơn nhiều ạ.
Thêm một giải pháp cho bạn, nếu bạn đang sử dụng Microsoft 365 bản doanh nghiệp (đã kích hoạt Office Scripts) hoặc bản khách hàng thông thường (Home hoặc Personal và đã tham gia chương trình xem trước Insider):
JavaScript:
async function main(workbook: ExcelScript.Workbook) {
    const sheetName = "CafeF-PriceHistory";
    let sheet = workbook.getWorksheet(sheetName);
    if (!sheet) {
        sheet = workbook.addWorksheet(sheetName);
    }
    const result = await getPriceHistory("VNINDEX", "8/1/2024", "8/31/2024", 500);
    const range = sheet.getRangeByIndexes(0, 0, result.length, 11);
    range.setValues(result);
    sheet.getRange("A1:K1").getFormat().getFont().setBold(true);
}

async function getPriceHistory(symbol: string, StartDate: string, EndDate: string, PageSize = 20): Promise<(string|number|boolean)[][]> {
    let uri = `https://s.cafef.vn/Ajax/PageNew/DataHistory/PriceHistory.ashx?Symbol=${symbol}&StartDate=${StartDate}&EndDate=${EndDate}&PageIndex=1&PageSize=${PageSize}`;
    const response = await fetch(uri, {
        headers: {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
            "Referer": "https://s.cafef.vn/"
        }
    });
    if (response.ok) {
        const result: (string|number|boolean)[][] = [];
        result.push(["Giá cao nhất", "Giá điều chỉnh", "Giá đóng cửa", "Giá mở cửa", "Giá thấp nhất", "Giá trị khớp lệnh", "Giá trị thỏa thuận", "Khối lượng thỏa thuận", "Khối lượng khớp lệnh", "Ngày", "Thay đổi"]);
        const json: PriceHistoryResponse = await response.json();
        for (const item of json.Data.Data) {
            const itemArray: (string|number|boolean)[] = [item.GiaCaoNhat, item.GiaDieuChinh, item.GiaDongCua, item.GiaMoCua, item.GiaThapNhat, item.GiaTriKhopLenh, item.GtThoaThuan, item.KLThoaThuan, item.KhoiLuongKhopLenh, item.Ngay, item.ThayDoi];
            result.push(itemArray);
        }
        return result;
    }
}

interface PriceHistoryResponse {
    Data: PriceHistoryData,
    Message: string,
    Success: boolean
}
interface PriceHistoryData {
    Data: Array<PriceHistoryItem>,
    TotalCount: number
}
interface PriceHistoryItem {
    GiaCaoNhat: number,
    GiaDieuChinh: number,
    GiaDongCua: number,
    GiaMoCua: number,
    GiaThapNhat: number,
    GiaTriKhopLenh: number,
    GtThoaThuan: number,
    KLThoaThuan: number,
    KhoiLuongKhopLenh: number,
    Ngay: string,
    ThayDoi: string
}
1725854872276.png
 
Thêm một giải pháp cho bạn, nếu bạn đang sử dụng Microsoft 365 bản doanh nghiệp (đã kích hoạt Office Scripts) hoặc bản khách hàng thông thường (Home hoặc Personal và đã tham gia chương trình xem trước Insider):
JavaScript:
async function main(workbook: ExcelScript.Workbook) {
    const sheetName = "CafeF-PriceHistory";
    let sheet = workbook.getWorksheet(sheetName);
    if (!sheet) {
        sheet = workbook.addWorksheet(sheetName);
    }
    const result = await getPriceHistory("VNINDEX", "8/1/2024", "8/31/2024", 500);
    const range = sheet.getRangeByIndexes(0, 0, result.length, 11);
    range.setValues(result);
    sheet.getRange("A1:K1").getFormat().getFont().setBold(true);
}

async function getPriceHistory(symbol: string, StartDate: string, EndDate: string, PageSize = 20): Promise<(string|number|boolean)[][]> {
    let uri = `https://s.cafef.vn/Ajax/PageNew/DataHistory/PriceHistory.ashx?Symbol=${symbol}&StartDate=${StartDate}&EndDate=${EndDate}&PageIndex=1&PageSize=${PageSize}`;
    const response = await fetch(uri, {
        headers: {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0",
            "Referer": "https://s.cafef.vn/"
        }
    });
    if (response.ok) {
        const result: (string|number|boolean)[][] = [];
        result.push(["Giá cao nhất", "Giá điều chỉnh", "Giá đóng cửa", "Giá mở cửa", "Giá thấp nhất", "Giá trị khớp lệnh", "Giá trị thỏa thuận", "Khối lượng thỏa thuận", "Khối lượng khớp lệnh", "Ngày", "Thay đổi"]);
        const json: PriceHistoryResponse = await response.json();
        for (const item of json.Data.Data) {
            const itemArray: (string|number|boolean)[] = [item.GiaCaoNhat, item.GiaDieuChinh, item.GiaDongCua, item.GiaMoCua, item.GiaThapNhat, item.GiaTriKhopLenh, item.GtThoaThuan, item.KLThoaThuan, item.KhoiLuongKhopLenh, item.Ngay, item.ThayDoi];
            result.push(itemArray);
        }
        return result;
    }
}

interface PriceHistoryResponse {
    Data: PriceHistoryData,
    Message: string,
    Success: boolean
}
interface PriceHistoryData {
    Data: Array<PriceHistoryItem>,
    TotalCount: number
}
interface PriceHistoryItem {
    GiaCaoNhat: number,
    GiaDieuChinh: number,
    GiaDongCua: number,
    GiaMoCua: number,
    GiaThapNhat: number,
    GiaTriKhopLenh: number,
    GtThoaThuan: number,
    KLThoaThuan: number,
    KhoiLuongKhopLenh: number,
    Ngay: string,
    ThayDoi: string
}
View attachment 303790
Dạ. Em cảm ơn anh.
 
dữ liệu JSON chỉ là phổ biến cho Web chứ không hiệu xuất nhanh như các kiểu dữ liệu khác

Nhưng qua Thớt này vọc qua voc lại Tôi lại biết thêm cách xử lý dữ liệu JSON chạy đa luồng song song tại cùng một thời điểm ...
áp dụng sau này khi cần xử lý dữ liệu lớn :p


HTMLFile quá cũ rồi bỏ dần đi là vừa vì dữ liệu lớn là thua
 
Kính gửi anh/chị trên diễn đàn,
Em muốn lấy dữ liệu giá cổ phiếu trên website:

Anh/ chị hỗ trợ giúp em code Python hoặc VBA để lấy dữ liệu lịch sử giao dịch cổ phiếu giúp em ạ (Nếu có thể chọn thời gian lấy dữ liệu thì quá tốt ạ). Hiện tại khi em muốn lấy dữ liệu, em chỉ kết xuất dữ liệu được từng trang và tổng hợp thủ công lại ạ. Anh/chị xem giúp em ạ. Em cảm ơn nhiều ạ.
Có các phương án từ VBA, Power Query, Python, Delphi, PowerShell, Office Scripts thậm chí có cả Tool riêng mà bạn vẫn chưa chọn cho mình được phương án sao.
 
Có các phương án từ VBA, Power Query, Python, Delphi, PowerShell, Office Scripts thậm chí có cả Tool riêng mà bạn vẫn chưa chọn cho mình được phương án sao.
Dạ, em đang xem phương án của VBA và power query ạ.
Bài đã được tự động gộp:

Có các phương án từ VBA, Power Query, Python, Delphi, PowerShell, Office Scripts thậm chí có cả Tool riêng mà bạn vẫn chưa chọn cho mình được phương án sao.
Phương án Power Query em thấy đơn giản hơn các cách khác chút nhưng em thắc mắc #15 chỗ :
https://s.cafef.vn/Ajax/PageNew/DataHistory/PriceHistory.ashx?Symbol=VCB&PageIndex=" & Number.ToText(_)& "&PageSize=20
=>Anh tạo link này như thế nào ạ? Em copy và dán lên web thì giống như CSV, nó khác với link ban đầu em gửi ạ.
Anh có thể hướng dẫn giúp em:
- Nếu sau này em muốn thay đổi ở 1 Web khác thì em áp dụng như thế nào ạ? và cách để tạo link như trên giống anh ạ?
 
Lần chỉnh sửa cuối:
Cố chấp dùng thêm code VBA get dữ liệu lần nữa.
 
Dạ, em đang xem phương án của VBA và power query ạ.
Bài đã được tự động gộp:


Phương án Power Query em thấy đơn giản hơn các cách khác chút nhưng em thắc mắc #15 chỗ :
https://s.cafef.vn/Ajax/PageNew/DataHistory/PriceHistory.ashx?Symbol=VCB&PageIndex=" & Number.ToText(_)& "&PageSize=20
=>Anh tạo link này như thế nào ạ? Em copy và dán lên web thì giống như CSV, nó khác với link ban đầu em gửi ạ.
Anh có thể hướng dẫn giúp em:
- Nếu sau này em muốn thay đổi ở 1 Web khác thì em áp dụng như thế nào ạ? và cách để tạo link như trên giống anh ạ?
Thì bạn muốn lấy dữ liệu thì bạn vô link=>phải chuột chọn inspect=>Network=>Fetch/XHR=> tải lại trang=> nhìn vô bên Headers sẽ thấy:

Request URL:
Chỗ VNINDEX là mã công ty, Startdate và enddate là khoảng thời gian, Pageindex 1 trang chứa 20 dòng đó. Muốn lấy tất cả thì phải tinh chỉnh lại mã thôi
 
Thì bạn muốn lấy dữ liệu thì bạn vô link=>phải chuột chọn inspect=>Network=>Fetch/XHR=> tải lại trang=> nhìn vô bên Headers sẽ thấy:

Request URL:
Chỗ VNINDEX là mã công ty, Startdate và enddate là khoảng thời gian, Pageindex 1 trang chứa 20 dòng đó. Muốn lấy tất cả thì phải tinh chỉnh lại mã thôi
Dạ, em cảm ơn anh
 
Kính gửi anh/chị trên diễn đàn,
Em muốn lấy dữ liệu giá cổ phiếu trên website:

Anh/ chị hỗ trợ giúp em code Python hoặc VBA để lấy dữ liệu lịch sử giao dịch cổ phiếu giúp em ạ (Nếu có thể chọn thời gian lấy dữ liệu thì quá tốt ạ). Hiện tại khi em muốn lấy dữ liệu, em chỉ kết xuất dữ liệu được từng trang và tổng hợp thủ công lại ạ. Anh/chị xem giúp em ạ. Em cảm ơn nhiều ạ.
Tôi tách riêng ra chủ đề sau ... tham khảo xem sao nếu cần tôi sẻ hổ trợ trong khả năng có thể ?!

 
Web KT

Bài viết mới nhất

Back
Top Bottom