有没有办法从带有 javascript 后渲染的页面中检索完全渲染的 html ?如果我使用 curl,它只是检索基本 html,但缺少 iframe、javascript 处理等的后期渲染。
实现这一目标的最佳方法是什么?
有没有办法从带有 javascript 后渲染的页面中检索完全渲染的 html ?如果我使用 curl,它只是检索基本 html,但缺少 iframe、javascript 处理等的后期渲染。
实现这一目标的最佳方法是什么?
由于没有其他人回答(除了上面的补充,但我稍后会谈到)我会尽可能地提供帮助。
没有“简单”的答案。PHP 不能原生处理 javascript/导航 DOM,所以你需要一些可以的东西。
我看到的你的选择:
如果您正在抓屏(这是我希望的,因为您也希望加载 Flash),我建议您使用其中一种商业 API 来执行此操作。您可以在此列表中找到一些http://www.programmableweb.com/apitag/?q=thumbnail,例如http://www.programmableweb.com/api/convertapi-web2image
否则,您需要自己运行一些可以在您的服务器上或连接到您的服务器上处理 Javascript 和 DOM 的东西。为此,您需要一个可以在服务器端运行并获取所需信息的自动浏览器。按照上面 Bergi 评论中的列表,您需要测试一个合适的解决方案 - 主要的 Selinium 非常适合在已知网站上进行“单元测试”,但我不确定如何编写脚本来处理随机网站,例如。正如您(可能)只有一个“自动浏览器”并且您不知道加载每个页面需要多长时间,您需要将请求排队并一次处理一个。您还需要确保处理弹出警报(),安装所有第三方库(您说要闪存?!),处理重定向,超时和潜在的内存消耗(如果不停地运行这个,你会定期想要杀死你的浏览器并重新启动它以清理内存!)。还可以处理病毒攻击、弹出窗口和完全关闭浏览器的请求。
第三,VB 有一个网络浏览器组件。我很久以前在一个项目中使用它来做类似的事情,但是在一个已知的站点上。.NET 是否可行(对我来说,这是一个巨大的安全风险),以及你如何为未知数编程(例如弹出窗口和 Flash)我不知道。但是,如果您很绝望,那么喜欢冒险的 .NET 开发人员可能会提出更多建议。
总而言之 - 如果您想要的不仅仅是屏幕抓取并且可以选择选项 1,祝您好运;)
如果您正在寻找没有 GUI 的可编写脚本的东西,您可以使用无头浏览器。我已经将PhantomJS用于类似的任务。
如果仍然相关,我发现最简单的方法是使用 PhantomJs as a Service;
public string GetPagePhantomJs(string url)
{
using (var client = new System.Net.Http.HttpClient())
{
client.DefaultRequestHeaders.ExpectContinue = false;
var pageRequestJson = new System.Net.Http.StringContent(@"{'url':'" + url + "','renderType':'plainText','outputAsJson':false }");
var response = client.PostAsync("https://PhantomJsCloud.com/api/browser/v2/SECRET_KEY/", pageRequestJson).Result;
return response.Content.ReadAsStringAsync().Result;
}
}
这真的很简单,订阅该服务时,有一个免费计划,每天允许 500 页。SECRET_KEY 将替换为您将获得的您自己的密钥。
使用 w3m 或 lynx 之类的“终端”浏览器。即使您要访问的站点需要登录,这也是可能的,例如:
curl [-u login:pass] http://www.a_page.com | w3m -T text/html -dump
或者
curl [-u login:pass] http://www.a_page.com | lynx -stdin -dump
这应该为您提供包含所有框架等的整个 html。
看看这个命令行 IECapt.exe
它不支持javascript,但lynx
在我需要处理来自网页的数据的情况下对我很有用。通过这种方式,我得到了(纯文本)渲染,并且不必像使用curl
.
lynx -nonumbers -dump -width=9999999 ${url} | grep ... et cetera.