抓取 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返回数据)