微信公众号及CSDN文章爬取
写在前面
最近刚开了自己的博客,就想着把原来写的一些文章都放到这里来。
https://blog.liuzemei.com
准备做筛选,然后一篇篇的把微信公众号的文章复制过来的,结果发现
- 太多了,而且不好筛选。
- 复制的文章都是不带格式的,也不大好看。
于是就想着写个脚本,直接把带格式的 html 抓过来,于是就有了本篇教程。
开发环境
nodejs.v16
抓包工具
开始
一、 微信公众号文章的爬取
https://zhuanlan.zhihu.com/p/77438394
关于 python 的细节可以直接查看上述的链接。我这里是用的 nodejs,相当于稍微翻译了一下。
1. 从抓包工具获取 __biz
uin
和 key
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文章爬取相关推荐
- python微信爬取教程_python爬虫_微信公众号推送信息爬取的实例
问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...
- python微信公众号推送_python爬虫_微信公众号推送信息爬取的实例
问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...
- python爬虫公众号_python爬虫_微信公众号推送信息爬取的实例
问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...
- python爬取微信公众号_python使用webdriver爬取微信公众号
本文实例为大家分享了python使用webdriver爬取微信公众号的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- from selenium import we ...
- python微信公众号爬虫_微信公众号推送信息爬取---python爬虫
问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...
- python爬取微信公众号推送_微信公众号推送信息爬取---python爬虫
问题描述 利用搜狗的微信搜索抓取指定公众号的最新一条推送,并保存相应的网页至本地. 注意点 搜狗微信获取的地址为临时链接,具有时效性. 公众号为动态网页(JavaScript渲染),使用request ...
- python爬虫实战-爬取微信公众号所有历史文章 - (00) 概述
http://efonfighting.imwork.net 欢迎关注微信公众号"一番码客"获取免费下载服务与源码,并及时接收最新文章推送. 最近几年随着人工智能和大数据的兴起,p ...
- 为什么我不在微信公众号上写文章
作者: 陈浩 原文: https://coolshell.cn/articles/17391.html 很多朋友问我为什么不在微信公众号上写文章.我都没有直接回答,老实说,我也是扭扭捏捏的,才去开了个 ...
- 如何将微信公众号上的文章下载下来?
我最近发现微信公众号发布的的文章里边,有很多不错的图片,想要保存下来,可你习惯性的点击"图片另存为",发现有些图片的格式不是jpg格式,很难保存下来,选择截图又不是很清楚,那么该怎 ...
最新文章
- vs2017c语言图像界面库,C語言中在VS2017中構建圖形界面基礎知識點
- 如果要和外国人做项目,加入一个teams是第一步,就跟我们的企业微信,钉钉差不多
- linux echo命令
- 面向对象和面向过程_程序员给你解释:面向对象和面向过程的区别,到底是怎么回事?...
- poj 2031 BuildingaSpaceStation 最小生成树 Prim、Kruskal
- 怎么让电脑屏幕一直亮着_上班族需要注意哪些养生禁忌 一直坐着没好处_百姓民生_新闻...
- 微信小程序之验证码短信倒计时
- std string 编码_【星云测试】Wings企业级单元测试自动编码引擎白皮书
- sigmoid层的输出_keras如何多输入多输出,以及中间层输出
- java captcha 验证码_java生成图片验证码的示例代码
- [HP NX6320] 安装 windows2003 操作系统 全过程
- Matlab图形的线型、标记、颜色
- 技术与教研并驾齐驱,海风教育如何用模式创新定义教育智能新高度?
- 联想电脑阻止c语言运行,联想电脑运行程序打不开怎么解决
- 【NFC】手机手环模拟门禁卡
- 非编码区单核苷酸变异
- matlab 蠓虫,蠓虫分类.doc.doc
- 变速积分PID控制算法
- SAP中评估变式中“外协加工物料的间接费用”
- javaweb大学生消费状况调查系统
热门文章
- 将windows10操作系统硬盘格式化为FAT32
- Spring学习笔记(三十二)——SpringBoot中cache缓存的介绍和使用
- 计算机配件销售系统,电脑配件销售管理系统
- 图神经网络学习(一)
- SQL语句中where 1=0是什么意思
- nvcc fatal : No input files specified; use option --help for more information
- php word 添加,PHP 实现Office word 关键词添加背景色
- DB2 使用REORG命令重组优化表和索引
- Bugku - 代码审计 | md5函数
- 软件产品检测测试报告找谁做?出测试报告机构推荐