使用javascript和casper.js将javascript代码注入到单击事件中

时间:2014-05-20 13:54:32

标签: javascript onclick screen-scraping casperjs

我刚开始使用casperjs后尝试使用python(selenium / requests和mechanise)只在一些javascript加载页面上的一些动态内容后才抓取页面。

由于硒很难或非常慢,所以我建议转向Casper js(需要phantomjs)。

我想知道的一件事(我对javascript很新)与javascript onclick事件有关。

默认情况下,我想要抓取的页面每页显示十个名称,底部有显示(5)或显示(100)的选项。

在深入了解此代码并使用firebug进行检查后,我想知道是否可以将onclick = loaditems(100)更改为类似... onclick = loaditems(加载X项),其中X可能为200。 (或者在一个页面上加载所有内容并使其更容易抓取所需的任何数字。这可能吗?

更新 *评论员要求提供用于选择每页100个项目的代码....

代码(HTML)是..

<a title="Show 100 items per page"
onclick="lconn.profiles.Friending.setItemsPerPage(this,100)" href="javascript:void(0);">100</a> 

和Xpath是......

/html/body/div/div[2]/div[3]/div[3]/span/div/div/div/div/div[2]/div/div/form/div??/div[4]/div/ul/li[4]/a

问题 我能够编辑onclick命令并将值更改为更高的数字,但是我不知道如何使用我想在每页显示的更多元素来执行它以查看它是否有效。

1 个答案:

答案 0 :(得分:0)

我使用了一个简单的CSS选择器来执行此任务。您可以使用字符串操作更改onclick属性。在这种情况下,我将"100"替换为num。我还添加了一个clickIt参数来单击更改的链接。

casper.changeItemsPerPageLink = function(num, clickIt){
    casper.evaluate(function(num, clickIt){
        num = ""+num;
        var a = document.querySelector('a[title="Show 100 items per page"]');
        a.innerHTML = num;
        a.title = a.title.replace("100", num);
        a.setAttribute("onclick", a.getAttribute("onclick").replace("100", num));
        if (clickIt) {
            a.click();
        }
    }, num, clickIt);
};

请参阅我的测试代码gist