Lấy dữ liệu từ web vào excel bằng vba

Tôi đang cố gắng cạo dữ liệu từ trang web: http://uk.investing.com/rates-bonds/fin finance-notify trải qua vba, như giá thời hạn thực, ví dụ như 5 giờ Đức YR Bobl, US TY Bond 30Y, tôi đã thử truy vấn web Excel cơ mà nó chỉ xóa toàn thể trang web, tuy thế tôi chỉ muốn loại trừ tỷ lệ này, bao gồm cách nào để làm điều này không?


Có một số phương pháp để làm điều này. Đây là một trong những câu vấn đáp mà tôi viết hi vọng rằng tất cả các điều cơ bạn dạng về auto hóa mạng internet Explorer sẽ được tìm thấy khi duyệt những từ khóa "lấy dữ liệu từ trang web", dẫu vậy hãy nhớ rằng không có gì đáng để nghiên cứu của riêng bạn mã viết sẵn mà các bạn không thể tùy chỉnh).

Bạn đang xem: Lấy dữ liệu từ web vào excel bằng vba

Xin xem xét rằng phía trên là một phương pháp , nhưng tôi không ưa thích về hiệu suất (vì nó dựa vào vào tốc độ trình duyệt) nhưng điều này là giỏi để hiểu vì sao căn phiên bản của auto hóa Internet.

1) trường hợp tôi yêu cầu duyệt web, tôi bắt buộc một trình duyệt! bởi vì vậy, tôi chế tác một trình coi sóc Internet Explorer:

Dim appIE As ObjectSet appIE = CreateObject("internetexplorer.application")2) Tôi yêu mong trình coi xét duyệt website mục tiêu. Thông qua việc sử dụng thuộc tính ".Visible", tôi ra quyết định xem tôi cũng muốn xem trình coi ngó thực hiện các bước của mình tốt không. Khi xuất bản mã là tốt nhất để tất cả Visible = True, cơ mà khi mã đang chuyển động để quét tài liệu thì thiệt tuyệt khi không thấy nó gần như lúc cần Visible = False. 

With appIE .Navigate "http://uk.investing.com/rates-bonds/financial-futures" .Visible = TrueEnd With3) trang web sẽ nên một chút thời gian để tải. Bởi vì vậy, tôi đã đợi trong những lúc nó sẽ bận ...

Do While appIE.Busy DoEventsLoop4) Vâng, hiện nay trang đã được tải. Trả sử tôi ý muốn xóa thay đổi của T-Bond US30Y: Điều tôi đã làm chỉ nên nhấp vào F12 trên internet Explorer để thấy mã của website và cho nên vì thế sử dụng bé trỏ (trong vòng tròn màu sắc đỏ) tôi đang nhấp vào yếu tố nhưng mà tôi ý muốn cạo giúp thấy làm nỗ lực nào tôi rất có thể đạt được mục đích của mình. 

*

5) đa số gì tôi nên làm là trực tiếp thắn. Trước hết, tôi vẫn nhận được bằng thuộc tính ID bộ phận tr bao gồm chứa giá trị:

