Lấy dữ liệu web về excel

huybo

Thành viên hoạt động
Tham gia ngày
24 Tháng tư 2013
Bài viết
109
Thích
4
Điểm
370
Tuổi
33
#1
Xin chào các anh chị!
Hiện tại em đang dùng macro để lấy dữ liệu trên web ( Data- From Web) nhưng không ổn định, chậm, và hình như phụ thuộc nhiều vào việc web đó có cho phép hay không. Qua tìm hiểu em thấy mọi người có dùng CreateObject("MSXML2.ServerXMLHTTP") nhưng em tìm hiểu về nó mà ít thông tin quá và trình gà nên không hiểu.
Kính mong anh chị giúp đỡ qua 1 ví dụ cụ thể là trang web này ạ: http://s.cafef.vn/bao-cao-tai-chinh...-cong-ty-co-phan-dau-tu-va-thuong-mai-tng.chn
Em xin chân thành cảm ơn!
 
Tham gia ngày
1 Tháng mười một 2018
Bài viết
4
Thích
1
Điểm
15
Tuổi
33
#3
Với trang như này thì dễ mà bạn, bạn thử dùng tính năng Query đi, thao tác như sau: vào tab DATA chọn NEW QUERY > FROM OTHER SOURCES > FROM WEB, sau đó điền link trên vào

kết quả sẽ như file đính kèm này

chúc bạn thành công
 

File đính kèm

huybo

Thành viên hoạt động
Tham gia ngày
24 Tháng tư 2013
Bài viết
109
Thích
4
Điểm
370
Tuổi
33
#4
Cám ơn bác Phương. Dùng tính năng Query như em đã nói rồi đó ạ. Em làm macro để dùng Query nhưng không ổn định, và còn tuỳ thuộc vào web đó có cho mình lấy hay ko. Nên em mới đổi hướng sang dùng CreateObject("MSXML2.ServerXMLHTTP") để trang web nào cũng có thể lấy được
 

AnhThu-1976

Thành viên tích cực
Tham gia ngày
17 Tháng mười 2014
Bài viết
503
Thích
49
Điểm
210
#5
Với trang như này thì dễ mà bạn, bạn thử dùng tính năng Query đi, thao tác như sau: vào tab DATA chọn NEW QUERY > FROM OTHER SOURCES > FROM WEB, sau đó điền link trên vào
Bạn cho hỏi, các menu này có trên excel 2010 không?
Nếu có bạn có thể hướng dẫn chi tiết được không?
Xin cảm ơn!
 

huybo

Thành viên hoạt động
Tham gia ngày
24 Tháng tư 2013
Bài viết
109
Thích
4
Điểm
370
Tuổi
33
#6
Bạn cho hỏi, các menu này có trên excel 2010 không?
Nếu có bạn có thể hướng dẫn chi tiết được không?
Xin cảm ơn!
Bác vào Data -> From Web. rồi dán đường link vào. kích các nút mũi tên vào phần muốn lấy là được ạ
Bài đã được tự động gộp:

Các bác giúp em với!
 

batman1

Thành viên tích cực
Tham gia ngày
8 Tháng chín 2014
Bài viết
1,245
Thích
2,010
Điểm
360
#7
Những bài loại này có rồi, tìm và đọc thôi.

Muốn lấy gì cụ thể thì phải nói chứ trên trang có vô vàn dữ liệu. Đừng bắt người khác phải đoán khi mình có thể nói rõ.

Nếu lấy khoảng sau dòng Từ quý I/2015 BCTC được hiển thị theo thông tư 200 của Bộ tài chính thì vd. chạy Sub GetTable
 

File đính kèm

huybo

Thành viên hoạt động
Tham gia ngày
24 Tháng tư 2013
Bài viết
109
Thích
4
Điểm
370
Tuổi
33
#9
Những bài loại này có rồi, tìm và đọc thôi.

Muốn lấy gì cụ thể thì phải nói chứ trên trang có vô vàn dữ liệu. Đừng bắt người khác phải đoán khi mình có thể nói rõ.

