Board logo

標題: [發問] 想請教如何在網頁(非表格狀態)抓資料(特定字串)到EXCEL表單 [打印本頁]

作者: kuhsuanchieh    時間: 2015-9-24 18:48     標題: 想請教如何在網頁(非表格狀態)抓資料(特定字串)到EXCEL表單

已經有很多大大交過怎麼把網頁資料抓到EXCEL表單,但是好像都是抓固定的表單或相對應的欄位,
目前遇到一個問題就是想要在
http://www.tyland.org.tw/pg.asp?theme=11&kinds=2&area=&search=o&review=&model=1&meid=&absolutepage=1
這個網址中,抓取會員的資料,但是會員的資料需要再點選會員姓名後再進入另一個頁面,
http://www.tyland.org.tw/view-m.asp?mno=1
而且我只想要抓取姓名、電話、傳真、地址(開業執照地址)這4個欄位,
可以參閱一下附件,不知道這樣是否有可能一次抓完所有會員的資料。


PS:會員資料可能持續增加或更新。

[attach]22087[/attach]
作者: GBKEE    時間: 2015-9-25 08:32

回復 1# kuhsuanchieh


    試試看
  1. Option Explicit
  2. '頁數
  3. Const 頁數網址 = "http://www.tyland.org.tw/pg.asp?theme=11&kinds=2&area=&search=o&review=&model=1&meid=&absolutepage="
  4. '會號 ID
  5. Const ID = "http://www.tyland.org.tw/view-m.asp?mno="
  6. Dim Sh As Worksheet, Ie As Object
  7. Sub Ex()
  8.     Ex現在會員名錄
  9.     Ex_所有會員資料
  10. End Sub
  11. Sub Ex現在會員名錄()
  12.     Dim i As Integer, xTable As Object, r As Integer
  13.     Set Ie = CreateObject("InternetExplorer.Application")
  14.     Set Sh = Sheets(1)
  15.     With Sh
  16.         .UsedRange.Clear
  17.         .[A1:E1] = Array("ID", "姓名", "電話", "傳真", "地址")
  18.         '.[A1:D1] = Array( "姓名", "電話", "傳真", "地址")
  19.         .Activate
  20.     End With
  21.     With CreateObject("InternetExplorer.Application")
  22.       '  .Visible = True
  23.         For i = 1 To Max_Page
  24.             .Navigate 頁數網址 & i
  25.             Do While .Busy Or .readyState <> 4: DoEvents: Loop
  26.            Set xTable = .Document.all.tags("table")(0).Rows
  27.            Application.StatusBar = 頁數網址 & i & "  載入..."
  28.             For r = 1 To xTable.Length - 1
  29.                 Ex_現在會員資料 ID & xTable(r).Cells(1).INNERTEXT
  30.             Next
  31.         Next
  32.         .Quit
  33.     End With
  34.     Ie.Quit
  35.     Set Ie = Nothing
  36. End Sub
  37. Sub Ex_現在會員資料(URL As String)
  38.     Dim ID As String, i As Integer, E As Variant, ii As Integer, t As Variant, AR()
  39.     ID = "http://www.tyland.org.tw/view-m.asp?mno="
  40.     AR = Array(0, 1, 2, 3, 6) 'AR = Array( 1, 2, 3, 6) 不要"ID"
  41.     With Ie
  42.         '  .Visible = True
  43.             .Navigate URL
  44.             Do While .Busy Or .readyState <> 4: DoEvents: Loop
  45.             t = Split(.Document.BODY.INNERTEXT, vbLf)  '網頁的文字,vbLf 切割為陣列
  46.             With Sh.Range("A" & Rows.Count).End(xlUp).Offset(1)
  47.                 .Select  '可不用
  48.                 For ii = 0 To 4
  49.                     .Cells(1, ii + 1) = Split(t(AR(ii)), ":")(1)
  50.                 Next
  51.             End With
  52.       
  53.     End With
  54. End Sub
  55. Function Max_Page() As Integer  '傳回會員名錄的總頁數
  56.     Dim E As Object
  57.     With CreateObject("InternetExplorer.Application")
  58.        ' .Visible = True
  59.         .Navigate "http://www.tyland.org.tw/pg.asp?theme=11"
  60.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  61.             For Each E In .Document.all.tags("A")
  62.                 If InStr(E.INNERTEXT, "最後一頁") Then
  63.                     Max_Page = Replace(E.href, 頁數網址, "") '網頁字串最後的數字
  64.                     Exit For
  65.                 End If
  66.             Next
  67.         .Quit        '關閉網頁
  68.     End With
  69. End Function
  70. '****************************************************
  71. Sub Ex_所有會員資料()
  72.     Dim i As Integer, E As Variant, ii As Integer, t As Variant, AR()
  73.     Dim Sh As Worksheet
  74.     Set Sh = Sheets(2)
  75.     With Sh
  76.         .UsedRange.Clear
  77.         .[A1:E1] = Array("ID", "姓名", "電話", "傳真", "地址")
  78.         '.[A1:D1] = Array( "姓名", "電話", "傳真", "地址")
  79.         .Activate
  80.     End With
  81.     AR = Array(0, 1, 2, 3, 6)  'AR = Array( 1, 2, 3, 6) '不要"ID"
  82.     With CreateObject("InternetExplorer.Application")
  83.          ' .Visible = True
  84.         For i = 1 To Max_Id
  85.             .Navigate ID & i
  86.             Do While .Busy Or .readyState <> 4: DoEvents: Loop
  87.             Application.StatusBar = ID & i & "  載入..."
  88.             t = Split(.Document.BODY.INNERTEXT, vbLf)
  89.             If UBound(t) > -1 Then
  90.                 With Sh.Range("A" & Rows.Count).End(xlUp).Offset(1)
  91.                     .Select  '可不用
  92.                     For ii = 0 To 4   'For ii = 0 To 3  '不要"ID
  93.                         .Cells(1, ii + 1) = Split(t(AR(ii)), ":")(1)
  94.                     Next
  95.                 End With
  96.             End If
  97.         Next
  98.         .Quit
  99.     End With
  100. End Sub
  101. Function Max_Id() As Integer '查找最新會員的會號
  102.     Dim E As Object
  103.     With CreateObject("InternetExplorer.Application")
  104.        ' .Visible = True
  105.         .Navigate "http://www.tyland.org.tw/pg.asp?theme=11"
  106.         Do While .Busy Or .readyState <> 4: DoEvents: Loop
  107.             For Each E In .Document.all.tags("A")
  108.                 If InStr(E.INNERTEXT, "最後一頁") Then
  109.                     E.Click   '按下 "最後一頁"
  110.                     Exit For
  111.                 End If
  112.             Next
  113.            Do While .Busy Or .readyState <> 4: DoEvents: Loop
  114.            Set E = .Document.all.tags("table")(0).Rows
  115.             Max_Id = E(E.Length - 1).Cells(1).INNERTEXT  '最新會員的會號
  116.         .Quit        '關閉網頁
  117.     End With
  118. End Function
