2011-05-10 73 views
4

對於公司項目,我需要使用PHP和JavaScript(包括jQuery)創建一個Web抓取應用程序,該應用程序將從我們客戶網站的每個頁面提取特定數據。抓取應用程序需要爲每個頁面獲取兩種類型的數據:1)確定是否存在具有特定ID的某些HTML元素,以及2)提取特定JavaScript變量的值。 JS變量名稱在每個頁面上都是相同的,但值通常是不同的。我相信我知道如何獲得第一個數據要求:使用PHP file_get_contents()函數獲取每個頁面的HTML,然後使用JavaScript/jQuery解析該HTML並搜索具有特定ID的元素。但是,我不確定如何獲取第二部分數據 - JavaScript變量值。甚至在每個頁面的HTML中都找不到JavaScript變量;相反,它是在鏈接到頁面的外部JavaScript文件中找到的。即使JavaScript嵌入在頁面的HTML中,我知道file_get_contents()只會提取JavaScript代碼(和其他HTML),而不是任何變量值。通過Web Scraping提取JavaScript變量值

任何人都可以提出一個很好的方法來獲得給定網站的每個頁面的這個變量值?

編輯:只是爲了澄清,我需要JavaScript代碼運行後的JavaScript變量的值。這樣的事情甚至可能嗎?

+0

它實際上最好有在外部JavaScript文件中的變量,這樣一來,你只需要認準

0

你不能使用一個js腳本來發送給你的客戶端,那個腳本會把信息發送到你的服務器上嗎?

+0

這樣做的目的是確定我們的客戶是否已將必要的JavaScript腳本添加到其網站的每個頁面。因此,如果讓他們向其網站的每個頁面添加另一個腳本以查看該頁面是否包含主腳本,則無效。 – jake 2011-05-10 19:06:55

0

您可以使用Zombie.js節點(JS)庫: http://zombie.labnotes.org/

它可以單擊鏈接,走DOM樹,並且應該能夠解析JS,因爲它是JavaScript時運行它所有。

4

你說你在JS執行後需要變量的值。我認爲它始終是相同的JS,只是初始變量值是變化的事情。你最好的選擇是將JS移植到PHP,它可以讓你提取最初的JS變量值,然後假裝你執行了JS。

下面是從JavaScript提取變量值的函數:


/** 
* extracts a variable value given its name and type. makes certain assumptions about the source, 
* i.e. can't handle strings with escaped quotes. 
* 
* @param string $jsText the JavaScript source 
* @param string $name  the name of the variable 
* @param string $type  the variable type, either 'string' (default), 'float' or 'int' 
* @return string|int|float   the extracted variable value 
*/ 
function extractVar($jsText, $name, $type = 'string') { 
    if ($type == 'string') { 
     $valueMatch = "(\"|')(.*?)(\"|')"; 
    } else { 
     $valueMatch = "([0-9.]+?)"; 
    } 

    preg_match("/$name\s*\=\s*$valueMatch/", $jsText, $matches); 
    if ($type == 'string') { 
     return $matches[2]; 
    } else if ($type == 'float') { 
     return (float)$matches[1]; 
    } else if ($type == 'int') { 
     return (int)$matches[1]; 
    } else { 
     return false; 
    } 
} 
+0

嘗試他的答案,這裏是我正在討論的正則表達式,但它將在您的刮擦過程的最後部分實施。 – dragonjet 2011-05-11 02:50:16