为什么通过capybara的webkit得到的结果与CasperJS不同?

时间:2014-02-07 20:11:52

标签: webkit web-scraping phantomjs casperjs

我对可用的大量刮削技术有点新意,所以我一直在测试一堆。我正在查看的一个测试页面是here。我注意到我的刮刀正在通过Capybara返回我期望的结果 - 在JS运行之后的HTML。这是代码:

  class Scraper
    include Capybara::DSL

    Capybara.run_server = false
    Capybara.current_driver = :webkit

    def test_scrape      
      visit "https://www.facebook.com/pages/Buddha-Bodai-Vegetarian-Restaurant/117609928256672?sk=info"
      if body.match /pagelet_nearby_places_results/
        has_xpath?("//div[@id='pagelet_nearby_places_results']")
      end
      body
    end
  end

这显然是一个非常基本的测试。例如,您可以通过查看页面上Foursquare链接的HTML来正确加载此内容。

<a class="uiIconText" href="https://www.facebook.com/l.php?u=https%3A%2F%2Ffoursquare.com%2Fv%2Fbuddha-bodai%2F459b830af964a5208b401fe3%3Fref%3Datw&amp;h=0AQH4z1yv&amp;s=1"
...

我也正在测试如下所示实施的CasperJS解决方案:

var casper = require('casper').create({
  pageSettings: {
    javascriptEnabled: true,
    loadImages: false,
    loadPlugins: false,
    userAgent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5'
  }
});


result = {};

casper.start("https://www.facebook.com/pages/Buddha-Bodai-Vegetarian-Restaurant/117609928256672?sk=info", function() {
    var body = this.getHTML();
    if(body.indexOf('pagelet_nearby_places_results') >= 0){
        casper.waitForSelector('div#pagelet_nearby_places_results', function() {
           result.html = this.getHTML();
        });
    }else{
        result.html = body;
    }    
});

casper.run(function complete() {
    this.echo(JSON.stringify(result, null, 4));
    this.exit();
});

为此我得到了不同的结果,在JS加载之前看起来像HTML。在这种情况下,foursquare链接被注释掉并在代码标记内:

<code class="hidden_elem" id="u_0_i"><!-- <div class="_5ay5"><div data-gt="{&quot;vertex_section&quot;:&quot;VertexLinksSection&quot;}"><div class="_gl"><div class="_117 _4qd"><h3>Links</h3></div><div class="_gm"><ul class="uiList _4kg _6-h _6-j _6-i"><li class="_6zy"><table class="uiGrid _51mz" cellspacing="0" cellpadding="0"><tbody><tr class="_51mx"><td class="_51m-"><a class="uiIconText" href="https://www.facebook.com/l.php?u=https%3A%2F%2Ffoursquare.com%2Fv%2Fbuddha-bodai%2F459b830af964a5208b401fe3%3Fref%3Datw&amp;h=UAQG_81FD&amp;s=1"
...

差异很奇怪有两个原因: 1.显然CasperJS(位于PhantomJS上)在JS运行之前无法返回HTML。这就是PhantomJS的全部观点。 2.我的两个解决方案都基于webkit

请注意,我也试过让Casper等待5秒(应该足够的时间)来帮助排除waitForSelector表现得好笑。鉴于这是一个非常简单的测试用例,我希望有人能够深入了解结果的不同之处。

谢谢!

1 个答案:

答案 0 :(得分:0)

我认为这是一个错误,所以我在这里记录: https://github.com/ariya/phantomjs/issues/11964