【发布时间】:2013-05-09 19:41:16
【问题描述】:
我正在尝试从当用户向下滚动到底部(无限滚动)时动态生成内容的页面中抓取链接。我尝试用 Phantomjs 做不同的事情,但无法收集第一页以外的链接。假设底部加载内容的元素具有类.has-more-items。它在滚动时加载最终内容之前可用,然后在 DOM 中变得不可用(显示:无)。这是我尝试过的东西-
- 在
var page = require('webpage').create();之后将 viewportSize 设置为较大的高度
page.viewportSize = { 宽度:1600,高度:10000, };
- 在
page.open中使用page.scrollPosition = { top: 10000, left: 0 }但没有效果-
page.open('http://example.com/?q=houston', function(status) { if (status == "success") { page.scrollPosition = { top: 10000, left: 0 }; } });
- 还尝试将其放入
page.evaluate函数中,但这给出了
引用错误:找不到变量页面
- 尝试在
page.evaluate和page.open中使用 jQuery 和 JS 代码,但无济于事-
$("html, body").animate({ scrollTop: $(document).height() }, 10, 功能() { //console.log('检查执行'); });
照原样,也在document.ready 内部。对于 JS 代码也是如此-
window.scrollBy(0,10000)
照原样,也在window.onload内部
我现在真的被它打动了 2 天,却找不到办法。任何帮助或提示将不胜感激。
更新
我在https://groups.google.com/forum/?fromgroups=#!topic/phantomjs/8LrWRW8ZrA0找到了一段有用的代码
var hitRockBottom = false; while (!hitRockBottom) {
// Scroll the page (not sure if this is the best way to do so...)
page.scrollPosition = { top: page.scrollPosition + 1000, left: 0 };
// Check if we've hit the bottom
hitRockBottom = page.evaluate(function() {
return document.querySelector(".has-more-items") === null;
}); }
.has-more-items 是我想要访问的元素类,它最初位于页面底部,当我们向下滚动时,它会进一步向下移动,直到所有数据都加载完毕,然后变得不可用。
但是,当我测试时,很明显它在没有向下滚动的情况下运行到无限循环(我渲染图片进行检查)。我也尝试用下面的代码替换page.scrollPosition = { top: page.scrollPosition + 1000, left: 0 };(一次一个)
window.document.body.scrollTop = '1000';
location.href = ".has-more-items";
page.scrollPosition = { top: page.scrollPosition + 1000, left: 0 };
document.location.href=".has-more-items";
但似乎没有任何效果。
【问题讨论】:
-
你能提供一个示例网址吗?
-
@f.cipriani 我的网址不公开(登录后)。然而,Twitter 流提供了完全相同的场景。例如说这个帐户twitter.com/GSASTeaching。推文流的底部显示了某个元素内的加载图像。我需要在该元素可用时滚动到该元素。当所有内容加载时,该元素在我的情况和 Twitter 流的情况下都不可用。我已经编辑了我的问题以添加更多我尝试过的东西。
-
如果该课程仍然可用怎么办?我在使用
products-bottom products-bottom--small hide类的地方工作,一旦加载了所有内容,它仍然存在。通过检查其他类的名称,一切似乎都是使用 reactJS 构建的
标签: javascript dom web-scraping screen-scraping phantomjs