CSDN
算是一个老牌技术网站了,很多喜欢写文章的人,一开始都是在 CSDN
上发布,但是可能由于某些原因,有的人想把自己在 CSDN
上的文章放到其他的网站上(嗯,比如掘金),但是由于在 CSDN
上发布的文章数量很多,一篇篇复制粘贴下来理论上是可行的,就是手酸了点。
不过,作为技术型体力劳动者人才,重复一种动作几十甚至上百遍未免有点丢失 biger
,想起前段时间我花费了 大量时间 翻译的 Puppeteer,至今还没体现出其价值来,于是决定就用它了。
本文的可运行示例代码已经上传到 github了,需要的请自取,顺手
star
哦~
下载
想要获取到文章的标题和内容信息,第一个想到的就是文章的详情页,标题就一行,没那么多道道还好说,但是内容就要复杂点了,如果直接分析内容元素的 DOM
结构当然可行,但未免有点麻烦,如果直接获取内容的字符串,例如使用 textContent
这种方法,又会丢失语义,没办法获得内容的层级结构
不过我转念一想,既然这文章是自己的,那么完全可以进入文章的编辑页啊,编辑框内的内容不就是文章的原始内容吗,我写文章都是用 md
编辑器,那么编辑框里的内容就是 md
源文件,正是我想要的东西。
想要进入后台编辑页,必须要登录,于是先登录,CSDN
的登录页链接是 https://passport.csdn.net/account/login
,登录分为账号密码登录和第三方登录,就按最简单的来,所以我选择了账号密码登录,如果你之前一直是第三方登录,没有账号密码,那么你可以选择现在去创建一个,或者换一种写法,就用第三方登录,我这里演示账号密码登录的流程 第三方登录你自己想办法:
await page.goto('https://passport.csdn.net/account/login', { timeout })
// 切换到账号密码登录
await page.click('.login-code__open')
await page.waitForSelector('#username')
await sleep()
// 在表单中输入 账号 密码
await page.type('#username', 'Your Name')
await page.type('#password', 'Your pwd')
// 登录
const loginBtn = await page.$('.logging')
// 点击登录按钮
await loginBtn.click()
await page.waitForNavigation()
console.log('csdn登录成功')
登录成功后,先别急着去编辑页,因为还没确定编辑页链接,先把你自己所有发布的文章详情页的链接拿到,就拿我自己来举栗吧。
每个人创作者都有这样一个页面,例如 https://blog.csdn.net/DeepLies,这个页面罗列了你所有的文章:
在这个页面的最底部,