puppeteer爬取简书文章

  目录

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();
// page.setDefaultNavigationTimeout(timeout);
await page.goto(baseUrl);
// await page.waitFor(1000);

// 获取简书首页中的列表数据
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);

// 通过hrefList来获取单个的文章内容,并写入文章文件
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();
})();

以后还会更新些更复杂的爬虫案例哦。