2008-11-04 82 views

回答

49

概述:

所有屏幕刮首先需要你想提取資源頁面的人工審覈。在處理AJAX時,你通常只需要分析一點,而不僅僅是HTML。

在處理AJAX時,這只是表示您想要的值不在您請求的初始HTML文檔中,但該JavaScript將被執行,並會要求服務器提供您想要的額外信息。

因此,您通常可以簡單地分析JavaScript並查看JavaScript所做的請求,並從頭開始調用此URL。


例子:

拿這個作爲一個例子,假設你想從具有下面的腳本來刮頁:

<script type="text/javascript"> 
function ajaxFunction() 
{ 
var xmlHttp; 
try 
    { 
    // Firefox, Opera 8.0+, Safari 
    xmlHttp=new XMLHttpRequest(); 
    } 
catch (e) 
    { 
    // Internet Explorer 
    try 
    { 
    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); 
    } 
    catch (e) 
    { 
    try 
     { 
     xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
    catch (e) 
     { 
     alert("Your browser does not support AJAX!"); 
     return false; 
     } 
    } 
    } 
    xmlHttp.onreadystatechange=function() 
    { 
    if(xmlHttp.readyState==4) 
     { 
     document.myForm.time.value=xmlHttp.responseText; 
     } 
    } 
    xmlHttp.open("GET","time.asp",true); 
    xmlHttp.send(null); 
    } 
</script> 

然後,所有你需要做的是,而不是做代替對同一服務器的time.asp的HTTP請求。 Example from w3schools


高級抓取與C++:

對於複雜的應用,如果你正在使用C++,你也可以考慮使用Firefox JavaScript引擎SpiderMonkey在頁面上執行JavaScript。

先進的Java刮:

對於複雜的應用,如果你使用的是Java,你也可以考慮使用Firefox的JavaScript引擎對Java Rhino

高級使用.NET刮:

對於複雜的用法,如果您使用的是.Net,也可以考慮使用Microsoft.vsa程序集。最近替換爲ICodeCompiler/CodeDOM。

+0

+100 !!!!像魅力一樣工作。 – Atul 2013-04-12 09:46:29

+0

哇,這是非常有用的信息,即使有像phantomjs這樣的工具現在可用,知道如何使用所述的方法自定義刮頁面,一旦你調查了幕後的感謝,很多方便的感謝Brian +1 – brendosthoughts 2013-06-20 08:55:01

2

取決於ajax頁面。屏幕抓取的第一部分是確定頁面的工作方式。是否有某種變量可以迭代以請求頁面中的所有數據?我個人使用Web Scraper Plus進行了很多與屏幕抓取相關的任務,因爲它很便宜,不難入門,非程序員可以相對快速地工作。

旁註:使用條款可能是您在執行此操作前可能需要檢查的地方。取決於遍歷所有內容的站點可能會引發一些標誌。

7

如果可以瞭解它,請嘗試檢查DOM樹。 Selenium將這作爲測試頁面的一部分。它還具有點擊按鈕和跟隨鏈接的功能,這可能很有用。

+2

在selenium客戶端腳本中,您可以使用`get_html_source()`函數,但它會返回正常源,而不是生成的(後AJAX)源。如果您知道如何訪問生成的來源,請告訴我們。 – Jabba 2011-04-13 02:31:49

1

作爲一種低成本的解決方案,您也可以嘗試SWExplorerAutomation(SWEA)。該程序爲任何使用HTML,DHTML或AJAX開發的Web應用程序創建自動化API。

0

我之前已經將MIT的溶劑和EnvJS作爲我的答案來刪除Ajax頁面。這些項目似乎不再可用。

出於絕對必要性,我發明了另一種方法來實際上刮掉Ajax頁面,並且它已經爲像findthecompany這樣的難以找到無頭javascript引擎並顯示無數據的方法工作。

