Ứng dụng "Lấy dữ liệu tự động từ Website vào bảng tính Excel" tham khảo dữ liệu Chứng khoán, Tài chính, Bảng Giá trực tuyến ... từ Internet về Excel hoàn toàn miễn phí
*(Có sẵn File Excel: 10/10/2019 16:00 GMT+7)
Ứng dụng ở file phía dưới sẽ cập nhật dữ liệu tự động liên tục và chính xác từ nguồn uy tín.
Các mục dữ liệu sẽ lấy bao gồm:
- Cổ phiếu: HOSE, HNX, UPCOM, Bảng giá quỹ mở, Bảng giá Phái Sinh, ... Và tập hợp các Cổ Phiếu khác hoặc tự chọn mã.
- Giao dịch thỏa thuận
- Bảng cân đối kế toán
- Báo cáo kết quả kinh doanh
- Báo cáo Lưu chuyển tiền tệ
- Sự kiện quyền
- Chứng quyền
- Realtime - Cập nhật dữ liệu Cổ phiếu liên tục
Một số ảnh tham khảo:
----------------------------------
Tag: Cập nhật dữ liệu, Cập nhật dữ liệu web, dữ liệu tự động, cạo website, điều khiển web , điều khiển trình duyệt, dữ liệu từ web,
dữ liệu báo cáo tài chính từ website, Lấy Dữ Liệu Từ Web Vào Excel, lấy dữ liệu từ web, dữ liệu chứng khoán, dữ liệu các công ty, dữ liệu vndirect, dữ liệu vietstock, dữ liệu cổ phiếu ,Bảng Giá trực tuyến, chứng khoán phái sinh, chứng khoán quỹ mở, chứng khoán cơ sở, ...
*(Có sẵn File - Đã cập nhật File lấy dữ liệu báo cáo tài chính: 07/08/2019 17:00 GMT+7)
Vì thấy nhiều bạn quan tâm đến việc cạo dữ liệu website, và đà phát triển của công nghệ web, nên hôm nay tôi trở lại với chủ đề của mình, và sẽ có gắn giúp các bạn có thể đạt được mong muốn, mà không phải cần nhiều căn bản về lập trình VBA.
Dưới đây là một số phương pháp giúp cạo dữ liệu bất kì website nào về Excel và cũng có thể upload ngược trở lại ngay trên chính Excel với lập trình VBA.
Trước tiên cần thêm Tools trong VBA dành cho Nhà phát triển:
Mở cửa sổ lập trình VBA (Alt+F11) vào Tools -> References... tìm các gói sau:
+ Microsoft Scripting Runtime (Dùng để khởi tạo Object)
+ Microsoft HTML Object Library (Dùng để phân tích và tách HTML)
+ Microsoft XML, v3.0 - > v6.0 (Dùng để phân tích và tách HTML)
+ Microsoft Internet Controls (Dùng để điều khiển Internet Explorer ) (Nâng cấp lên Internet Explorer 11)
Giải nén chromedriver vào thư mục cài đặt SeleniumBasic (C...\AppData\Local\SeleniumBasic)
*Lưu ý với chromedriver, luôn luôn tìm tải phiên bản mới nhất khi chrome cập nhật
Bắt đầu:
Khi phát triển một 1. Giao thức sử dụng để lấy HTML, XML, Json trong VBA:
+ Sử dụng WinHTTPRequests hoặc XMLHTTP:
Sử dụng khi nào: Dữ liệu trong Site được load ngay, không thông qua Javascript.
Set Http = CreateObject("WinHttp.WinHttpRequest.5.1")
Set Http = CreateObject("MSXML2.XMLHTTP") hoặc MSXML2.XMLHTTP60 (với Microsoft XML, v 6.0 ở Office64 ) (truy cập một lần)
Set Http = CreateObject("MSXML2.ServerXMLHTTP") (Giữ kết nối)
Hoặc dùng khai báo đồng dạng Early Binding để được gợi ý tự động hoàn thành code:
'Đồng dạng
Dim Http As WinHttp.WinHttpRequest
'Early Binding sẽ có từ khóa "New"
Dim Http As New WinHttp.WinHttpRequest / MSXML2.XMLHTTP / MSXML2.XMLHTTP60 (Office64) / MSXML2.ServerXMLHTTP
Ưu Điểm: nhanh
Nhược điểm: không cạo được site có IFrame, không load được Javascript, không giữ kết nối, viết code tới Server hơi phức tạp
+ Sử dụng Internet Explorer Control:
Dim IE As New SHDocVw.InternetExplorer
++Ưu điểm: load được Javascript, nhanh , giữ kết nối
++Nhược điểm: Một số phương thức Get không có, điều khiển một số web kém, không cạo được site có IFrame
+ Sử dụng Chrome + SeleniumBasic:
++Ưu điểm: tìm đến đối tượng Element khá nhanh, điều khiển web quá tuyệt vời, đầy đủ mọi phương thức get, load được Javascript, cạo được site có IFrame , bảo mật, nhanh , giữ kết nối, chrome và chromedriver luôn được cập nhật.
++Nhược điểm: Vòng lặp For Each Element In Elements quá chậm, luôn phải update phiên bản Chromedriver bằng tay
(trừ khi sử dụng script để tự động tìm và tải - khiến window phải chịu thêm một tiến trình chạy ngầm)
2. Bốc tách HTML , XML, JSon:
+ HTML: HTMLDocument
+ XML: MSXML2.DOMDocument Hoặc MSXML2.DOMDocument60 (Office 64bit) -
+ JSon: Với Json cần thêm gói được xây dựng sẵn ở Link tải
3. Các đoạn code cơ bản:
Khai báo: Với những ai đang học tập thì tất cả cần được khai báo đồng dạng Early Binding để code khi viết được tự động điền, bằng cách gõ các ký tự đầu và ấn Ctrl+Phím Cách để sử dụng). Khi khai báo Early Binding cần thêm thư viện phù hợp.
'Sử dụng trình duyệt:
Dim IE As SHDocVw.InternetExplorer
'Bóc tách HTML
Dim Doc As MSHTML.HTMLDocument 'Nhận dạng một Document
Set Doc = IE.Document 'Hoặc Doc.body.innerHTML = "Text là HTML"
'Cách đặt biến với Element: Nếu tham chiếu đến Collection thì Biến có "s"
'Ví dụ: .getElementsByTagname("div") có Elements thì là Collection, .getElementByID("id...") -> là một Element đơn
Dim Elements As MSHTML.IHTMLElementCollection '(Nhận dạng một Collection của Elements)
Dim Element As MSHTML.IHTMLElement '(Nhận dạng một Element)
Dim Anchor As MSHTML.HTMLAnchorElement
Dim TableCell As MSHTML.HTMLTableCell '(Nhận dạng một tag Table)
'Dùng For Each Element
Dim Element As MSHTML.IHTMLElement
For Each Element In Doc.getElementsByTagname("div")
Next
'Dùng Length - Vị trí bắt đầu mảng luôn luôn bắt đầu từ 0
Dim i%
For i = 0 To Doc.getElementsByTagname("div").Length - 1
Next
'Bóc tách XML
Dim Doc2 As MSXML2.DOMDocument60
Dim XmlCell2 As MSXML2.IXMLDOMElement
Dim xmlCells2 As MSXML2.IXMLDOMNodeList
Dim MaterialValueElement2 As MSXML2.IXMLDOMElement
Set Doc2 = New MSXML2.DOMDocument60
Doc2.LoadXML .responseText
4. Tự động cập nhật dữ liệu:
Dữ liệu có thể tự động cập nhật âm thầm, tự khởi động ứng dụng và câp nhật, ....
**(Cập Nhật sau)
Python (cần Xlwings) hoặc NodeJS (cần package: xlsx , exceljs), cùng với Selenium (hoặc một gói hổ trợ lấy dữ liệu khác) mới có thể làm được ...
Python thì Trực tiếp (cập nhật khi file đang mở) , nodeJS thì gián tiếp (cập nhật khi file đang đóng)
Search gợi ý của mình lên google - keyword:
+ Python: Xlwings , Selenium Python, Python Excel
+ NodeJS: NodeJS Excel , Selenium Nodejs, xlsx, exceljs
Website:
+ Python: https://www.python.org
+ NodeJS: https://www.nodejs.org
+ Xlwings cho Python: https://www.xlwings.org/
+ Selenium: https://www.seleniumhq.org/docs/
Để chạy nodejs (cần tải thêm Plugin Nodejs trong pycharm) và Python dùng IDE pycharm: https://www.jetbrains.com/pycharm/
Trang hỗ trợ tốt nhất hiện nay: stackoverflow.com, github, và google
Tag: Cập nhật dữ liệu, Cập nhật dữ liệu web, dữ liệu tự động, cạo website, điều khiển web , điều khiển trình duyệt, dữ liệu từ web,
dữ liệu báo cáo tài chính từ website, lấy dữ liệu từ web, dữ liệu chứng khoán, dữ liệu các công ty, dữ liệu vndirect, dữ liệu vietstock, dữ liệu cổ phiếu ...
File lỗi tùm lum bạn ơi:
- Khi chuyển mã chứng khoán khác nó báo lỗi Runtime 91
- Khi chuyển mã chứng khoán của các công ty chứng khoán (Ví dụ: HCM) cũng hiện lỗi 91
- Dữ lieu Sheet Realtime không liên kết với mã chứng khoán đã chọn ở sheet BCD_KT
Mỗi lần xuất hiện lỗi Runtime 91 thì bị treo file excel không đóng được
Mong bạn sửa lỗi trên giúp mình, mình chân thành cảm ơn
File vẫn còn lỗi bạn ơi. Cụ thể là khi chuyển mã chứng khoán của các công ty chứng khoán (ví dụ: HCM, VND,...) thì sheet BC_CLTT không cập nhật được bạn ơi.
Cột nội dung chi tiết bạn cho nó hiện số tiền cụ thể được chi trả được không bạn vì để chữ không tính toán được bạn ơi. Khỏi lấy dữ liệu cổ tức bang cổ phiếu
Mong bạn sửa lỗi trên giúp mình, mình chân thành cảm ơn bạn nhé
file excel cập nhật bên trên lấy dữ liệu từ vndirect nên dữ lieu lấy không còn chính xác nhất là ở sheet BC-CLTT bị sai (không có dữ liệu của mã HCM, VND). Mong các bạn giúp mình đổi lại trang lấy dữ lieu là finance.vietstock.vn thay vì trang vndirect như trước đây. Mình cảm ơn các bạn trước.
Bản cập nhật mới nhất vẫn bị lỗi ở sheet BC_KQKD. Dữ liệu không thay đổi dù đã chuyển đổi sang các công ty khác. Mong bác fix lỗi giúp với. Sheet BC_LCTT bác có thể lấy thêm dữ liệu của các năm còn lại của báo cáo tài chính được không? Mong được giúp đỡ. Xin chân thành cảm ơn.
*(Có sẵn File - Đã cập nhật File lấy dữ liệu báo cáo tài chính: 21/08/2019 16:44 GMT+7)
Vì thấy nhiều bạn quan tâm đến việc cạo dữ liệu website, và đà phát triển của công nghệ web, nên hôm nay tôi trở lại với chủ đề của mình, và sẽ có gắn giúp các bạn có thể đạt được mong muốn, mà không phải cần nhiều căn bản về lập trình VBA.
Dưới đây là một số phương pháp giúp cạo dữ liệu bất kì website nào về Excel và cũng có thể upload ngược trở lại ngay trên chính Excel với lập trình VBA.
Trước tiên cần thêm Tools trong VBA dành cho Nhà phát triển:
Mở cửa sổ lập trình VBA (Alt+F11) vào Tools -> References... tìm các gói sau:
+ Microsoft Scripting Runtime (Dùng để khởi tạo Object)
+ Microsoft HTML Object Library (Dùng để phân tích và tách HTML)
+ Microsoft XML, v3.0 - > v6.0 (Dùng để gửi và nhận dữ liệu: Source HTML, json, ...)
+ Microsoft Internet Controls (Dùng để điều khiển Internet Explorer ) (Nâng cấp lên Internet Explorer 11)
Giải nén chromedriver vào thư mục cài đặt SeleniumBasic (C...\AppData\Local\SeleniumBasic)
*Lưu ý với chromedriver, luôn luôn tìm tải phiên bản mới nhất khi chrome cập nhật
Bắt đầu:
1. Giao thức sử dụng để lấy HTML, XML, Json trong VBA:
+ Sử dụng WinHTTPRequests hoặc XMLHTTP:
Sử dụng khi nào: Dữ liệu trong Site được load ngay, không thông qua Javascript.
Set Http = CreateObject("WinHttp.WinHttpRequest.5.1")
Set Http = CreateObject("MSXML2.XMLHTTP") hoặc MSXML2.XMLHTTP60 (với Microsoft XML, v 6.0 ở Office64 ) (truy cập một lần)
Set Http = CreateObject("MSXML2.ServerXMLHTTP") (Giữ kết nối)
Hoặc dùng khai báo đồng dạng Early Binding để được gợi ý tự động hoàn thành code:
'Đồng dạng
Dim Http As WinHttp.WinHttpRequest
'Early Binding sẽ có từ khóa "New"
Dim Http As New WinHttp.WinHttpRequest / MSXML2.XMLHTTP / MSXML2.XMLHTTP60 (Office64) / MSXML2.ServerXMLHTTP
Ưu Điểm: nhanh
Nhược điểm: không cạo được site có IFrame, không load được Javascript, không giữ kết nối, viết code tới Server hơi phức tạp
+ Sử dụng Internet Explorer Control:
Dim IE As New SHDocVw.InternetExplorer
++Ưu điểm: load được Javascript, nhanh , giữ kết nối
++Nhược điểm: Một số phương thức Get không có, điều khiển một số web kém, không cạo được site có IFrame
+ Sử dụng Chrome + SeleniumBasic:
++Ưu điểm: tìm đến đối tượng Element khá nhanh, điều khiển web quá tuyệt vời, đầy đủ mọi phương thức get, load được Javascript, cạo được site có IFrame , bảo mật, nhanh , giữ kết nối, chrome và chromedriver luôn được cập nhật.
++Nhược điểm: Vòng lặp For Each Element In Elements quá chậm, luôn phải update phiên bản Chromedriver bằng tay
(trừ khi sử dụng script để tự động tìm và tải - khiến window phải chịu thêm một tiến trình chạy ngầm)
2. Bốc tách HTML , XML, JSon:
+ HTML: HTMLDocument
+ XML: MSXML2.DOMDocument Hoặc MSXML2.DOMDocument60 (Office 64bit) -
+ JSon: Với Json cần thêm gói được xây dựng sẵn ở Link tải
3. Các đoạn code cơ bản:
Khai báo: Với những ai đang học tập thì tất cả cần được khai báo đồng dạng Early Binding để code khi viết được tự động điền, bằng cách gõ các ký tự đầu và ấn Ctrl+Phím Cách để sử dụng). Khi khai báo Early Binding cần thêm thư viện phù hợp.
'Sử dụng trình duyệt:
Dim IE As SHDocVw.InternetExplorer
'Bóc tách HTML
Dim Doc As MSHTML.HTMLDocument 'Nhận dạng một Document
Set Doc = IE.Document 'Hoặc Doc.body.innerHTML = "Text là HTML"
'Cách đặt biến với Element: Nếu tham chiếu đến Collection thì Biến có "s"
'Ví dụ: .getElementsByTagname("div") có Elements thì là Collection, .getElementByID("id...") -> là một Element đơn
Dim Elements As MSHTML.IHTMLElementCollection '(Nhận dạng một Collection của Elements)
Dim Element As MSHTML.IHTMLElement '(Nhận dạng một Element)
Dim Anchor As MSHTML.HTMLAnchorElement
Dim TableCell As MSHTML.HTMLTableCell '(Nhận dạng một tag Table)
'Dùng For Each Element
Dim Element As MSHTML.IHTMLElement
For Each Element In Doc.getElementsByTagname("div")
Next
'Dùng Length - Vị trí bắt đầu mảng luôn luôn bắt đầu từ 0
Dim i%
For i = 0 To Doc.getElementsByTagname("div").Length - 1
Next
'Bóc tách XML
Dim Doc2 As MSXML2.DOMDocument60
Dim XmlCell2 As MSXML2.IXMLDOMElement
Dim xmlCells2 As MSXML2.IXMLDOMNodeList
Dim MaterialValueElement2 As MSXML2.IXMLDOMElement
Set Doc2 = New MSXML2.DOMDocument60
Doc2.LoadXML .responseText
4. Tự động cập nhật dữ liệu:
Dữ liệu có thể tự động cập nhật âm thầm, tự khởi động ứng dụng và câp nhật, ....
**(Cập Nhật sau)
Python (cần Xlwings) hoặc NodeJS (cần package: xlsx , exceljs), cùng với Selenium (hoặc một gói hổ trợ lấy dữ liệu khác) mới có thể làm được ...
Python thì Trực tiếp (cập nhật khi file đang mở) , nodeJS thì gián tiếp (cập nhật khi file đang đóng)
Search gợi ý của mình lên google - keyword:
+ Python: Xlwings , Selenium Python, Python Excel
+ NodeJS: NodeJS Excel , Selenium Nodejs, xlsx, exceljs
Website:
+ Python: https://www.python.org
+ NodeJS: https://www.nodejs.org
+ Xlwings cho Python: https://www.xlwings.org/
+ Selenium: https://www.seleniumhq.org/docs/
Để chạy nodejs (cần tải thêm Plugin Nodejs trong pycharm) và Python dùng IDE pycharm: https://www.jetbrains.com/pycharm/
Trang hỗ trợ tốt nhất hiện nay: stackoverflow.com, github, và google
Tag: Cập nhật dữ liệu, Cập nhật dữ liệu web, dữ liệu tự động, cạo website, điều khiển web , điều khiển trình duyệt, dữ liệu từ web,
dữ liệu báo cáo tài chính từ website, Lấy Dữ Liệu Từ Web Vào Excel, lấy dữ liệu từ web, dữ liệu chứng khoán, dữ liệu các công ty, dữ liệu vndirect, dữ liệu vietstock, dữ liệu cổ phiếu ,...
Những cập nhật mới:
+ Sửa lỗi tìm kiếm mã cổ phiếu.
+ Tinh chỉnh lại các nút điều hướng.
+ Thêm một số dữ liệu khác từ nguồn VietStock.
+ Ẩn trình duyệt Internet Explorer ở phiên bản Demo trước.
+ Thêm thông báo phiên bản mới của ứng dụng (nếu có).
*Lưu ý:Vì ứng dụng được phát triển trên Office 2019 nên khi mở file ở Office phiên bản từ 2010 trở về trước các Shape sẽ co dãn sai lệch.
*Ứng dụng đang trong quá trình phát triển vậy nên góp ý của các bạn là rất cần thiết.
----------------------------------------------
Những góp ý về sau luôn được sửa và cập nhật vào phiên bản cuối cùng.
Những cập nhật mới:
+ Sửa lỗi tìm kiếm mã cổ phiếu.
+ Tinh chỉnh lại các nút điều hướng.
+ Thêm một số dữ liệu khác từ nguồn VietStock.
+ Ẩn trình duyệt Internet Explorer ở phiên bản Demo trước.
+ Thêm thông báo phiên bản mới của ứng dụng (nếu có).
*Lưu ý: Vì Ứng dụng có sử dụng trình duyệt Internet Explorer để lấy dữ liệu ở một số trường hợp, nên hãy tải một Trình duyệt khác để duyệt Web, để tránh ảnh hưởng đến quá trình làm việc của mình.
*Ứng dụng đang trong quá trình phát triển vậy nên góp ý của các bạn là rất cần thiết.
----------------------------------------------
Cảm ơn bác nhiều ạ, theo em bác nên tách từ sheet Cân đối kế toán đến sheet Chỉ số tài chính thành 1 chương trình riêng ạ, cái còn lại thành 1 chương trình riêng ạ. Vì người dùng phân cơ bản thì cần dùng những sheet còn lại, còn người theo phân tích kỹ thuật thì sẽ không cần dùng những sheet về cơn bản. Như thế chương trình sẽ nhẹ hơn!
Hoặc bác cho cái tùy chọn ẩn bớt sheet đi cũng hay.
Phần quyền và sự kiện kích vào xem dữ liệu thì báo lỗi sau ạ
Trong phần chỉ số tài chính ấy. dữ liệu năm 2015 nhầm thành dữ liệu 2018, dữ liệu 2016 nhầm sang dữ liệu 2017 và ngược lại. Còn các năm trở về trước không xem được nên không kiểm tra được bác ah. Bác xem chỉnh lại giúp
Tuyệt quá, cảm ơn bạn @HeSanbi. Nhưng mà file hơi nặng, mình nghĩ bạn tách ra thành 2 file, 1 file dữ liệu tài chính và 1 file dữ liệu chứng khoán thì hay hơn. Dù sao cũng rất tuyệt vời. Cảm ơn bạn rất nhiều.