抓取 javascript 生成的网页数据

Posted

技术标签:

【中文标题】抓取 javascript 生成的网页数据【英文标题】:Scrape web page data generated by javascript 【发布时间】:2012-09-19 19:12:32 【问题描述】:

我的问题是:如何从该网站http://vtis.vn/index.aspx 抓取数据但是直到您单击例如“Danh sách chậm”时才会显示数据。我已经非常努力和仔细地尝试过,当您单击“Danh sách chậm”时,这是触发一些 javascript 函数的 onclick 事件,其中一个 js 函数是从服务器获取数据并将其插入标签/占位符并在此时您可以使用 Firefox 之类的工具来检查数据,是的,数据会在网页上显示给用户/查看者。再说一遍,我们如何以编程方式废弃这些数据?

我写了一个报废功能,但它当然没有得到我想要的数据,因为在我点击按钮“Danh sách chậm”之前数据不可用

<?php
$Page = file_get_contents('http://vtis.vn/index.aspx');
$dom_document = new DOMDocument();
$dom_document->loadhtml($Page);
$dom_xpath_admin = new DOMXpath($dom_document_admin);
$elements = $dom_xpath->query("*//td[@class='IconMenuColumn']");
foreach ($elements as $element) 
    $nodes = $element->childNodes;
    foreach ($nodes as $node) 
        echo mb_convert_encoding($node->c14n(), 'iso-8859-1', mb_detect_encoding($content, 'UTF-8', true));
    

【问题讨论】:

可能需要使用 phantomjs 之类的东西来“点击”按钮。尽管您确实应该不惜一切代价避免“抓取”数据。 我认为您的回答没有帮助,但无论如何感谢。我抓取数据是因为它属于公众或纳税人,并且只是通过不同的方式将其提供给公众。 然后按照我的建议做,使用 phantomjs 之类的东西并编写浏览器脚本。您所说的数据很可能是通过 AJAX 获取的。您将不得不模拟一次点击,等待 AJAX 更新页面,然后对其进行 scape。我不知道这没有帮助。 谢谢,phantomjs 是一个可能的解决方案。 【参考方案1】:

你需要看PhantomJS。

来自他们的网站:

PhantomJS 是一个带有 JavaScript API 的无头 WebKit。它具有快速和 对各种 Web 标准的原生支持:DOM 处理、CSS 选择器、 JSON、Canvas 和 SVG。

使用 API,您可以编写“浏览器”脚本以与该页面交互并抓取您需要的数据。然后你可以用它做任何你需要的事情;如有必要,包括将其传递给 PHP 脚本。


话虽如此,如果可能的话,尽量不要“抓取”数据。如果页面正在进行 ajax 调用,也许您可​​以使用 API?如果没有,也许你可以说服他们做一个。这当然比屏幕抓取更容易且更易于维护。

【讨论】:

我同意,感谢您的帮助。如果我得到任何结果,我会回复。【参考方案2】:

首先,您需要PhantomJS。建议在 Linux 上的安装方法:

wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
tar xvf phantomjs-2.1.1-linux-x86_64.tar.bz2
cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin

其次,您需要php-phantomjs package。假设你已经安装了Composer:

composer require jonnyw/php-phantomjs

或关注installation documentation here。

第三,将包加载到您的脚本中,而不是file_get_contents,您将通过 PhantomJS 加载页面

<?php
require ('vendor/autoload.php');

$client = Client::getInstance();
$client->getEngine()->setPath('/usr/local/bin/phantomjs');
$client = Client::getInstance();
$request  = $client->getMessageFactory()->createRequest();
$response = $client->getMessageFactory()->createResponse();

$request->setMethod('GET');
$request->setUrl('https://www.your_page_embeded_ajax_request');

$client->send($request, $response);

if($response->getStatus() === 200) 
    echo "Do something here";

【讨论】:

安装失败,正在将 ./composer.json 还原为其原始内容。潜在原因: - 包名称中的拼写错误 - 根据您的最低稳定性设置,该包在足够稳定的版本中不可用,请参阅 getcomposer.org/doc/04-schema.md#minimum-stability> 了解更多详细信息。

以上是关于抓取 javascript 生成的网页数据的主要内容,如果未能解决你的问题,请参考以下文章

Java抓取网页数据(原网页+Javascript返回数据)

如何抓取 HTTPS javascript 网页

用 C# 抓取 JavaScript 生成的网页

用于 javascript 生成内容的 Python 网页抓取

抓取javascript生成的网页

java爬虫怎么抓取js动态生成的内容