Nếu lấy khoảng sau dòng Từ quý I/2015 BCTC được hiển thị theo thông tư 200 của Bộ tài chính thì vd. chạy Sub GetTable
Em xin lỗi bác, xin lỗi mọi người là đã để mọi người phải đoán mò. Nội dung em định lấy thì đúng như bác làm giúp em rồi ạ. Em sẽ mày mò Code của bác để còn áp dụng Web khác. Có gì chưa hiểu em xin phép được hỏi thêm ạ. Em chân thành cảm ơn!
Bài đã được tự động gộp:

Lúc đầu tôi cũng mày mò nhưng kết quả không được như bài 3 nên mới hỏi!
Hình như đấy là add in mới hay sao ý bác ạ. Nhưng bác dùng cái của bác batman1 ý. Phê lắm!
 

huybo

Thành viên hoạt động
Tham gia ngày
24 Tháng tư 2013
Bài viết
109
Thích
4
Điểm
370
Tuổi
33
#11
Tham gia ngày
1 Tháng mười một 2018
Bài viết
4
Thích
1
Điểm
15
Tuổi
33
#12
cả trang có mỗi 1 bảng thôi mà bác, cái khó là nó có cái dấu + ở bên trái, cứ phải bấm vào nó mới ra phần bị ẩn đi, mà cái chỗ bị ẩn đi đó mới là chỗ cần thiết nhất
 

huybo

Thành viên hoạt động
Tham gia ngày
24 Tháng tư 2013
Bài viết
109
Thích
4
Điểm
370
Tuổi
33
#13
cả trang có mỗi 1 bảng thôi mà bác, cái khó là nó có cái dấu + ở bên trái, cứ phải bấm vào nó mới ra phần bị ẩn đi, mà cái chỗ bị ẩn đi đó mới là chỗ cần thiết nhất
Bác viết 1 bài nêu vấn đề của bác đi. Các bác ở đây giúp đỡ ngay đó ạ.
 

hoanganhvo2612

Thành viên hoạt động
Tham gia ngày
15 Tháng mười một 2016
Bài viết
128
Thích
52
Điểm
180
#14
Bác viết 1 bài nêu vấn đề của bác đi. Các bác ở đây giúp đỡ ngay đó ạ.
Thì bạn ấy muốn lấy dữ liệu bảng dữ liệu của web đó rành rành còn gì. Cái web này không dễ lấy dữ liệu bằng code VBA, chắc phải dùng ngôn ngữ khác + javascript
 

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
3,861
Thích
9,205
Điểm
860
#15
Không có ngôn ngữ hay công cụ lập trình nào lấy được tất cả dữ liệu mà bạn muốn đâu, trừ khi bạn có account vào database của web!
Nguyên lý các cách lấy dữ liệu trên web là chỉ có thể lấy tối đa những gì bạn nhìn thấy trên web, bản chất bạn đang lấy dữ liệu của client chứ không phải từ database server. Nên đừng nhọc công tìm kiếm cách lấy chủ động hết dữ liệu nhé.
 
Tham gia ngày
6 Tháng một 2011
Bài viết
8,109
Thích
9,050
Điểm
560
#16

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
3,861
Thích
9,205
Điểm
860
#17
Bạn ở bài #10 (#12) cũng chỉ cần lấy những gì nhìn thấy trên website đó mà anh.

Anh làm giúp bài đó đi, cho em và mọi người tham khảo với.
CÓ một ý của bạn đó "cứ phải nhấn vào dấu "+" mới lại lấy tiếp được dữ liệu" => Đây chính là lúc ta mới nhìn thấy :). Còn khi chưa nhấn nút đó thì dữ liệu vẫn nằm trên Server.

Nguyên lý của làm web người ta sẽ dựa vào lệnh gọi từ Client/Web để trả về dữ liệu cho máy tính, lúc này các tool hay code kiếc mới có cơ hội để đọc HTML lấy dữ liệu trong cấu trúc TABLE (nới mã web đã nhận từ server). Vậy nên bản chất vẫn là chỉ lấy được những gì đã nhìn hoặc đã click.

