2016-03-19 34 views
0

我試圖抓取一個網站,要求您向下滾動,當它觸及底部,加載更多的項目。它的有限數量的項目,所以我知道它不會永遠滾動,但有沒有這樣做的方法,而無需與瀏覽器對象交互。需要用戶交互的網頁抓取

我試圖在VB/VBA中完成這一任務,但任何語言都可以。現在,我在MS Access中模板化它,只是爲了感受網站的反應,我可以通過瀏覽器控件加載它,但它笨重。最好是我可以做一個HTTP調用。

在一個側面說明,他們是否有任何好的網頁抓取教程他們我應該看?

在此先感謝。

+0

請在您的問題目標頁面URL中發帖,並說明您需要的數據或您擁有的代碼。 – omegastripes

+0

https://ibotta.com/rebates – Delecron

+0

我的唯一回應「我們找不到任何所有回扣 嘗試使用更少的過濾器。」。關於如何使XHR查看[this](http://stackoverflow.com/a/35700277/2165759)。 – omegastripes

回答

0

我第一次看到XHRs在Chrome瀏覽器 - 開發工具 - 網絡選項卡中顯示位於2個文件中的所有必要數據:retailers.json(15.7 kB)和offers.json(299 kB)。當您向下滾動頁面時實際上沒有下載任何其他數據,因此我得出結論:頁面上的腳本只是從已下載的文件中獲取數據並將項目放入頁面。我檢查參數和XHR時的標題,並創建了以下簡單的VBS,其下載文件:

strZipCode = "11590" ' your zip code here 
strPathRetailers = "C:\retailers.json" ' retailers output file path 
strPathOffers = "C:\offers.json" ' offers output file path 

' make XHR to retrieve initial page with X-App-Token and X-NewRelic-ID 
strURL = "https://ibotta.com/rebates" 
XmlHttpRequest "GET", strURL, "", "", "", strResp 

' extract X-App-Token eg 'loader_config={xpid:"VQAHUlVUGwcJUlBWBQg="}' 
arrTmp = Split(strResp, "loader_config={xpid:""", 2) 
strTmp = arrTmp(1) 
arrTmp = Split(strTmp, """}", 2) 
strNewRelicID = arrTmp(0) 

' extract X-NewRelic-ID eg '<meta name="ibotta-t" content="nce0dc967myuho7wco:1458857196:91bf12dcd5442cf6b2100c962c656a510738150a">' 
arrTmp = Split(strResp, "<meta name=""ibotta-t"" content=""", 2) 
strTmp = arrTmp(1) 
arrTmp = Split(strTmp, """>", 2) 
strAppToken = arrTmp(0) 

' put headers to array 
arrHeaders = Array(_ 
    Array("Accept", "application/json, text/javascript"), _ 
    Array("Accept-Encoding", "deflate"), _ 
    Array("Accept-Language", "en-US,en;q=0.5"), _ 
    Array("Connection", "keep-alive"), _ 
    Array("Host", "ibotta.com"), _ 
    Array("If-Modified-Since", "Thu, 1 Jan 1970 10:00:00 GMT"), _ 
    Array("Referer", "https", "//ibotta.com/rebates"), _ 
    Array("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:38.0) Gecko/20100101 Firefox/38.0"), _ 
    Array("X-App-Token", strAppToken), _ 
    Array("X-App-Version", "3.6:webapp"), _ 
    Array("X-NewRelic-ID", strNewRelicID), _ 
    Array("X-Requested-With", "XMLHttpRequest") _ 
) 

' make XHR to retrieve retailers 
strURL = "https://ibotta.com/web_v1/retailers.json?zip=" & strZipCode 
XmlHttpRequest "GET", strURL, arrHeaders, "", "", strResp 
' save retailers to file 
WriteTextFile strResp, strPathRetailers, -1 

' make XHR to retrieve offers 
strURL = "https://ibotta.com/web_v1/offers.json" 
XmlHttpRequest "GET", strURL, arrHeaders, "", "", strResp 
' save offers to file 
WriteTextFile strResp, strPathOffers, -1 

Sub XmlHttpRequest(strMethod, strURL, arrSetHeaders, strFormData, strRespHeaders, strRespText) 
    Dim arrHeader 
    With CreateObject("Msxml2.ServerXMLHTTP") 
     .SetOption 2, 13056 ' SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS 
     .Open strMethod, strURL, False 
     If IsArray(arrSetHeaders) Then 
      For Each arrHeader In arrSetHeaders 
       .SetRequestHeader arrHeader(0), arrHeader(1) 
      Next 
     End If 
     .Send strFormData 
     strRespHeaders = .GetAllResponseHeaders 
     strRespText = .ResponseText 
    End With 
End Sub 

Sub WriteTextFile(strContent, strPath, lngFormat) 
    ' lngFormat -2 - System default, -1 - Unicode, 0 - ASCII 
    With CreateObject("Scripting.FileSystemObject").OpenTextFile(strPath, 2, True, lngFormat) 
     .Write (strContent) 
     .Close 
    End With 
End Sub 

您可以將這段代碼保存到文本文件聖維特.vbs擴展和運行。

目前我可以看到共有857個報價和220個零售商,郵編11590(使用JSON查看器,如Chrome中內置或通過web service)。如果您只想處理郵政編碼11590的優惠,那麼您必須獲得零售商的列表id,並僅篩選屬於列表中零售商的優惠。

有零售商截圖,他們每個人都有id(概述紅色):

retailers

而且有提供的截圖,他們每個人屬於多個零售商retailer_ids(用紅色標出也) :

offers

進一步處理取決於你所需要的。您可以將JSON字符串解析爲對象並進行交互,或將JSON字符串轉換爲Recordset以對其進行過濾。