複製代碼

作者: kuhsuanchieh    時間: 2015-9-25 13:15

回復 2# GBKEE

感謝 GBKEE 版主的說明,但是我想請教中間有關「傳回會員名錄的總頁數」這個部分,
如果不要有這個動作,是否就無法全數抓回來?那我可以下
i=1 to 9999
這樣子嗎?
作者: GBKEE    時間: 2015-9-25 15:29

本帖最後由 GBKEE 於 2015-9-25 15:32 編輯

回復 3# kuhsuanchieh
  1. For i = 1 To Max_Id
  2.            .Navigate ID & i
複製代碼
Sub Ex_所有會員資料().可以改成如此,
會員號碼最後是 1407,9999會多跑很久的
  1. For i = 1 To 9999
  2.            .Navigate ID & i
複製代碼

作者: 准提部林    時間: 2015-9-25 15:45

超版對網頁非常專業,程式也慎求〔正確完整〕及〔效率〕,
取得〔頁數〕及〔最大ID〕才可做最小的迴圈,認真負責的工程師才會這樣不厭勞煩,佩服!!!
 
 
提供另個不專業參考:
  1. Sub TEST()
  2. Dim UL$, STR, FN&, j&, k%, Arr, X&, N&, TM
  3. TM = Time
  4. [Sheet1!A:E].ClearContents: [F1] = ""
  5. [Sheet1!A1:E1] = Array("ID", "姓名", "電話", "傳真", "地址")
  6.  
  7. '↓取得〔總頁數〕
  8. STR = 網頁原始碼("http://www.tyland.org.tw/pg.asp?theme=11")
  9. STR = Split(Split(STR, ">最後一頁")(0), "absolutepage=")
  10. FN = STR(UBound(STR))
  11.  
  12. '↓取得〔最大ID編號〕
  13. UL = "http://www.tyland.org.tw/pg.asp?theme=11&kinds=2&area=&search=o&review=&model=1&meid=&absolutepage="
  14. STR = 網頁原始碼(UL & FN)
  15. STR = Split(STR, "view-m.asp?mno=")
  16. FN = Split(STR(UBound(STR)), "'>")(0)
  17.  
  18. '↓開始擷取資料(含所有資料)
  19. ReDim Arr(1 To FN, 1 To 5)
  20. For j = 1 To FN
  21.   Application.StatusBar = "■■■■■■資料擷取中:" & j & "/" & FN
  22.   STR = 網頁原始碼("http://www.tyland.org.tw/view-m.asp?mno=" & j)
  23.   If Len(STR) = 0 Then GoTo 101
  24.   X = InStr(STR, "<li>會  號:")
  25.   If X = 0 Then GoTo 101
  26.   STR = Split(Mid(STR, X), "</li>")
  27.  
  28.   N = N + 1
  29.   For k = 1 To 4 'ID.姓名.電話.傳真
  30.     Arr(N, k) = Trim(Split(STR(k - 1), ":")(1))
  31.   Next k
  32.   Arr(N, 5) = Trim(Split(STR(6), ":")(1)) '地址
  33. 101: Next j
  34.  
  35. If N > 0 Then [A2:E2].Resize(N) = Arr
  36. [Sheet1!F1] = Format(Time - TM, "hh:mm:ss")
  37. Application.StatusBar = False
  38. Beep
  39. End Sub
  40.  
  41.  
  42. '=============副程式
  43. Function 網頁原始碼(xURL$) As String
  44. On Error Resume Next
  45. With CreateObject("MSXML2.XMLHTTP")
  46.      .Open "POST", xURL, False
  47.      .send
  48.      網頁原始碼 = .ResponseText
  49. End With
  50. On Error GoTo 0
  51. End Function
複製代碼
 
載點1:[attach]22092[/attach]
載點2:http://www.funp.net/840179
作者: GBKEE    時間: 2015-9-26 10:34

本帖最後由 GBKEE 於 2015-9-26 10:35 編輯

回復 5# 准提部林

愛說笑了版主程式碼,快太多了.
CreateObject("MSXML2.XMLHTTP")本文傳送完,ie還在開啟等候中...
作者: kuhsuanchieh    時間: 2015-9-30 12:47

回復 5# 准提部林


看完兩位的程式,小弟只能說五體投地的佩服,

再加上那個時間,我不禁笑出來了!

感謝兩位大大的指導,我看我又要好好研究一兩個禮拜了!





歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)