我试图通过插入URL来使用JavaScript获取整个网页。但是,该网站被构建为一个单页面应用程序(SPA),它使用JavaScript/Backbone.js在呈现初始响应后动态加载大部分内容。
例如,当我路由到以下地址时:
https://connect.garmin.com/modern/activity/1915361012
然后在控制台中输入以下内容(在页面加载之后):
var $page = $("html")
console.log("%c✔: ", "color:green;", $page.find(".inline-edit-target.page-title-overflow").text().trim());
console.log("%c✔: ", "color:green;", $page.find("footer .details").text().trim());
view-source:https://connect.garmin.com/modern/activity/1915361012
// jQuery.get()
var url = "https://connect.garmin.com/modern/activity/1915361012";
jQuery.get(url,function(data) {
var $page = $("<div>").html(data)
console.log("%c✖: ", "color:red;", $page.find(".page-title").text().trim());
console.log("%c✔: ", "color:green;", $page.find("footer .details").text().trim());
});
// jQuery.load()
var url = "https://connect.garmin.com/modern/activity/1915361012";
var $page = $("<div>")
$page.load(url, function(data) {
console.log("%c✖: ", "color:red;", $page.find(".page-title").text().trim() );
console.log("%c✔: ", "color:green;", $page.find("footer .details").text().trim());
});
我在这里尝试了eval()
每个script
标记的内容的解决方案,但它看起来不够健壮,无法实际加载页面:
jQuery.get(url,function(data) {
var $page = $("<div>").html(data)
$page.find("script").each(function() {
var scriptContent = $(this).html(); //Grab the content of this tag
eval(scriptContent); //Execute the content
});
console.log("%c✖: ", "color:red;", $page.find(".page-title").text().trim());
console.log("%c✔: ", "color:green;", $page.find("footer .details").text().trim());
});
问:在JavaScript上完全加载网页的选项是什么?
您永远无法完全复制任意(SPA)页面所做的事情。
我看到的唯一方法是使用无头浏览器,如PhantomJS、headless Chrome或headless Firefox。
我想试试无头Chrome,让我们看看它能用你的页面做什么:
% chrome --headless --disable-gpu --repl https://connect.garmin.com/modern/activity/1915361012
[0830/171405.025582:INFO:headless_shell.cc(303)] Type a Javascript expression to evaluate or "quit" to exit.
>>> $('body').find('.page-title').text().trim()
{"result":{"type":"string","value":"Daily Mile - Round 2 - Day 27"}}
alias chrome="'/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'"
在新目录中:
yarn init
yarn add puppeteer
创建index.js
:
const puppeteer = require('puppeteer');
(async() => {
const url = 'https://connect.garmin.com/modern/activity/1915361012';
const browser = await puppeteer.launch();
const page = await browser.newPage();
// Go to URL and wait for page to load
await page.goto(url, {waitUntil: 'networkidle'});
// Wait for the results to show up
await page.waitForSelector('.page-title');
// Extract the results from the page
const text = await page.evaluate(() => {
const title = document.querySelector('.page-title');
return title.innerText.trim();
});
console.log(`Found: ${text}`);
browser.close();
})();
结果:
$ node index.js
Found: Daily Mile - Round 2 - Day 27
问题内容: 好的,所以我对ajax和从外部加载内容还很陌生,希望对我的问题有任何见解。 我目前有一个隐藏的div,它是空的,单击链接后应该在其中加载ajax内容。 我目前有一个链接列表,所有链接都具有相同的类,并且我想在单击空白div时进行幻灯片切换,然后从链接要访问的页面中加载内容。 链接: 当前的jQuery: 刚接触Ajax并加载外部内容时,我想知道如何从位于标签中的链接页面加载内容。因此,
问题内容: 我正在创建一个浏览大量图片的应用程序。至此,项目的那部分完成了,它对正确的图片进行了排序,过滤和加载,甚至将它们拆分为单独的页面以加快加载速度。 效果很好,但每页加载25张图片仍需要8秒钟以上。我已经进行了一些研究,得出的结论是,使用异步jQuery Ajax请求是最好的方式,以便尽可能快地同时加载所有请求。 到目前为止,这是我的代码: 此代码的问题在于,除了带有灰色边框的空白方形外,
本文向大家介绍如何爬取通过ajax加载数据的网站,包括了如何爬取通过ajax加载数据的网站的使用技巧和注意事项,需要的朋友参考一下 目前很多网站都使用ajax技术动态加载数据,和常规的网站不一样,数据时动态加载的,如果我们使用常规的方法爬取网页,得到的只是一堆html代码,没有任何的数据。 请看下面的代码: 上面的代码是爬取今日头条的一个网页,并打印出get方法返回的文本内容如下图所示,值现在一堆
问题内容: 我有一个div标签,该标签通过ajax调用填充了脚本,但是脚本未执行。 有没有办法使脚本执行? 问题答案: 如果您使用jQuery的方法,它将解析出脚本标签并对其进行评估: 如果没有jQuery,则可以使用(1)正则表达式或(2)解析DOM树并查找脚本标签来自己编写。(#2是jQuery的执行方式)
问题内容: 我正在尝试让jsTree与子节点的按需加载一起使用。我的代码是这样的: 调用返回的json是 每个元素可以有很多孩子,树会很大。当前,这将立即加载整个树,这可能需要一些时间。当用户打开子节点时,我该怎么做以实现按需加载? 提前致谢。 问题答案: Irishka向我指出了正确的方向,但并不能完全解决我的问题。我在弄弄她的答案,然后想到了这个。仅为了清楚起见,使用了两个不同的服务器功能。第
问题内容: 我想我有一个非常简单的问题,但找不到解决方案。因此,我要通过HTML加载DIV内容。问题在于它不仅是文本,而且是图像。Ajax调用返回HTML代码,但是该代码在DIV中显示为HTML,并且不会执行。难以解释,但从示例中可以明显看出… AJAX调用返回字符串: 问题很明显。我得到的是实际的代码,而不是图像和div中的3.3°C,因此,我看到的不是图像,而是img src =…。 我知道我