使用 Curl 或其他方式检索完全呈现的页面


Retrieve fully rendered page using Curl, or other means?

有没有办法从带有javascript后期渲染的页面中检索完全渲染的html?如果我使用 curl,它只是检索基本的 html,但缺少 iframe 的后期渲染、javascript 处理等。

实现这一目标的最佳方法是什么?

由于没有其他人回答(除了上面的回答,但我稍后会谈到这一点),我会尽力提供帮助。

没有"简单"的答案。PHP 无法在本地处理 javascript/navigate DOM,所以你需要一些可以处理的东西。

在我看来,您的选择:

  1. 如果你想要屏幕抓取(这是我希望的,因为你也希望Flash加载),我建议你使用一个商业API来做到这一点。您可以在此列表中找到一些 http://www.programmableweb.com/apitag/?q=thumbnail,例如 http://www.programmableweb.com/api/convertapi-web2image

  2. 否则,你需要自己运行一些东西,可以在你的服务器上处理Javascript和DOM,或者连接到你的服务器。为此,您需要一个可以在服务器端运行并获取所需信息的自动浏览器。按照上面Bergi评论中的列表,您需要测试一个合适的解决方案 - 主要的Selinium非常适合在已知网站上进行"单元测试",但我不确定如何编写脚本来处理随机站点,例如。由于您(大概)只有一个"自动浏览器",并且您不知道每个页面需要多长时间才能加载,因此您需要对请求进行排队并一次处理一个。您还需要确保处理弹出警报(),安装所有第三方库(您说要闪存?!),处理重定向,超时和潜在的内存占用(如果不间断运行,您将定期想要杀死浏览器并重新启动它以清理内存!还可以处理病毒攻击,弹出窗口和完全关闭浏览器的请求。

  3. 第三,VB有一个Web浏览器组件。很久以前,我将其用于一个项目来做类似的事情,但是在一个已知的站点上。.NET 是否可能(对我来说,这是一个巨大的安全风险),以及您如何为未知数(例如弹出窗口和 Flash)编程我不知道。但是,如果您不喜欢冒险的 .NET 开发人员可能会提出更多建议。

总之 - 如果您想要的不仅仅是屏幕抓取并且可以选择选项 1,祝您好运;)

使用像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和所有框架等。

如果您正在寻找没有GUI的可编写脚本的东西,则可以使用无头浏览器。 我已经使用PhantomJS来完成类似的任务。

如果仍然相关,我发现最简单的方法是使用 PhantomJs 即服务;

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将被您将获得的您自己的密钥所取代。

看看这个命令行IECapt.exe

它没有javascript支持,但是在我需要处理网页数据的情况下,lynx对我来说很有用。 这样我得到了(纯文本)渲染,而不必像curl那样过滤原始 html 标签。

lynx -nonumbers -dump -width=9999999 ${url} | grep ...  et cetera.