該技術是使用chrome擴展來做刮擦。 Chrome擴展程序是刮掉Ajax頁面的最佳位置,因爲它們實際上允許我們訪問javascript修改的DOM。技術如下,我肯定會在某個時候開源代碼。創建一個Chrome擴展(假設你知道如何創建一個,它的結構和功能。這是很容易學習和實踐,因爲有大量的樣本),

  1. 使用內容腳本訪問DOM,通過使用XPath的。幾乎將整個列表或表格或動態呈現的內容使用xpath作爲字符串HTML節點獲取到變量中。 (只有內容腳本可以訪問DOM,但不能使用XMLHTTP聯繫URL)
  2. 從內容腳本中,使用消息傳遞將整個剝離的DOM作爲字符串發送到後臺腳本。 (後臺腳本可以與URL交談,但不能觸摸DOM)。我們使用消息傳遞來讓他們說話。
  3. 您可以使用各種事件循環瀏覽網頁,並將每個剝離的HTML節點內容傳遞給後臺腳本。
  4. 現在使用後臺腳本,與外部服務器(在本地主機上)交談,使用Nodejs/python創建一個簡單的服務器。只需將整個HTML節點作爲字符串發送到服務器,服務器只需將發佈到其中的內容持久保存到文件中,並使用適當的變量來標識頁碼或URL。
  5. 現在你已經刮掉了AJAX內容(HTML節點爲字符串),但這些都是部分html節點。現在您可以使用您最喜愛的XPATH庫將它們加載到內存中,並使用XPATH將信息轉換爲表格或文本。

請留下評論,如果你不能理解,我可以寫得更好。 ( 第一次嘗試 )。另外,我正試圖儘快發佈示例代碼。

3

使用Ajax或一般頁面使用Javascript刮取網頁的最佳方式是使用瀏覽器本身或無頭瀏覽器(無GUI的瀏覽器)。目前phantomjs是一款使用WebKit的升級無頭瀏覽器。我成功使用的另一種方法是HtmlUnit(Java或.NET通過IKVM,這是一個模擬瀏覽器。另一種已知的替代方法是使用像Selenium網絡自動化工具。

我寫了一篇關於這個問題像web scraping Ajax and Javascript sites很多文章automated browserless OAuth authentication for Twitter。在第一篇文章的最後有很多額外的資源,我自2011年以來一直在編譯。

1

我認爲Brian R. Bondy的答案在源代碼易於閱讀時很有用,我更喜歡簡單使用Wireshark或HttpAnalyzer等工具捕獲數據包,並從「主機」字段和「GET」字段獲取URL。

例如,我捕捉像一個數據包中的以下內容:

GET /hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330 
HTTP/1.1 
Accept: */* 
Referer: http://quote.hexun.com/stock/default.aspx 
Accept-Language: zh-cn 
Accept-Encoding: gzip, deflate 
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) 
Host: quote.tool.hexun.com 
Connection: Keep-Alive 

那麼URL是:

http://quote.tool.hexun.com/hqzx/quote.aspx?type=3&market=1&sorttype=3&updown=up&page=1&count=8&time=164330 
7

在我看來,simpliest解決方案是使用Casperjs的基礎上,框架WebKit無頭瀏覽器幻燈片。

整個頁面被加載,並且很容易刮掉任何與Ajax相關的數據。 您可以檢查此基礎教程學習Automating & Scraping with PhantomJS and CasperJS

您也可以給看看這個例子的代碼,就如何刮谷歌建議的關鍵字:

/*global casper:true*/ 
var casper = require('casper').create(); 
var suggestions = []; 
var word = casper.cli.get(0); 

if (!word) { 
    casper.echo('please provide a word').exit(1); 
} 

casper.start('http://www.google.com/', function() { 
    this.sendKeys('input[name=q]', word); 
}); 

casper.waitFor(function() { 
    return this.fetchText('.gsq_a table span').indexOf(word) === 0 
}, function() { 
    suggestions = this.evaluate(function() { 
     var nodes = document.querySelectorAll('.gsq_a table span'); 
     return [].map.call(nodes, function(node){ 
      return node.textContent; 
     }); 
    }); 
}); 

casper.run(function() { 
    this.echo(suggestions.join('\n')).exit(); 
}); 
1

我喜歡PhearJS,但可能是部分原因是因爲我建立了它。

也就是說,這是一個您在後臺運行的服務,它會說HTTP(S)並將頁面呈現爲JSON,包括您可能需要的任何元數據。

1

Selenium網絡驅動程序是一個很好的解決方案:你編程一個瀏覽器,並自動完成在瀏覽器中需要完成的工作。瀏覽器(Chrome,Firefox等)提供自己的驅動程序,可與Selenium一起使用。由於它作爲一個自動化的REAL瀏覽器,它的頁面(包括javascript和Ajax)會像使用該瀏覽器的人類一樣被加載。

它的缺點是速度很慢(因爲您很可能希望等到所有圖像和腳本加載之後才能在您的單頁上進行拼寫)。