1

我正在尝试使用 PhantomJS/CasperJS 来抓取网页。最近几天我一直在阅读文档,并在网上搜索,但我被困住了。

我正在抓取的页面显示了三个级别的链接——年、月和日。当您选择年、月和日时,#count div 中会显示一个计数。此外,月份实际上是更改 #imageLoad div 中的图像的输入(我不需要)。

<div id="years">
    <span class="year">2010</span>
    <span class="year">2011</span>
    <span class="year">2012</span>
    etc...
</div>  
<div id="months">
    <input type="image" class="month" src="jan_image.png" onclick="changepic('jan')" />
    <input type="image" class="month" src="feb_image.png" onclick="changepic('feb')" />
    <input type="image" class="month" src="mar_image.png" onclick="changepic('mar')" />
    etc...
</div>
<div id="days">
    <span class="day">1</span>
    <span class="day">2</span>
    <span class="day">3</span>
    etc...
</div>

<div id="imageLoad">
</div>
<div id="count">
</div>

我正在尝试遍历链接并记录每个年、月和日组合出现的计数。如您所见,月份是改变情况的输入。

我尝试了很多东西。我想做的主要事情是一个嵌套循环,它循环通过每组链接,在我去的时候点击它们。这是代码(我正在使用 jQuery):

casper.start(link);

casper.then(function() {

    pageInfo =  this.evaluate(function(){
        values = [];
        for(var y = 0; y < $('#years').length; y++){
            year= $('#years span').get(y);
            $(year).click();

            for(var m = 0; m < $('#months').length; m++){
                month= $('#months input').get(m);
                $(month).click();

                for(var d = 0; d < $('#days').length; d++){
                    day= $('#days span').get(d);
                    $(day).click();

                    values.push($('#count').text());
                }
            }
        }
        return values;

    });
});

我认为这将按顺序遍历每组链接,并且我会从年、月和日的每个变化中获取所有值。

但是,当我单击脚本中的月份输入时,脚本会中断并转到下一个 casper.then 语句。我有更好的方法吗?

我有一种感觉,我正在以错误的方式解决这个问题,但我尝试过的其他任何事情也没有任何成果。似乎一旦中断到下一个“然后”,就再也没有回到我的循环了。

我试过用 循环Casper.each,但我不知道手头会有多少元素。

提前致谢。

4

1 回答 1

8

只是为了记录,这个例子展示了使用 casperjs 在嵌套循环中执行操作的正确方法:

https://github.com/n1k0/casperjs/blob/master/samples/dynamic.js

It won't take you too much to adapt it to what you need.

于 2013-02-09T22:20:15.043 回答