岂非爬虫只能用
python
做? 不,我们上天的
Node.js
也能够做!
须要预备的包
-
Node.js
的最新版本 下载地点 Node.js官网 -
npm
包管理器下载 下载最新的官网版本Node.js
会自带npm
-
npm
的第三方包puppeteer
在对应的js文件内运转敕令行东西npm i puppeteer -D
即可
-
爬虫在猎取某些有庇护机制的网页时可能会失效
初入江湖 -自由地境篇
const puppeteer = require('puppeteer'); // 引入依靠
(async () => { //运用async函数圆满异步
const browser = await puppeteer.launch(); //翻开新的浏览器
const page = await browser.newPage(); // 翻开新的网页
await page.goto('https://www.jd.com/'); //前去内里 'url' 的网页
const result = await page.evaluate(() => { //这个result数组包括一切的图片src地点
let arr = []; //这个箭头函数内部写处置惩罚的逻辑
const imgs = document.querySelectorAll('img');
imgs.forEach(function (item) {
arr.push(item.src)
})
return arr
});
// '此时的result就是获得的爬虫数据,能够经由过程'fs'模块保留'
})()
复制过去 运用敕令行敕令 ` node 文件名 ` 就能够运转猎取爬虫数据了
这个
puppeteer
的包 ,实际上是替我们开启了另一个浏览器,重新去开启网页,猎取它们的数据。
萧洒入世 -清闲天境篇
- 上面只爬取了京东首页的图片内容,假定我的需求进一步扩展,须要爬取京东首页
中的一切<a> 标签对应的跳转网页中的一切 title的笔墨内容,末了放到一个数组中
。
- 我们的
async
函数上面一共分了五步, 只要puppeteer.launch()
,
browser.newPage()
, browser.close()
是牢固的写法。
-
page.goto
指定我们去哪一个网页爬取数据,能够替换内部url地点,也能够屡次
挪用这个要领。
-
page.evaluate
这个函数,内部是处置惩罚我们进入想要爬取网页的数据逻辑
-
page.goto
和page.evaluate
两个要领,能够在async
内部挪用屡次,
那意味着我们能够先进入京东网页,处置惩罚逻辑后,再次挪用page.goto
这个函数,
注重,上面这一切逻辑,都是
puppeteer
这个包帮我们在看不见的处所开启了别的一个浏览器,然后处置惩罚逻辑,所以终究要挪用
browser.close()
要领封闭谁人浏览器。
- 这时候我们对上一篇的代码举行优化,爬取对应的资本。
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://www.jd.com/');
const hrefArr = await page.evaluate(() => {
let arr = [];
const aNodes = document.querySelectorAll('.cate_menu_lk');
aNodes.forEach(function (item) {
arr.push(item.href)
})
return arr
});
let arr = [];
for (let i = 0; i < hrefArr.length; i++) {
const url = hrefArr[i];
console.log(url) //这里能够打印
await page.goto(url);
const result = await page.evaluate(() => { //这个要领内部console.log无效
return $('title').text(); //返回每一个界面的title笔墨内容
});
arr.push(result) //每次轮回给数组中增加对应的值
}
console.log(arr) //获得对应的数据 能够经由过程Node.js的 fs 模块保留到当地
await browser.close()
})()
上面有天坑 page.evaluate函数内部的console.log不能打印,而且内部不能猎取外部的变量,只能return返回,
运用的挑选器必需先去对应界面的控制台试验过能不能挑选DOM再运用,比方京东没法运用querySelector。这里因为
京东的分界面都运用了jQuery,所以我们能够用jQuery,总之他们开辟能用的挑选器,我们都能够用,不然就不能够。
威震武林 -神游玄境篇
数据在这个时期异常名贵,上面两个能猎取一些指定的特定资本,根据网页的设想逻辑,选定特定的
href
的地点,能够先直接猎取对应的资本,也能够经由过程再次运用
page.goto
要领进入,再挪用
page.evaluate()
处置惩罚逻辑。这里就不做过量引见了,毕竟
Node.js
是能够上天的,也许将来它真的什么都能做。这么优良简短的教程,请珍藏或许转发给您的朋侪,感谢。