爬取某位大佬简书上所有文章并保存为pdf

第一时间获取 Python 技术干货!

阅读文本大概需要 8 分钟。

1

目 标 场 景

现如今,我们处于一个信息碎片化的信息时代,遇到好的文章都有随手收藏的习惯。但过一段时间,当你想要重新查看这篇文章的时候,发现文章已经被移除或莫名其妙地消失了。

如果当时能将这些文章以 pdf 格式保存到本地,待空闲的时候慢慢地看,就不用担心这个问题了。

本文的目标是利用 Google 推出的「puppeteer」,配合无头浏览器爬取某位大佬在简书上发布的所有文章,并对页内元素进行优化样式后,以「pdf」格式保存下载到本地。

2

准 备 工 作

和前面爬虫方式不一样,这次的爬虫是在「Node.js」环境下执行的,所以需要提前安装好 node js。

然后通过 npm 安装「puppeteer」模块。

npm i puppeteer 

我这里使用 Chrome 的无头浏览器模式,所以需要提前下载好「chromium」放在本地。

3

分 析 思 路

为了便于观察,首先我们利用 puppeteer 以有头模式启动浏览器。

const browser = await puppeteer.launch({        // 设置false可以看到页面的执行步骤        headless: false,
    });

再设置好浏览器的大小,然后打开文章列表页面。

BASE_URL = 'https://www.jianshu.com';

//文章列表地址
HOME_URL = `${BASE_URL}/u/f46becd1ed83`;

const viewport_size = {
        width: 0,
        height: 0,
    };

const page = await browser.newPage();

//设置浏览器的宽、高
page.setViewport(viewport_size);

//打开文章主页
await page.goto(HOME_URL);

由于默认只显示第一页的文章,后面的文章需要多次从下到上的滑动才能加载出来。

这里需要定义一个函数不停的作滑动操作,直到滑动到最底部,待页面所有元素加载完成,才停止滑动。

function autoScroll(page) {
    return page.evaluate(() => {
        return new Promise((resolve, reject) => {
            var totalHeight = 0;
            var distance = 100;
            var timer = setInterval(() => {
                console.log('执行间断函数');
                var scrollHeight = document.body.scrollHeight;
                window.scrollBy(0, distance);
                totalHeight += distance;

if (totalHeight >= scrollHeight) {
                    console.log('滑动到底');
                    clearInterval(timer);
                    resolve();
                }
            }, 100);
        })
    });
}

待所有的文章都加载出来后,就可以通过「eval」函数获取文章元素,然后再通过 css 选择器获取到文章标题和页面地址。

const articles = await page.$eval('.note-list', articles_element => {
        const article_elements = articles_element.querySelectorAll('li');
        const articleElementArray = Array.prototype.slice.call(article_elements);

return articleElementArray.map(item => {
            const a_element = item.querySelector('.title');
            return {
                href: a_element.getAttribute('href'),
                title: a_element.innerHTML.trim(),
         };
     });
});

获取到所有文章的链接地址之后,就可以通过遍历列表去打开每一篇文章。

for (let article of articles) {
        const articlePage = await browser.newPage();
        articlePage.setViewport(viewport_size);
        articlePage.goto(`${BASE_URL}${article.href}`, {
            waitUntil: 'networkidle2'
        });

articlePage.waitForSelector('.post');
        console.log('文章详情页面加载完成');
}

等文章详情页面加载完全后,同样需要滑动页面到最底部,保证当前文章的文字信息、图片都加载完全。

为了保证最后保存的页面的美观性,需要利用「CSS样式」隐藏包含网站顶部、底部、评论、导航条等多余的元素。

await articlePage.$eval('body', body => {
            body.querySelector('.navbar').style.display = 'none';
            body.querySelector('#note-fixed-ad-container').style.display = 'none';
            body.querySelector('.note-bottom').style.display = 'none';
            body.querySelector('.side-tool').style.display = 'none';
            // body.querySelector('.author').style.display = 'none';
            body.querySelector('.meta-bottom').style.display = 'none';
            body.querySelector('#web-note-ad-1').style.display = 'none';
            body.querySelector('#comment-list').style.display = 'none';
            body.querySelector('.follow-detail').style.display = 'none';
            body.querySelector('.show-foot').style.display = 'none';

Promise.resolve();
        });

最后利用「pdf」函数把当前页面保存为 pdf 格式的文件。

await page.emulateMedia('screen');
        await articlePage.pdf({
            path: fileFullPath,
            format: 'A4'
 });

需要注意的是,为了保证上面的函数正常的执行,需要修改浏览器打开的方式为无头模式,即:

const browser = await puppeteer.launch({
        headless: true,
    });

