Lấy dữ liệu giá cổ phiếu từ website bằng Python hay code VBA (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

  • Tôi tuân thủ nội quy khi đăng bài

    thao nguyen01

    Thành viên thường trực
    Tham gia
    8/12/19
    Bài viết
    243
    Được thích
    30
    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 ạ.
     
    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ó nhiều video hoặc trang web hướng dẫn rất chi tiết món này rồi mà, bạn chịu khó xem và làm theo. Các thành viên có giúp bạn thì cũng làm vậy 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 ạ.
    Hồi trước mình cũng viết code VBA cho một bạn ở trên này cũng y chang trường hợp này, mà không lưu lại.
     
    Thử mã sau:
    Mã:
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    import pandas as pd
    import time
    service = Service(executable_path=r'C:\Users\XTN84\Downloads\chromedriver-win64\chromedriver.exe')  # Thay thế đường dẫn này bằng đường dẫn tới chromedriver của bạn
    driver = webdriver.Chrome(service=service)
    url = "https://s.cafef.vn/lich-su-giao-dich-vnindex-1.chn"
    driver.get(url)
    try:
        WebDriverWait(driver, 30).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "table tr"))
        )
        data = []
        rows = driver.find_elements(By.CSS_SELECTOR, "table tr")
        for row in rows:
            cols = row.find_elements(By.TAG_NAME, "td")
            if len(cols) > 1:
                data.append([col.text for col in cols])
        df = pd.DataFrame(data)
        df.to_excel("vnindex_data.xlsx", index=False, header=False)
        print("Dữ liệu đã được xuất ra tệp vnindex_data.xlsx")
    finally:
        driver.quit()
     
    Thử mã sau:
    Mã:
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    import pandas as pd
    import time
    service = Service(executable_path=r'C:\Users\XTN84\Downloads\chromedriver-win64\chromedriver.exe')  # Thay thế đường dẫn này bằng đường dẫn tới chromedriver của bạn
    driver = webdriver.Chrome(service=service)
    url = "https://s.cafef.vn/lich-su-giao-dich-vnindex-1.chn"
    driver.get(url)
    try:
        WebDriverWait(driver, 30).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "table tr"))
        )
        data = []
        rows = driver.find_elements(By.CSS_SELECTOR, "table tr")
        for row in rows:
            cols = row.find_elements(By.TAG_NAME, "td")
            if len(cols) > 1:
                data.append([col.text for col in cols])
        df = pd.DataFrame(data)
        df.to_excel("vnindex_data.xlsx", index=False, header=False)
        print("Dữ liệu đã được xuất ra tệp vnindex_data.xlsx")
    finally:
        driver.quit()
    Dạ. Em cảm ơn anh. Em có làm thử nhưng cứ báo lỗi. Anh cho em hỏi là trước khi mình chạy code trên mình có cài đặt hay thêm câu lệnh gì k ạ?
     
    Code mấy cái dữ liệu này ngoài biết chút VBA, còn phải hiểu nghiệp vụ bên chứng khoán nữa.
     
    Mình không rành Python cho lắm, cho nên viết thử PowerShell script xem sao. PowerShell được cái tiện lợi, được cài sẵn theo Windows.
    Đầu tiên bạn lưu lại script dưới đây với phần mở rộng là ".psm1":
    Mã:
    function Get-PriceHistory {
        param(
            [string]$Symbol,
            [string]$StartDate,
            [string]$EndDate,
            [int]$PageIndex = 1,
            [int]$PageSize = 20,
            [string]$Destination
        )
        if (Test-Path $Destination) {
            [string]$Uri = "https://s.cafef.vn/Ajax/PageNew/DataHistory/PriceHistory.ashx?Symbol=$($Symbol)&StartDate=$($StartDate)&EndDate=$($EndDate)&PageIndex=$($PageIndex)&PageSize=$($PageSize)"
            [PsCustomObject]$Response = Invoke-RestMethod -Uri $Uri -Method Get -UserAgent "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" -Headers @{
                Referer = "https://s.cafef.vn/"
            }
            if ($Response) {
                $Result = @()
                $Response.Data.Data | ForEach-Object {
                    $Result += New-Object -TypeName psobject -Property @{
                        "Ngày" = $_.Ngay
                        "Giá cao nhất" = $_.GiaCaoNhat
                        "Giá điều chỉnh" = $_.GiaDieuChinh
                        "Giá đóng cửa" = $_.GiaDongCua
                        "Giá mở cửa" = $_.GiaMoCua
                        "Giá thấp nhất" = $_.GiaThapNhat
                        "Giá trị khớp lệnh" = $_.GiaTriKhopLenh
                        "Giá trị thỏa thuận" = $_.GtThoaThuan
                        "Khối lượng thỏa thuận" = $_.KLThoaThuan
                        "Khối lượng khớp lệnh" = $_.KhoiLuongKhopLenh
                        "Thay đổi" = $_.ThayDoi
                    }
                }
                [string]$CsvFile = ($Destination + "\PriceHistory-$($Symbol)-$(Get-Date -Format "dd-MM-yyyy hh-mm-ss").csv")
                $Result | Export-Csv -Path $CsvFile -NoTypeInformation -Append -Encoding utf8BOM
                Write-Host "Đã xuất thông tin ra đường dẫn $($CsvFile)"
            }
            else {
                Write-Host "Không thể lấy thông tin."
            }
        }
        else {
            Write-Error "The destination path $($Destination) does not exist or is invalid."
        }
    }
    Export-ModuleMember -Function Get-PriceHistory
    Sau đó, mở PowerShell và gõ tên đường dẫn của script vừa lưu lại để nhập module vào PowerShell. (Sau này không cần lập lại bước này nữa).
    1725507784507.png
    Sau đó, bạn có thể sử dụng module vừa nhập với cú pháp sau:
    Mã:
    Import-Module "đường dẫn module"
    Get-PriceHistory -Symbol "tên symbol" -Destination "Đường dẫn xuất ra tập tin csv" -PageSize "Số lượng kết quả tối đa" -StartDate "Ngày bắt đầu" -EndDate "Ngày kết thúc"
    1725507994359.png
    1725508027523.png
     
    Mình không rành Python cho lắm, cho nên viết thử PowerShell script xem sao. PowerShell được cái tiện lợi, được cài sẵn theo Windows.
    Đầu tiên bạn lưu lại script dưới đây với phần mở rộng là ".psm1":
    Mã:
    function Get-PriceHistory {
        param(
            [string]$Symbol,
            [string]$StartDate,
            [string]$EndDate,
            [int]$PageIndex = 1,
            [int]$PageSize = 20,
            [string]$Destination
        )
        if (Test-Path $Destination) {
            [string]$Uri = "https://s.cafef.vn/Ajax/PageNew/DataHistory/PriceHistory.ashx?Symbol=$($Symbol)&StartDate=$($StartDate)&EndDate=$($EndDate)&PageIndex=$($PageIndex)&PageSize=$($PageSize)"
            [PsCustomObject]$Response = Invoke-RestMethod -Uri $Uri -Method Get -UserAgent "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" -Headers @{
                Referer = "https://s.cafef.vn/"
            }
            if ($Response) {
                $Result = @()
                $Response.Data.Data | ForEach-Object {
                    $Result += New-Object -TypeName psobject -Property @{
                        "Ngày" = $_.Ngay
                        "Giá cao nhất" = $_.GiaCaoNhat
                        "Giá điều chỉnh" = $_.GiaDieuChinh
                        "Giá đóng cửa" = $_.GiaDongCua
                        "Giá mở cửa" = $_.GiaMoCua
                        "Giá thấp nhất" = $_.GiaThapNhat
                        "Giá trị khớp lệnh" = $_.GiaTriKhopLenh
                        "Giá trị thỏa thuận" = $_.GtThoaThuan
                        "Khối lượng thỏa thuận" = $_.KLThoaThuan
                        "Khối lượng khớp lệnh" = $_.KhoiLuongKhopLenh
                        "Thay đổi" = $_.ThayDoi
                    }
                }
                [string]$CsvFile = ($Destination + "\PriceHistory-$($Symbol)-$(Get-Date -Format "dd-MM-yyyy hh-mm-ss").csv")
                $Result | Export-Csv -Path $CsvFile -NoTypeInformation -Append -Encoding utf8BOM
                Write-Host "Đã xuất thông tin ra đường dẫn $($CsvFile)"
            }
            else {
                Write-Host "Không thể lấy thông tin."
            }
        }
        else {
            Write-Error "The destination path $($Destination) does not exist or is invalid."
        }
    }
    Export-ModuleMember -Function Get-PriceHistory
    Sau đó, mở PowerShell và gõ tên đường dẫn của script vừa lưu lại để nhập module vào PowerShell. (Sau này không cần lập lại bước này nữa).
    View attachment 303694
    Sau đó, bạn có thể sử dụng module vừa nhập với cú pháp sau:
    Mã:
    Import-Module "đường dẫn module"
    Get-PriceHistory -Symbol "tên symbol" -Destination "Đường dẫn xuất ra tập tin csv" -PageSize "Số lượng kết quả tối đa" -StartDate "Ngày bắt đầu" -EndDate "Ngày kết thúc"
    View attachment 303695
    View attachment 303696
    Dạ. Để em làm thử ạ. Em cảm ơn anh
     
    Gửi bạn tham khảo, lấy dữ liệu của vnindex.
    Nhập ngày bắt đầu tại ô B1, ngày kết thúc tại ô B2
    Bấm get để lấy dữ liệu về excel.
     

    File đính kèm

    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 có thể vô trang này tải data về và sử dụng nhé! https://s.cafef.vn/du-lieu-download.chn#data
     
    bài này viết hai hàm

    1/ Hàm lấy dữ liệu trả Về JSON
    2/ hàm chuyển JSON thành Array xong gán lên Sheet

    chỉ cần 2 mục trên là xong .. vì Tôi đang tập viết JSON trên Delphi do cái thớt bên kai gợi ý Google Sheet nên tiện tay thử chơi và gợi ý cho vậy

    đơn giản và dể sử dụng ngay trên Excel
     
    Dùng Power Query cho nó đơn giản:
    Mã:
    let
        Source = List.Transform({1..293}, each Json.Document(Web.Contents("https://s.cafef.vn/Ajax/PageNew/DataHistory/PriceHistory.ashx?Symbol=VCB&PageIndex=" & Number.ToText(_)& "&PageSize=20"))[Data][Data]),
        DataTables = List.Transform(Source, each Table.ExpandRecordColumn(Table.FromList(_, Splitter.SplitByNothing(), {"Record"}), "Record", {"Ngay", "GiaDieuChinh", "GiaDongCua", "ThayDoi", "KhoiLuongKhopLenh", "GiaTriKhopLenh", "KLThoaThuan", "GtThoaThuan", "GiaMoCua", "GiaCaoNhat", "GiaThapNhat"})),
        CombinedData = Table.Combine(DataTables)
    in
        CombinedData
    Lấy mã nào thì sửa chỗ VCB, cần lấy nhiều thì tạo list, cần lấy khoảng thời gian thì tạo startdate và enddate
     
    Dùng Power Query cho nó đơn giản:
    Mã:
    let
        Source = List.Transform({1..293}, each Json.Document(Web.Contents("https://s.cafef.vn/Ajax/PageNew/DataHistory/PriceHistory.ashx?Symbol=VCB&PageIndex=" & Number.ToText(_)& "&PageSize=20"))[Data][Data]),
        DataTables = List.Transform(Source, each Table.ExpandRecordColumn(Table.FromList(_, Splitter.SplitByNothing(), {"Record"}), "Record", {"Ngay", "GiaDieuChinh", "GiaDongCua", "ThayDoi", "KhoiLuongKhopLenh", "GiaTriKhopLenh", "KLThoaThuan", "GtThoaThuan", "GiaMoCua", "GiaCaoNhat", "GiaThapNhat"})),
        CombinedData = Table.Combine(DataTables)
    in
        CombinedData
    Lấy mã nào thì sửa chỗ VCB, cần lấy nhiều thì tạo list, cần lấy khoảng thời gian thì tạo startdate và enddate
    Dạ, em cảm ơn anh nhiều ạ
     
    1725846105579.png

    Tiện tay chơi chơi vui thôi

    Viết trên bất cứ công cụ nào không quan trong lắm .. mà quan trọng là tiện sử dụng và không lệ thuộc thư viện bắt buộc phải cài kèm theo là tốt

    Thiết kế như mấy mục khoanh màu đỏ khi cần tạo sự kiện cho Sheet chỉ gõ cộp cộp xong Enter
     
    View attachment 303777

    Tiện tay chơi chơi vui thôi

    Viết trên bất cứ công cụ nào không quan trong lắm .. mà quan trọng là tiện sử dụng và không lệ thuộc thư viện bắt buộc phải cài kèm theo là tốt

    Thiết kế như mấy mục khoanh màu đỏ khi cần tạo sự kiện cho Sheet chỉ gõ cộp cộp xong Enter
    Anh có hàm hay file excel anh đã thử, anh cho em xin với ạ.
     
    Anh có hàm hay file excel anh đã thử, anh cho em xin với ạ.
    Tôi tiện đang viết thư Viện GoogleSheet.dll nên tiện tay thêm hàm vào thôi

    Nó là DLL viết hàm API chứ không phải Python hay VBA ... còn trên VBA chỉ khai báo vài tham số + sự kiện là dùng

    Tôi không thích viết lấy dữ liệu Web lắm vì tôi biết máy chủ họ chỉ cần thay đổi cấu trúc API hay dữ liệu là mò vãi tè ra nên không đi sâu vào nó

    làm chi cho nhọc xác ra ... biết chút chút khi cần sử dụng là đủ dùng .....................................:p:D

    Nếu thích DLL như nói trên thì tôi úp cho còn không thì thôi
     
    Tôi tiện đang viết thư Viện GoogleSheet.dll nên tiện tay thêm hàm vào thôi

    Nó là DLL viết hàm API chứ không phải Python hay VBA ... còn trên VBA chỉ khai báo vài tham số + sự kiện là dùng

    Tôi không thích viết lấy dữ liệu Web lắm vì tôi biết máy chủ họ chỉ cần thay đổi cấu trúc API hay dữ liệu là mò vãi tè ra nên không đi sâu vào nó

    làm chi cho nhọc xác ra ... biết chút chút khi cần sử dụng là đủ dùng .....................................:p:D

    Nếu thích DLL như nói trên thì tôi úp cho còn không thì thôi
    Em không biết về DLL ạ. Em cảm ơn anh.
     
    Web KT

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

    Back
    Top Bottom