node下使用selenium-webdriver爬取数据
发布于 10 个月前 作者 etouyang 943 次浏览 来自 分享

总看到有人在纠结node.js, 其实嘛, 我认为能解决问题并好用, 就好了; 现在的公司后台使用的是node.js, 生产环境使用了几个月了没有出什么问题, 感觉还是不错的, 况且GraphQL + koa超级好用哦.

闲话不多说, 下面我将介绍一下koa搭配selenium-webdriver 和 Chrome浏览器爬取某个网站的数据; 代码我已经开源: https://github.com/etouyang/selenium-webdriver-node-demo

分析这个网站http://tool.manmanbuy.com/historyLowest.aspx?url=, 可以发现关键数据放在iframe里面, 所以必须得将网站加载完成才能去解析, 我使用了库selenium-webdriver, 在selenium.js文件下,首先引入库和浏览器:

const {Builder, By, Key, until, Capabilities} = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
const options = new chrome.Options();

初始化浏览器并加载网址:

let broswer = await new Builder().forBrowser('chrome').setChromeOptions(options).build();

await broswer.get(base + escape(url))

商品的历史优惠没有放在iframe里, 我们可以首先获取这个节点:

let couponElement = await broswer.findElement(By.className('trend_page'))
let hasUl = await couponElement.getText()

然后将节点跳转到iframe获取关键数据

broswer.switchTo().frame('iframeId')

现在我们处于这个iframe里面, 因为这个iframe是异步加载的, 所以我这里用了个sleep函数, 每格500ms获取一次iframe:

async function sleep(timeout) {
    return new Promise((resolve, reject) => {
      setTimeout(function() {
        resolve();
      }, timeout);
    });
}

最后将获取到的数据放在Promise里供koa使用; 我将这个爬虫部署在ubuntu服务器下, 写了个查询的小程序, 欢迎大家对这个技术指正.

4 回复

请问,如何使用代理

来自酷炫的 CNodeMD

graphql客户端是怎么玩的?拼串吗?闲暇了解了下.发现太nb了.但是如果没生成工具手写拼串总有点不自在,不知道楼主采用的是什么方案?

@RajanZhan 什么代理? 不太懂, 这个项目没有使用代理

@wszgrcy 使用的是官网的那一套, 没做改变, 看以后有没有人写出前端的插件了

回到顶部