2011-05-10 39 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