Set allRowOfData = appIE.document.getElementById("pair_8907")Ở phía trên tôi sẽ nhận ra một tập hợp các bộ phận td (cụ thể, tr là một hàng dữ liệu và td là các ô của nó. Chúng tôi đang tìm kiếm kiếm phần 8, bởi vậy tôi đang viết:

Dim myValue As String: myValue = allRowOfData.Cells(7).innerHTMLTại sao tôi viết 7 thay vày 8? Do những tập hợp các ô bắt đầu từ 0, nên có thể số của phần tử thứ 8 là 7 (8-1). đối chiếu ngắn chiếc mã này:

.Cells() tạo nên tôi truy cập các bộ phận td;innerHTML là nằm trong tính của ô đựng giá trị họ tìm kiếm. 

Khi shop chúng tôi có cực hiếm của mình, hiện tại được tàng trữ vào thay đổi myValue, cửa hàng chúng tôi có thể đóng trình duyệt IE và giải phóng bộ nhớ bằng cách đặt nó thành không có gì:

appIE.QuitSet appIE = NothingChà, bây giờ bạn đã sở hữu giá trị của chính bản thân mình và chúng ta cũng có thể làm bất cứ điều gì bạn muốn với nó: đặt nó vào một trong những ô (Range("A1").Value = myValue) hoặc vào một trong những nhãn gồm dạng (Me.label1.Text = myValue).

Tôi chỉ mong mỏi chỉ ra cho chính mình rằng đây chưa hẳn là phương pháp StackOverflow hoạt động: ở đây bạn đăng câu hỏi về những vấn đề mã hóa rứa thể, mà lại trước tiên bạn nên triển khai tìm kiếm của riêng mình. Nguyên nhân tại sao tôi vấn đáp một thắc mắc không thể hiện quá nhiều nỗ lực nghiên cứu chỉ là tôi thấy nó đang hỏi nhiều lần và quay lại thời điểm tôi học giải pháp làm điều này, tôi nhớ rằng tôi sẽ thích gồm một số xuất sắc hơn hỗ trợ để ban đầu với. Do vậy, tôi hi vọng rằng câu vấn đáp này, chỉ là "đầu vào nghiên cứu" và chưa hẳn là chiến thuật tốt nhất/đầy đủ nhất, có thể là một hỗ trợ cho người dùng tiếp theo chạm chán vấn đề tương tự như của bạn. Bởi vì tôi đang học được giải pháp lập trình nhờ vào vào cộng đồng này cùng tôi mong muốn nghĩ rằng chúng ta và những người mới bắt đầu khác có thể sử dụng nguồn vào của tôi để mày mò thế giới lập trình hay đẹp. 

Tận hưởng thực hành của bạn;) 


Các cách thức khác đã làm được đề cập do vậy chúng ta hãy xác định rằng, tại thời gian viết, bọn họ đang ở nạm kỷ 21. Hãy đỗ bus cục bộ mở trình phê duyệt và bay cùng với XMLHTTP GET request (viết tắt là XHR GET).

Khoảnh khắc Wiki:

XHR là một trong API sống dạng đối tượng người sử dụng có cách thức truyền tài liệu giữa trình chăm chút web và máy chủ web. Đối tượng được cung cấp bởi môi trường thiên nhiên JavaScript của trình duyệt

Đây là một phương thức nhanh nhằm truy xuất dữ liệu không yêu mong mở trình duyệt. Bội phản hồi của sản phẩm chủ hoàn toàn có thể được phát âm vào HTMLDocument và quá trình lấy bảng tiếp tục từ đó.

Xem thêm: 12 Cung Hoàng Đạo Là Ai Trong Chiến Binh Nụ Cười, Ghim Trên Chiến Binh Nụ Cười

Trong đoạn mã dưới đây, bảng được lấy do id cr1 của nó.

 

*

Trong phần phụ của trình trợ giúp, WriteTable, shop chúng tôi lặp những cột (thẻ td) và kế tiếp là những hàng của bảng (thẻ tr) và ở đầu cuối đi qua chiều lâu năm của mỗi mặt hàng của bảng, ô của bảng theo ô. Vì cửa hàng chúng tôi chỉ muốn dữ liệu từ cột 1 và 8, nên áp dụng câu lệnh Select Case chỉ định ngôn từ được ghi ra trang tính.

Xem website mẫu:

 

*

Đầu ra mã mẫu:

 

*

VBA:

Option ExplicitPublic Sub GetRates() Dim sResponse As String, html As New HTMLDocument " References > HTML Object Library Dim hTable As HTMLTable Application.ScreenUpdating = False With CreateObject("MSXML2.XMLHTTP") .Open "GET", "https://uk.investing.com/rates-bonds/financial-futures", False .setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT" .send sResponse = StrConv(.responseBody, vbUnicode) end With sResponse = Mid$(sResponse, InStr(1, sResponse, "
Tôi vẫn sửa đổi một vài thứ mở ra lỗi cho tôi và xong xuôi với điều đó rất có ích để trích xuất tài liệu khi tôi cần:

Sub get_data_web()Dim appIE As ObjectSet appIE = CreateObject("internetexplorer.application")With appIE .navigate "https://finance.yahoo.com/quote/NQ%3DF/futures?p=NQ%3DF" .Visible = TrueEnd WithDo While appIE.Busy DoEventsLoopSet allRowofData = appIE.document.getElementsByClassName("Ta(end) BdT Bdc($c-fuji-grey-c) H(36px)")Dim i As LongDim myValue As StringCount = 1 For Each itm In allRowofData For i = 0 lớn 4 myValue = itm.Cells(i).innerText ActiveSheet.Cells(Count, i + 1).Value = myValue Next Count = Count + 1 NextappIE.QuitSet appIE = NothingEnd Sub
Câu hỏi này hỏi từ khóa lâu trước đây. Tuy thế tôi nghĩ rằng thông tin sau đây sẽ hữu ích cho người mới. Bên trên thực tế chúng ta có thể dễ dàng nhấn được những giá trị từ tên lớp như vậy này.

Sub ExtractLastValue()Set objIE = CreateObject("InternetExplorer.Application")objIE.Top = 0objIE.Left = 0objIE.Width = 800objIE.Height = 600objIE.Visible = TrueobjIE.Navigate ("https://uk.investing.com/rates-bonds/financial-futures/")DoDoEventsLoop Until objIE.readystate = 4MsgBox objIE.document.getElementsByClassName("pid-8907-last")(0).innerTextEnd SubVà nếu bạn chưa thân quen với việc quét web, vui mừng đọc bài đăng trên blog này.

Quét website - tư tưởng cơ bản

Và cũng có khá nhiều kỹ thuật không giống nhau để trích xuất dữ liệu từ các trang web. Nội dung bài viết này lý giải một vài trong những họ với các ví dụ.

Quét web - tích lũy dữ liệu xuất phát điểm từ một trang web


Làm giải pháp nào nhằm khai báo một biến cục bộ trong VBA?

Chức năng đổi khác số cột thành chữ?

Chỉ coppy giá trị dán VBA của Excel (xlPasteValues)

Làm cố nào để tạm dừng trong khoảng thời gian cụ thể? (Excel/VBA)

Làm vắt nào nhằm chặn cảnh báo Liên kết cập nhật?

Kiểm tra hoặc soát sổ nếu tờ tồn tại

Tùy chọn .NumberFormat trong VBA Excel là gì?

VBA Excel 2013 Xóa toàn bộ các cỗ lọc macro

VBA - Range.Row.Count

Lỗi thời gian chạy VBA 1004 "Lỗi do áp dụng hoặc do đối tượng người dùng xác định" khi chọn Phạm vi

Biên giới xung quanh mỗi ô vào một phạm vi

Excel Macro: Làm phương pháp nào tôi hoàn toàn có thể lấy dấu thời hạn ở định dạng "yyyy-MM-dd hh: mm: ss"?

"Không thể search thấy dự án công trình hoặc Thư viện" đến các công dụng VBA tiêu chuẩn

VBA (Excel) Khởi tạo toàn bộ mảng không tồn tại vòng lặp

Thanh quy trình trong VBA Excel

Kiểm tra VBA nếu như tập tin tồn tại

Làm vắt nào nhằm xóa toàn bộ mảng?

Lặp lại qua từng ô trong một phạm vi ô khi được hỗ trợ một đối tượng Phạm vi

Làm cách nào tôi hoàn toàn có thể tô màu các chấm vào biểu trang bị phân tán xy theo quý giá cột?

Ứng dụng Excel VBA giới hạn tự phạt với thông báo "Việc thực hiện mã đã biết thành tạm dừng"