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

thao nguyen01

Thành viên thường trực
Tham gia
8/12/19
Bài viết
241
Đượ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

  • Data.xlsb
    77.9 KB · Đọc: 17
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