Có một cách làm khá tiểu xảo là chạy đoạn JavaScript để chạy cái tên sự kịc "Click" với điều kiện biết tên lệnh gọi đó. Cho lệnh JavaScript này vào vòng lặp tới lần click thứ n :).
 
Tham gia ngày
6 Tháng một 2011
Bài viết
8,109
Thích
9,050
Điểm
560
#18
CÓ một ý của bạn đó "cứ phải nhấn vào dấu "+" mới lại lấy tiếp được dữ liệu" => Đây chính là lúc ta mới nhìn thấy :). Còn khi chưa nhấn nút đó thì dữ liệu vẫn nằm trên Server.

Nguyên lý của làm web người ta sẽ dựa vào lệnh gọi từ Client/Web để trả về dữ liệu cho máy tính, lúc này các tool hay code kiếc mới có cơ hội để đọc HTML lấy dữ liệu trong cấu trúc TABLE (nới mã web đã nhận từ server). Vậy nên bản chất vẫn là chỉ lấy được những gì đã nhìn hoặc đã click.

Có một cách làm khá tiểu xảo là chạy đoạn JavaScript để chạy cái tên sự kịc "Click" với điều kiện biết tên lệnh gọi đó. Cho lệnh JavaScript này vào vòng lặp tới lần click thứ n :).
Anh viết code lấy dữ liệu trang web đó đi.

Thực sự em rất muốn tham khảo bài giải cụ thể cho website kia.
 

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
3,861
Thích
9,205
Điểm
860
#19
Anh viết code lấy dữ liệu trang web đó đi.

Thực sự em rất muốn tham khảo bài giải cụ thể cho website kia.
Cách đây khoảng 1-2 tháng mình đã giúp một bạn code VBA để lấy dữ liệu từ web về mà bây giwof tìm lại mà không thấy. Bạn tìm giúp mình để lấy mã nguồn nhé.
Bài đã được tự động gộp:

Code VBA để lấy dữ liệu từ website CafeF về đây nhé.

Mã:
Public Sub GetdataKLKhopLenh(ByVal StockSticker As String, ByVal getondate As String)
    Dim qrytbl As QueryTable
    Dim qrytbls As QueryTables
    Dim Connstr As String
    Dim bflag As Boolean
  
    DeleteAllQry
  
    Connstr = "URL;http://s.cafef.vn/Lich-su-giao-dich-" & StockSticker & "-6.chn?date=" & getondate
  
    Set qrytbls = ActiveSheet.QueryTables
    Set qrytbl = qrytbls.Add(Connection:=Connstr, Destination:=Range("A5"))
        qrytbl.AdjustColumnWidth = True
        qrytbl.FillAdjacentFormulas = True
        qrytbl.FieldNames = True
        qrytbl.RowNumbers = False
        qrytbl.FillAdjacentFormulas = True
        qrytbl.PreserveFormatting = False
        qrytbl.RefreshOnFileOpen = True
        qrytbl.BackgroundQuery = True
        qrytbl.RefreshStyle = xlInsertDeleteCells
        qrytbl.SavePassword = False
        qrytbl.SaveData = True
        qrytbl.RefreshPeriod = 1    '1 minute period to refresh data
        qrytbl.WebSelectionType = xlSpecifiedTables
        qrytbl.WebFormatting = xlWebFormattingNone 'xlWebFormattingAll '
        qrytbl.WebTables = """GirdTable2"",""tblData"""
        qrytbl.WebPreFormattedTextToColumns = False
        qrytbl.WebConsecutiveDelimitersAsOne = True  'false
        qrytbl.WebSingleBlockTextImport = True 'False
        qrytbl.WebDisableDateRecognition = False
        qrytbl.WebDisableRedirections = False
        qrytbl.Refresh BackgroundQuery:=True
End Sub
'----------------------------------------------'
Sub DeleteAllQry()
    Dim qry As QueryTable
    For Each qry In ActiveSheet.QueryTables
        qry.ResultRange.ClearContents
        qry.Delete
    Next
End Sub
 
Lần chỉnh sửa cuối:
Top