介绍
puppeteer 是一个Chrome官方出品的headless Chrome node库。它提供了一系列的API, 可以在无UI的情况下调用Chrome的功能, 适用于爬虫、自动化处理等各种场景。
使用
安装
npm install puppeteer-chromium-resolver –save
生成/关闭浏览器
1 2 3 4 5 6 7 8 9 10
| const browser = await (puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox'], ignoreHTTPSErrors: true, headless: true, }));
browser.close();
|
生成新的tab并且跳转
1 2
| const page = await browser.newPage(); await page.goto('https://github.com/'+name+'?tab=repositories');
|
在控制台中执行函数( evaluate() )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const rep = await page.evaluate(()=>{ const url = document.querySelectorAll('.wb-break-all > a'); const next = document.querySelector('.BtnGroup > a'); let urlList = undefined; let nextUrl = undefined; if(url != null){ urlList = Array.prototype.map.call(url,(item)=>{ return item.href; }) } if(next!=null&&next.outerText==='Next'){ nextUrl = next.href; } return { urlList:urlList, nextUrl:nextUrl } });
|
获取页面元素
1
| const el = await page.$(selector)
|
点击元素
输入内容
爬取Github中的数据
使用了express,因个人需要爬取了指定用户的follower数,以及commit过的日期以及当天commit的次数,还有爬取每一个公开的项目的url、项目名、commit数以及star数,拼接后返回json。
项目地址:getGithub
调用例子:
http://localhost:4000/getAllContributions/Magren0321
返回数据示例:

踩到的坑
在爬取每一年的contributions数的时候,获取其元素的属性失败,因为其data-date以及data-count等属性是github自己定义的属性,无法直接获取,这里必须得使用getAttribute()方法。
同时Attribute中还有setAttribute()和removeAttribute(),分别是设置和移除节点原型中不存在的属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| async function getDateList(yearData,page){ await page.goto(yearData); const dateList = await page.evaluate(()=>{ const date = document.querySelectorAll('.ContributionCalendar-day'); const datelist = []; for(let item of date){ if(item.getAttribute('data-count')!=0&&item.getAttribute('data-count')!=null){ datelist.push({ data_date: item.getAttribute('data-date'), data_count: item.getAttribute('data-count') }) } } return datelist; }) return dateList; }
|
Github api还有一些奇奇怪怪的地方就不总结了……
比如返回一个空的数组,但是我输出其length居然是2,用直接请求发现是里面放了两个换行😵
只能找多几个数据测试😔