首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >站点抓取:等待站点完全加载

站点抓取:等待站点完全加载
EN

Stack Overflow用户
提问于 2013-11-26 19:35:46
回答 1查看 8.9K关注 0票数 5

我需要下载以下网页:panel#10096

这是一个体育博彩网页,我需要报价。所以,首先,这看起来很简单。然而,下面是发生的事情(你可以用eg来检查这个。(浏览器的开发工具):

  1. 打开URL
  2. 该页面加载初始HTML,随后调用ajax请求检索引号。
  3. 但是,引号包含在json中,但是它们是经过观察的,因此不可能直接从ajax调用解析它们。此外,还对网页的javascript进行了观察。所以没有机会直接读取请求中的引号。

相反,我需要使用能够评估javascript的无头浏览器。HtmlUnit for java是不够的,因为它没有提供健壮的javascript功能。因此,PhantomJS与CasperJS相结合是我目前的选择。我使用以下脚本应用CasperJS:

代码语言:javascript
复制
var casper = require('casper').create();

casper.start('http://m.10bet.com/#leage_panel#10096', function() {
    var url = 'http://m.10bet.com/#leage_panel#10096';
    this.download(url, '10bet.html');
});

casper.run(function() {
    this.echo('Done.').exit();
});

但是,此脚本没有加载完整的页面。只是信息页。如何在浏览器中加载完整的网页?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-27 05:20:33

这个脚本看起来是一个很好的开始,但是一旦(HTML)页面加载,(CasperJS)脚本就停止了,因为您没有给它任何更多的指令。解决这一问题的最简单的方法是睡上几秒钟,然后刮掉页面:

代码语言:javascript
复制
var casper = require('casper').create();
var fs=require('fs');

casper.start('http://m.10bet.com/#leage_panel#10096', function() {
    this.wait(2000, function() {
        fs.write("10bet.html", this.getHTML() );
   });
});

casper.run();

2000毫秒的超时值是粗糙的,原因有两个:

  1. 如果数据加载速度比这更快,那么您就是在浪费时间。
  2. 如果加载速度较慢,则脚本无法工作。

因此,最好在页面上标识您想要和需要的内容,然后使用Casper的waitForXXX()函数之一。参见这里开始的API文档:http://casperjs.readthedocs.org/en/latest/modules/casper.html#waitfor

作为另一点,我猜您实际上并不想要整个HTML页面,而只是其中的数据。getHTML()接受一个参数来过滤接收到的内容。在你的例子中,getHTML('#league_block')可能更有用。同样,请参阅API文档以获得更多的想法。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20226345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档