返回列表 上一主題 發帖

請問如何抓取javascript的*.csv檔案?

請問如何抓取javascript的*.csv檔案?

想請教一下,我要用批次抓取網頁中的*csv檔,然後把裡面的資料放入excel的表格中,但網頁中的檔案連結是用javascript藏起來,案例如下:

http://prtr.epa.gov.tw/resultEMS.aspx?emsno=A36A0770&tab=Panel5

我打算存放的excel檔已經有管制編號列表,然後就根據這個列表去抓取需要的資料,不過在抓*csv這個地方就卡住了。

謝謝

好像是耶,我前幾天試還正常。

TOP

太感謝了!

我發現有些表格是多於一筆資料的,所以一個管制編號的資料有可能會有一筆、兩筆甚至10筆,例如這裡:

http://prtr.epa.gov.tw/resultEMS.aspx?emsno=E4901607&tab=Panel5

我爬了一下文並google,本來想用ResultRange.Rows.Count這個指令來算table的列數後,先以Range().EntireRow.insert插入所需要的列數,然後再以ResultRange.Rows(i)加入數據,但怎麼試都是空白,不知道大大有沒有好的辦法?

謝謝

TOP

太感激了,我這幾天修正了一些裡面的程式碼,讓它也可以抓別的資源。非常感謝!

順便問一下,這裡不抓csv而是抓網頁的table,是因為csv中文進來是亂碼而又無解的原因嗎?

TOP

不好意思,我是因為後來要到環保署另一個opendata網站抓csv的時候發現抓進工作表都會變成亂碼,所以才聯想到。

http://opendata.epa.gov.tw/Data/Contents/EMS/

這個網站和之前那個第一樓的網站應該是通的,但這裡csv就直接提供所有單位的管制編號,但一次提供1000筆,所以總共7萬多筆要下載71次csv檔案。

雖然我只是要最重要的管制編號,但其它都亂碼還是覺得很怪,以下是我的code,我還是初學者,用最簡單的do/loop來處理迴圈,跑到一半就卡住了,不知道出了什麼事情,多謝!
  1. Sub csv()

  2.     Dim i As Integer, k As Integer, emsUrl As String
  3.    
  4.     Set i = 0
  5.    
  6.     Set k = 1000
  7.    
  8.     emsUrl = "http://opendata.epa.gov.tw/ws/Data/EMS/?$orderby=RegistrationNo&$skip=" & i & "&$top=" & k & "&format=csv"
  9.    
  10.     With ActiveSheet.QueryTables.Add(Connection:="URL;" & emsUrl, Destination:=Range("A2"))
  11.    
  12.         .BackgroundQuery = True
  13.         .RefreshStyle = xlOverwriteCells
  14.         .RefreshPeriod = 0
  15.         .AdjustColumnWidth = False
  16.         .WebSelectionType = xlSpecifiedTables
  17.         .WebFormatting = xlWebFormattingNone
  18.          
  19.     End With
  20.    
  21. End Sub
複製代碼

TOP

抱歉,剛剛貼錯code了,但已經不能編輯:
  1. Sub csv()

  2.     Dim i As Integer, k As Integer, emsUrl As String, Rng As Range
  3.    
  4.     i = 1
  5.    
  6.     k = 1000

  7.     Do Until k = 71000

  8.     Set Rng = Sheets("Sheet1").Range("A" & i & "")

  9.     emsUrl = "http://opendata.epa.gov.tw/ws/Data/EMS/?$orderby=RegistrationNo&$skip=" & i & "&$top=" & k & "&format=csv"
  10.    
  11.     With ActiveSheet.QueryTables.Add(Connection:="URL;" & emsUrl, Destination:=Rng)
  12.    
  13.         .BackgroundQuery = True
  14.         .RefreshStyle = xlOverwriteCells
  15.         .RefreshPeriod = 0
  16.         .AdjustColumnWidth = False
  17.         .WebSelectionType = xlSpecifiedTables
  18.         .WebFormatting = xlWebFormattingNone
  19.          
  20.     End With
  21.    
  22.     i = i + 1000

  23.     k = k + 1000

  24.     Loop

  25. End Sub
複製代碼

TOP

回復 11# GBKEE

受教了,原來要用Workbooks。

另外,我在GBKEE大大幫我修正的第二個code中做了一些修正,目的是把A欄的管制編號填滿,我在第31列加了這一行:

.Resize(Q.ResultRange.Rows.Count, 1).Offset(2, -1).Value = Rng

看起來除了最後一個管制編號會多兩行尾巴之外,好像沒有其它的問題,不知道各位有沒有更好的意見或看出這樣搞會有bug?

謝謝

  1. Sub punish()
  2.     Dim Sh As Worksheet, Rng As Range, Q As Variant
  3.     Application.ScreenUpdating = False
  4.     Set Rng = Sheets("Sheet1").Range("A2")  '管制編號
  5.     On Error GoTo ER
  6.     With Sheets("管制內容")
  7.         Set Sh = Sheets(.Name)
  8.         .UsedRange = ""
  9.     End With
  10.     On Error Resume Next
  11.     With Sh.QueryTables.Add("URL;http://prtr.epa.gov.tw/resultEMS.aspx?emsno=" & Rng & "&tab=Panel5", Sh.[AA1])
  12.         .WebSelectionType = xlSpecifiedTables
  13.         .WebFormatting = xlWebFormattingNone
  14.         .WebTables = """GridView5"""
  15.         .WebPreFormattedTextToColumns = True
  16.         .WebConsecutiveDelimitersAsOne = True
  17.         .WebSingleBlockTextImport = False
  18.         .WebDisableDateRecognition = False
  19.         .WebDisableRedirections = False
  20.         .Refresh BackgroundQuery:=False
  21.     End With
  22.     Set Q = Sh.QueryTables(1)
  23.     Do While Rng <> ""
  24.         If Err = 0 And Application.Count(Q.ResultRange) > 0 Then
  25.             With Sh.Cells(Sh.Rows.Count, 2).End(xlUp)
  26.                 .Offset(1, -1) = Rng
  27.                 If .Row = 1 Then
  28.                     .Offset(, -1) = "管制編號"
  29.                     Q.ResultRange.Copy .Cells
  30.                 Else
  31.                     .Resize(Q.ResultRange.Rows.Count, 1).Offset(2, -1).Value = Rng
  32.                     Q.ResultRange.Rows("2:" & Q.ResultRange.Rows.Count).Copy .Offset(1)
  33.                     
  34.                 End If
  35.             End With
  36.         End If
  37.         Err.Clear
  38.         Set Rng = Rng.Offset(1)
  39.         Q.Connection = "URL;http://prtr.epa.gov.tw/resultEMS.aspx?emsno=" & Rng & "&tab=Panel5"
  40.         Q.Refresh BackgroundQuery:=False
  41.     Loop
  42.     Q.ResultRange = ""
  43.     With Sh
  44.         .Columns.AutoFit
  45.         For Each Q In .Names
  46.            Q.Delete
  47.         Next
  48.         For Each Q In .QueryTables
  49.            Q.Delete
  50.         Next
  51.     End With
  52.    Application.ScreenUpdating = True
  53.    Exit Sub
  54. ER:
  55.     If Err.Number = 9 Then
  56.         Sheets.Add.Name = "管制內容"
  57.         Resume
  58.     End If
  59. End Sub
複製代碼

TOP

回復 13# GBKEE

多謝,這樣跑出來的結果沒有問題了。

TOP

        靜思自在 : 原諒別人就是善待自己。
返回列表 上一主題