写在前面

最近刚开了自己的博客,就想着把原来写的一些文章都放到这里来。
https://blog.liuzemei.com

准备做筛选,然后一篇篇的把微信公众号的文章复制过来的,结果发现

  1. 太多了,而且不好筛选。
  2. 复制的文章都是不带格式的,也不大好看。

于是就想着写个脚本,直接把带格式的 html 抓过来,于是就有了本篇教程。

开发环境

nodejs.v16
抓包工具

开始

一、 微信公众号文章的爬取

https://zhuanlan.zhihu.com/p/77438394

关于 python 的细节可以直接查看上述的链接。我这里是用的 nodejs,相当于稍微翻译了一下。

1. 从抓包工具获取 __biz uinkey

2. 构建获取的脚本

const axios = require('axios')
const fs = require('fs')
const cheerio = require('cheerio')
const moment = require('moment')
const path = require('path')const __biz = ""
const uin = ""
const key = ""const ins = axios.create({headers: {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) MicroMessenger/6.8.0(0x16080000) MacWechat/3.2(0x13020013) Chrome/39.0.2171.95 Safari/537.36 NetType/WIFI WindowsWechat"}
})async function craw(index) {let url = "https://mp.weixin.qq.com/mp/profile_ext"let params = {__biz, uin, key,'action': 'getmsg','f': 'json','offset': index * 10,'count': '10','is_ok': '1','scene': '124','wxtoken': '','x5': '0',}let { data } = await ins.get(url, { params })return data.general_msg_list
}async function writeArticleToFile({ app_msg_ext_info, comm_msg_info: { datetime } }) {const { title, content_url, cover, author } = app_msg_ext_infoconst imgFileName = datetime + ".png"datetime = moment(datetime * 1000)const year = datetime.year()if (!fs.existsSync(`${year}`)) {fs.mkdirSync(`${year}`)fs.mkdirSync(`images/${year}`)}const created_at = datetime.format('YYYY-MM-DD HH:mm:SS')const content = await crawArticle(content_url)const writer = fs.createWriteStream(path.resolve(__dirname, 'images', String(year), imgFileName))const res = await ins({url: cover,method: "GET",responseType: "stream"})res.data.pipe(writer)const result = `---
title: ${title}
date: ${created_at}
layout: post
author: ${author}
img: /source/images/${year}/${imgFileName}
categories:- 微信文章- 导入
tags: 随笔
---[原链接](${content_url})
{% raw %}
${content}
{% endraw %}
`fs.writeFileSync(`${year}/${title}.md`, result, 'utf8')}async function crawArticle(url) {const res = await ins.get(url)return readArticle(res.data)
}function readArticle(html) {let $ = cheerio.load(html)let content = $('#js_content').html()return content
}async function main() {let page = 0while (true) {const res = await craw(page++)if (!res.list || res.list.length === 0) breakfor (const obj of res.list) {try {await writeArticleToFile(obj)} catch (e) {console.log(e)console.log(obj.comm_msg_info.id)}}}
}
main()

3. 执行脚本。

二、 CSDN文章的爬取

文章列表的抓取方法我没仔细弄了,因为我的文章并没有那么多。拉个3次就拉完了,所以直接手动获取了json的返回值。

类似这样的

{"code": 200,"message": "success","data": {"list": [{"articleId": 82215835,"title": "装个QT5各种坑,终于搞定了","description": "转:https://blog.csdn.net/u013934107/article/details/807124181、下载 Qt5 离线安装包下载地址:http://www.qt.io/download-open-source/  进入后,请注意页面最下方有个【View All Downloads】链接,点击它可找到离线安装包!  这里写图片描述根据自己的操作系统版本,选择对应...","url": "https://blog.csdn.net/weixin_41884153/article/details/82215835","type": 2,"top": false,"forcePlan": false,"viewCount": 21409,"commentCount": 3,"editUrl": "https://editor.csdn.net/md?articleId=82215835","postTime": "2018-08-30 09:12:12","diggCount": 0,"formatTime": "3 年前"}]}
}

接下来其实就很简单了,跟微信的逻辑一样,找到文章的 id 的dom,然后提取出来就完了。

代码如下

