如何在NodeJS中使用PhantomJS在页面上模拟鼠标悬停或运行JS函数

时间:2018-07-13 08:46:52

标签: javascript node.js phantomjs casperjs spookyjs

NodeJS,PhantomJS,使用Cheerio解析内容

需要解析包含动态加载的div(hint)的网页。该事件可以在许多表td上发生,这是一个示例

enter image description here

当我在特定的td上“鼠标悬停”时,我看到这个带有数据的橙色块,它会像这样被动态加载函数

onmouseover="page.hist(this,'P-0.00-0-0','355svxv498x0x0',417,event,0,1)"

只有在页面加载后,我才能查看此信息。需要特定的一行,只有Marathonbet。

该函数运行时,文本将被加载到另一个div(id ='tooltip')中并显示给用户。

我使用phantom解析此页面的内容,使用静态值可以正常运行,但如何将动态生成的块接收到节点路由器内部渲染的网页上呢? 我看到2种方法:

  1. 在此坐标上模拟鼠标移动以显示所需的文本,但是 有一个问题,我怎么知道它的坐标?
  2. 页面加载后开始仿真功能,我知道它们会编码 ('355svxv498x0x0',417),但是我如何从节点运行此功能, 来自幻影?

    这里有一些代码,可以在我的路由器中接收静态页面内容

```

phantom.create(config.phantomParams).then(ph => {
    _ph = ph;
    return _ph.createPage();
}).then(page => {
    _page = page;
    return _page.on('onConsoleMessage', function (msg) {
        console.log(msg);
    });
}).then(() => {
    return _page.on('viewportSize', {width: 1920, height: 1080});
}).then(() => {
    return _page.on('dpi', 130)
}).then(() => {
    _page.setting('userAgent', config.userAgent);
    return _page.open(matchLink);
}).then(() => {
    return _page.property('content');
}).then(content => {
    let $ = cheerio.load(content);

    // working with content and get needed elements

    console.log($.html());
}).then(() => {
    _page.close();
    _ph.exit();
});

``` 我应该使用Casper / Spooky,还是有人可以解释这种情况下的使用方法?

UPD。尝试使用puppeteer,代码

```

let matchLink = 'http://www.oddsportal.com/soccer/world/club-friendly/san-carlos-guadalupe-xnsUg7zB/';

(async () => {
    const browser = await puppeteer.launch({
        args: [
            '--proxy-server=46.101.167.43:80',
        ]});
    const page = await browser.newPage();
    await browser.userAgent(config.userAgent);
    await page.setViewport({width: 1440, height: 960});
    await page.goto(matchLink);
    await page.evaluate(() => page.hist(this,'P-0.00-0-0','355svxv464x0x7omg7',381,event,0,1));

    let bodyHTML = await page.evaluate(() => document.body.innerHTML);

    console.log(bodyHTML);
    await page.screenshot({path: 'example.png'});

    await browser.close();
})();

```

获取 ```

(node:8591) UnhandledPromiseRejectionWarning: Error: Evaluation failed: TypeError: Cannot read property 'stopPropagation' of undefined
    at toolTip (http://www.oddsportal.com/res/x/global-180713073352.js:1:145511)
    at TableSet.historyTooltip (http://www.oddsportal.com/res/x/global-180713073352.js:1:631115)
    at PageEvent.PagePrototype.hist (http://www.oddsportal.com/res/x/global-180713073352.js:1:487314)
    at __puppeteer_evaluation_script__:1:13
    at ExecutionContext.evaluateHandle (/home/gil/Projects/oddsbot/node_modules/puppeteer/lib/ExecutionContext.js:97:13)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)

```

目标JS文件中的错误,可能与请求有关。

1 个答案:

答案 0 :(得分:2)

由于您愿意接受建议,因此我建议puppeteer是一个本机的node.js模块,它在最新的Chromium中打开页面(由于PhantomJS已经过时,因此特别有用),并且在进行思考方面与PhantomJS接近。

如果您还使用node.js 8.x,则可以使用async / await语法来处理诺言,这使轻巧地使用puppeteer进行刮擦。

因此要在puppeteer中运行该功能,您将运行

await page.evaluate(() => page.hist(this,'P-0.00-0-0','355svxv498x0x0',417,event,0,1) );

更新

Puppeteer有很多便捷帮助器,其中之一是page.hover,它实际上将鼠标指针悬停在元素上:

await page.hover('td.some_selector');

但是,如果您想继续使用Phantomjs和出色的phantom模块,则可以:

_page.evaluate(function() {
    page.hist(this,'P-0.00-0-0','355svxv498x0x0',417,event,0,1)
})

page.evaluate上的文档:http://phantomjs.org/api/webpage/method/evaluate.html