通过 Web Scraping 提取 JavaScript 变量值

jak*_*ake 6 javascript php ajax jquery web-scraping

对于公司项目,我需要使用 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)而不是任何变量值。

任何人都可以提出一种为给定网站的每个页面获取此变量值的好方法吗?

编辑:只是为了澄清,在运行 JavaScript 代码后,我需要 JavaScript 变量的值。这样的事情甚至可能吗?

mwh*_*ite 5

你说你需要在 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;
    }
}
Run Code Online (Sandbox Code Playgroud)


Tra*_*ton 2

想必这是不可能的,因为它看起来很简单,但如果您要检测的是您的.js,为什么不让该 .js 通过抓取页面来执行可检测的操作呢?

使用js在某处填充这样的标签(大概是通过element.innerHTML):

<span><!--Important js thing has been activated!--></span>.   
Run Code Online (Sandbox Code Playgroud)

编辑:或者,如果脚本需要在加载时可检测到,则可以使用 document.write