const axios = require('axios').default
const fs = require('fs')
const cheerio = require('cheerio')
const ins = axios.create({headers: {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36",}
})async function craw(index) {let url = `https://blog.csdn.net/community/home-api/v1/get-business-list?page=${index}&size=20&businessType=blog&orderby=&noMore=false&username=weixin_41884153`let { data } = await ins.get(url)console.log(data)try {fs.writeFileSync(`${index}.json`, JSON.stringify(data))} catch (e) {console.log(e)}
}async function writeArticleToFile({ title, url, postTime }) {const _create = new Date(postTime)const year = _create.getFullYear()if (!fs.existsSync(`${year}`)) {fs.mkdirSync(`${year}`)fs.mkdirSync(`images/${year}`)}const content = await crawArticle(url)const result = `---
title: ${title}
date: ${postTime}
layout: post
author: 刘泽美
categories:- CSDN文章- 导入
tags: 随笔
---[原链接](${url})
{% raw %}
${content}
{% endraw %}
`fs.writeFileSync(`${year}/${title}.md`, result, 'utf8')
}async function crawArticle(url) {const res = await ins.get(url)return readArticle(res.data)
}function readArticle(html) {let $ = cheerio.load(html)let content = $('#content_views').html()return content
}async function main() {for (let i = 0; i < 4; i++) {for (const obj of res.data.list) {try {await writeArticleToFile(obj)} catch (e) {console.log(e)}}}
}
main()

微信公众号及CSDN文章爬取相关推荐

  1. python微信爬取教程_python爬虫_微信公众号推送信息爬取的实例

    问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...

  2. python微信公众号推送_python爬虫_微信公众号推送信息爬取的实例

    问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...

  3. python爬虫公众号_python爬虫_微信公众号推送信息爬取的实例

    问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...

  4. python爬取微信公众号_python使用webdriver爬取微信公众号

    本文实例为大家分享了python使用webdriver爬取微信公众号的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- from selenium import we ...

  5. python微信公众号爬虫_微信公众号推送信息爬取---python爬虫

    问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...

  6. python爬取微信公众号推送_微信公众号推送信息爬取---python爬虫

    问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...

  7. python爬虫实战-爬取微信公众号所有历史文章 - (00) 概述

    http://efonfighting.imwork.net 欢迎关注微信公众号"一番码客"获取免费下载服务与源码,并及时接收最新文章推送. 最近几年随着人工智能和大数据的兴起,p ...

  8. 为什么我不在微信公众号上写文章

    作者: 陈浩 原文: https://coolshell.cn/articles/17391.html 很多朋友问我为什么不在微信公众号上写文章.我都没有直接回答,老实说,我也是扭扭捏捏的,才去开了个 ...

  9. 如何将微信公众号上的文章下载下来?

    我最近发现微信公众号发布的的文章里边,有很多不错的图片,想要保存下来,可你习惯性的点击"图片另存为",发现有些图片的格式不是jpg格式,很难保存下来,选择截图又不是很清楚,那么该怎 ...

最新文章

  1. vs2017c语言图像界面库,C語言中在VS2017中構建圖形界面基礎知識點
  2. 如果要和外国人做项目,加入一个teams是第一步,就跟我们的企业微信,钉钉差不多
  3. linux echo命令
  4. 面向对象和面向过程_程序员给你解释:面向对象和面向过程的区别,到底是怎么回事?...
  5. poj 2031 BuildingaSpaceStation 最小生成树 Prim、Kruskal
  6. 怎么让电脑屏幕一直亮着_上班族需要注意哪些养生禁忌 一直坐着没好处_百姓民生_新闻...
  7. 微信小程序之验证码短信倒计时
  8. std string 编码_【星云测试】Wings企业级单元测试自动编码引擎白皮书
  9. sigmoid层的输出_keras如何多输入多输出,以及中间层输出
  10. java captcha 验证码_java生成图片验证码的示例代码
  11. [HP NX6320] 安装 windows2003 操作系统 全过程
  12. Matlab图形的线型、标记、颜色
  13. 技术与教研并驾齐驱,海风教育如何用模式创新定义教育智能新高度?
  14. 联想电脑阻止c语言运行,联想电脑运行程序打不开怎么解决
  15. 【NFC】手机手环模拟门禁卡
  16. 非编码区单核苷酸变异
  17. matlab 蠓虫,蠓虫分类.doc.doc
  18. 变速积分PID控制算法
  19. SAP中评估变式中“外协加工物料的间接费用”
  20. javaweb大学生消费状况调查系统

热门文章

  1. 将windows10操作系统硬盘格式化为FAT32
  2. Spring学习笔记(三十二)——SpringBoot中cache缓存的介绍和使用
  3. 计算机配件销售系统,电脑配件销售管理系统
  4. 图神经网络学习(一)
  5. SQL语句中where 1=0是什么意思
  6. nvcc fatal : No input files specified; use option --help for more information
  7. php word 添加,PHP 实现Office word 关键词添加背景色
  8. DB2 使用REORG命令重组优化表和索引
  9. Bugku - 代码审计 | md5函数
  10. 软件产品检测测试报告找谁做?出测试报告机构推荐