puppeteer爬取简书文章的小例子
puppeteer爬取简书文章
puppeteer这个工具库我已经了解有些时候了,自己在之前的文章中也有简单的介绍,也列出了几个学习站点,不过,第一个爬虫的例子,还是缓缓的到来了。
这个小例子很简单,只有几十行代码,大概的流程是,首先打开简书的首页,之后下拉到底部,加载数据,下拉几次之后就没有了下拉加载的功能,取而代之的是“阅读更多”按钮,点击后会加载新内容。就这样往复的加载文章的列表,当符合自己设定的上限值后,停止加载,拿到了文章列表后循环的打开相对应的页面,读取文章详细内容,并写到本地磁盘里。
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| const puppeteer = require('puppeteer'); const fs = require('fs');
const baseUrl = 'https://www.jianshu.com'; (async () => { const browser = await puppeteer.launch({ headless:false, slowMo:250, defaultViewport: { width: 1200, height: 600 } }); const page = await browser.newPage(); await page.goto(baseUrl);
const hrefList = await page.evaluate((baseUrl) => { let arr = [], list; return new Promise((resolve, reject)=> { function loadPage() { var btn = document.querySelector('.load-more'); if(btn) { btn.click(); }else { var pageHeight = document.querySelector('#list-container').offsetHeight; for(let i=0; i<pageHeight; i++) { document.documentElement.scrollTo(0, i); } } setTimeout(() => { list = document.querySelectorAll('#list-container .note-list li'); if(list.length < 50) { loadPage(); }else { for(let item of list) { let href = item.querySelector('a').getAttribute('href'); arr.push(baseUrl + href); } resolve(arr); } }, 2000); } loadPage(); }); }, baseUrl);
for(let item of hrefList) { try { await page.goto(item); } catch(err) { continue; } await page.waitFor(5000); var article = await page.evaluate(() => { var mainText; try { mainText = document.querySelector('._gp-ck').innerHTML; } catch(err) { mainText = '此页面有问题。'; } return mainText; }); fs.writeFileSync('./download-articles/'+item.replace(/\/|\:|\./g, '')+'.txt', article, { flag: 'a' }); } await browser.close(); })();
|
以后还会更新些更复杂的爬虫案例哦。