现在网页大多是动态网页,如果只是单纯地通过爬取网页HTML文件,根本爬取不到需要后续加载的商品价格或图片等重要信息,更别谈那些丧心病狂的登录限制,对于小爬虫来说,去分析那些复杂的脚本得不偿失,更别谈网站还会与时俱进地更新,好不容易破解了,人家一更新又得从头来,这都大大提高了小爬虫的难度。
但幸好,在Node.js里有那么一款神器,无惧网站的登录限制和反爬虫措施,以不变应万变,通过一招简单的模拟用户操作就能破解绝大部分限制,它就是由谷歌出品的爬取动态网页神器Puppeteer。
1.Puppeteer的好处和坏处
Puppeteer本质上是一个chrome浏览器,只不过可以通过代码进行各种操控。比如模拟鼠标点击、键盘输入等操作,有点像按键精灵,网页很难分清这是人类用户还是爬虫,所以限制也就无处谈起。
它的好处在于简单,非常简单,可能是在所有可以爬取动态网页的库里最简单的一个。
但坏处也很明显,那就是速度慢,效率有点低。它等于每次运行都会启动一个Chrome浏览器,所以运行效率上远远比不过其它库,并不适合爬取大数据。但对于小爬虫来说已经绰绰有余了。
接下来以我写过的爬取jd商品页面的小爬虫为例,来看看这款有多简单。 当初写这个爬虫是为了买苹果的妙控板,找了一圈后发现jd夺宝岛里的价格很诱人,这也应该是夺宝岛里唯一值得抢的商品,但是数量稀少,很久才会出现一个。
于是就想到了监控商品页面,一旦发现新的妙控板就弹出提醒。甚至还可以实现自动竞拍,但我没写,毕竟除了触控板以外我都不想买,没办法测试能否成功拍到。
OK,开始吧!
2.首先第一步要安装Puppeteer:
先安装Puppeteer库,用到的也就只有这个库:
npm install puppeteer
复制代码
3.第二步链接网页
链接网页也非常简单,只需要几行代码:
//启动浏览器
const browers = await puppeteer.launch()
//启动新页面
const page = await browers.newPage()
//链接网址
await page.goto(url)
复制代码
这样子就链接成功了!Puppeteer.launch()还可以接收很多参数,但这里我们用到的只有headless,默认为ture,如果是false的话会显示浏览器界面。我们可以利用这个特性实现弹出窗口提醒,一旦发现有符合条件的商品就将headless改成false。
4.爬取商品信息
在链接网页后接下来就是爬取商品信息,然后进行分析。
网址: 妙控板
4.1获取相对应的元素标签
通过页面可以看到,一旦有同类商品会出现在旁边的同类夺宝里,我们只需要