4

结 果 结 论

通过 node 命令就可以执行这个 js 文件。

node jian_shu.js 

由于使用的是无头浏览器执行的,这里除了控制台能显示日志信息,没有任何操作。

待程序执行完毕之后,发现所有的文章都以 pdf 的形式保存到本地了。

(0)

相关推荐

  • NodeJs和puppeteer结合的爬虫方案

    NodeJs和puppeteer结合的爬虫方案 由于对NodeJs的数据库操作是异步的,不是同步的,所以去重的方案,直接是删除之前添加的数据,在添加新的. 代码篇: const puppeteer = ...

  • JavaScript DOM操作

    操作DOM DOM中节点类型 Document文档节点:代表整个网页,不代表任何HTML标记,但它是html的父节点 element元素节点:指任何HTML标记.每一个HTML标记就称一个" ...

  • JavaScript中的DOM与BOM

    DOM 概念 文档对象模型 (Document Object Model,简称DOM) 将 web 页面与到脚本或编程语言连接起来.通常是指 JavaScript,但将 HTML.SVG 或 XML ...

  • js点击图片传给一个空的div内放大显示

    ul li img{ width: 200px; height: 200px; } li{ list-style: none; float: left; } .amplification{ z-ind ...

  • js 留言板(带删除功能)

    本文所用的知识点:创建节点和添加节点 创建节点:document.createElement('li') 添加节点  node(父亲节点).appendChild(child)    child:子节 ...

  • 小白怎么在简书上赚钱?(干货分享)

    方小小2021年的第96篇原创文 专注个人成长写作变现赚钱副业 我在简书上日更也有好几个月的时间了,一直是知道简书上可以赚钱的,但是总觉得赚的不多,所以也没有仔细研究过. 最近发现很多小伙伴对此却非常 ...

  • Python爬取房产数据,在地图上展现!

    小伙伴,我又来了,这次我们写的是用python爬虫爬取乌鲁木齐的房产数据并展示在地图上,地图工具我用的是 BDP个人版-免费在线数据分析软件,数据可视化软件 ,这个可以导入csv或者excel数据. ...

  • 给额济纳旗一位老师的线上教学文章合集

    这是前几天一位内蒙古额济纳旗老师的留言. 看了留言,感同身受. 去年,自己也曾经历了将近两个月的线上教学. 一切都是摸着石头过河,当时所有的付出与努力,只愿孩子们居家学习期间能够有一个良好的学习状态. ...

  • 使用 Python 爬取简书网的所有文章

    第一时间获取 Python 技术干货! 阅读文本大概需要 6 分钟. 01 抓取目标 我们要爬取的目标是「 简书网 」. 打开简书网的首页,随手点击一篇文章进入到详情页面. 我们要爬取的数据有:作者. ...

  • 做电商怎么一键爬取同行商品的主图视频到电脑上

    现在做电商的主图基本都会用主图视频来讲解演示,那么自己不会制作主图视频怎么办?今天小编就来教大家如何一键爬取下载同行商品主图视频的方法技巧,一起来学习看看吧! 首先我们运行打开天图视频批量下载工具,没 ...

  • 【Python爬虫】:爬取干货集中营上的全部美女妹子(翻页处理)

    一.确定爬取思路 今天突发奇想,能不能使用python爬虫来爬取一些妹子图片呢,于是摩拳擦掌开始干了起来.首先打开网页htttps://gank.io 当中的妹子专栏, 发现里面全是妹子,如下所示: ...

  • 一位超级散户熟记追涨秘诀后,秒抓涨停牛股,比书上还要简单实用!

    懒惰的本质就是不付出或者少付出就想获得很舒服的生活或者获得很高的回报,并且希望这种舒服和回报是持久性的. 懒惰心理有四种表现:一是希望不劳而获,二是希望一劳永逸,三是希望一蹴而就,四是内心一无所求. ...

  • 一位天才炒股家口出狂言:股市唯一不会骗人的万能均线指标,书上都难见的精髓,价值几何

    均线定义: 所谓移动平均线,是指一定交易时间内(日.周.月.年)的算术平均线.如以5日均线为例,将5日内的收盘价逐日相加.然后除以5,得出5日的平均值,在将这些平均值在图纸上依先后次序连起来,这条绘出 ...

  • 感恩简书,让我遇见你们(上)

    齐梅齐 小沫 齐冰齐 生命里遇见谁和谁相聚总是定数,我常说能走得近的都是三观相似的同频人. 遇见简书是因为当时在扣扣群里看到有人发链接,一打开就不由自主地喜欢上了它的干净和纯粹,从此简书就是我打开最多 ...