如何获取公众号文章并保存有道笔记
如何获取公众号文章并保存有道笔记
- 写作目的
- 1. 获取公众号文章链接
- 2. 解析公众号文章
- 3. 保存有道笔记
- 源代码
- 最后感想
写作目的
做这个程序是出于自己的学习目的。因为我有学习英语的习惯,每天看公众号TeachGwen的推送文章,并把相关文章短语词汇记录到有道笔记,方便以后复习。但又不是每次都可以在电脑面前学习,很多时候是对着手机看,手机上粘贴复制到有道笔记很麻烦,还容易出错。于是萌生了写个python爬虫自动抓取文章并保存有道笔记的想法。从有这个想法到最后写成,时间也不长,网上资料很多,实现也不复杂,主要使用了爬虫常用的request,xml解析等模块。
该程序分三部分:
1. 获取公众号文章链接
这部分参考了爬虫如何爬取微信公众号文章,利用微信订阅号里面的查询公众号文章的功能来爬取公众号文章的url,更新时间等信息。
https://mp.weixin.qq.com/ 在这里申请订阅号,注册登录后,在公众号系统里面->内容与互动->草稿箱->新的创作->写新图文->超链接->公众号搜索
如下:点击搜索,便出现了该公众号下所有文章的列表。
利用chrome中的develop tool获取 Request URL, Headers等信息来构造request请求包。
url里面包括了begin和count参数,表示翻页获取任何也一页内所有文章列表。同样可以构造不同的url来获取你想要页数的所有文章。注意事项
- 因为公众号登录的cookie是有时效的,大概一周,不能一直使用一个cookie。
- python爬虫如何实现每天爬取微信公众号的推送文章方法也不再好用,因为微信网页版已经不能通过wxpy登陆,这个方法也无效。
- 而且登录需要扫描微信二维码,旦旦账号密码也不能完成登录。
- 目前只能自己手动登录获取cookie再执行程序,没有其他好的办法。如果有大神指点感激不尽。
self.headers = {"Cookie": "appmsglist_action_3889698448=card; ***", #此处使用自己的cookie"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36",}for i in range(30):self.BEGIN = str(i * 5)url = "https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin={BEGIN}&count=5&fakeid={FAKEID}&type=9&query=&token={TOKEN}&lang=zh_CN&f=json&ajax=1".format(BEGIN=self.BEGIN, FAKEID=self.FAKEID, TOKEN=self.TOKEN)r = requests.request("GET", url, headers=self.headers)content_json = r.json()
200即成功返回,把其中的app_msg_list中的时间日期,标题,url link提出出来,保存到文件中。
for item in content_json["app_msg_list"]:# 提取每页文章的标题及对应的urlitems = []tupTime = time.localtime(item['update_time'])# standardTime = time.strftime("%Y-%m-%d %H:%M:%S", tupTime)standardTime = time.strftime("%Y%m%d", tupTime) # 获得日期items.append(standardTime)items.append(item["title"])items.append(item["link"])content_list.append(items)name = ['title', 'date', 'link']test = pd.DataFrame(columns=name, data=content_list)this_date = datetime.datetime.today().date()this_date = this_date.strftime(format='%Y%m%d')list_file = "articles/GwenList" + this_date + ".csv"test.to_csv(list_file, mode='a', encoding='utf-8')
2. 解析公众号文章
- 获取文章html内容
将获得的所有文章列表取出到一个list中,因为每天的推送文章有好几篇,时间日期又是从最新日期开始往后排,所以写了个reorder_list函数来重新把文章从最老的排到最新的,但每天的文章依然保持原有顺序。通过list中的url,用 requests.get 获取文章所有内容,此时的header不需要cookie,因为这是大家都可以查看的文章,只需要"User-Agent"字段即可。
response = requests.get(url, headers=self.headers)
- 解析html
剩下的就是解析获取的html内容,抓取自己想要的信息,所有文本信息都在js_content中。利用BeautifulSoup提取这个div标签所有内容,然后用正则表达式除去不想显示各种tag的内容,例如照片,视频等。后面再根据每种类型文章取出自己想要的section内容,除掉那些广告和自己不想要的部分。
递归从后往前寻找某个字段,使用如下rfind_n_substr函数。最后存为后缀.md文件。 - 为什么保留html格式
后面考虑到保存到有道笔记是markdown格式,认得html标签,才采用了保留原有html内容。如果只想要提取文本内容,那可以使用html.xpath来取得文本内容,如此就不带有格式了,可能效果不那么好。但markdown的弊端就是后期不好编辑,各有长短,看个人取舍。
soup = BeautifulSoup(html_str, 'html.parser')
for k in soup.find_all('div'):if k.has_attr('id') and k['id'] == 'js_content':html_content = str(k)html_content = re.sub(r'\n+', '', html_content)
result = re.sub("<div class=\"rich_media_content\" id=\"js_content\" style=\"visibility: hidden;\">", "",html_content)
result = re.sub("</div>", "", result)
result = re.sub("<section><svg.*?></svg></section>", "", result)
result = re.sub("<svg.*?></svg>", "", result)
result = re.sub("<iframe.*?></iframe>", "", result)
result = re.sub("<img.*?></img>", "", result)
result = re.sub("<mpvoice.*?></mpvoice>", "", result)
result = re.sub("<qqmusic.*?></qqmusic>", "", result)
result = re.sub("<animate.*?></animate>", "", result)
# 在src字符串里,从end出往前找,找到第count个sub子字符串。def rfind_n_substr(self, src, sub, count, end):index = src.rfind(sub, 0, end)if index != -1 and count > 1:return self.rfind_n_substr(src, sub, count - 1, index - 1)return indexdef save_md(self, html_str, page_name):file_path = "articles/{}.md".format(page_name)with open(file_path, 'a+', encoding="utf-8") as f:f.write(html_str)
3. 保存有道笔记
- 首先,登录网页版有道笔记,手动操作保存笔记,用developer tool跟踪request的url和headers,记录下来。尤其是cstk。
- 把刚保存的md文件读出
- 用uuid构造fileId, 填写data内容,把文件内容放入bodyString字段
- 利用reqests.post方法,保存到有道笔记。
fileId = "WEB" + uuid.uuid1().hexdata = {"fileId": fileId,"parentId": "SVR168BF776AD9D44ABB8579527EF93CB26","name": title,"domain": 1,"rootVersion": -1,"dir": "false","sessionId": "","bodyString": content.encode('utf-8'),"createTime": int(time.time()),"modifyTime": int(time.time()),"transactionId": fileId}res = requests.post(url, headers=self.HEADERS, data=data)
- 提醒:为防止爬虫被禁,设置random的sleep时间,不要频繁抓取。
- 最后效果:
源代码
GwenCrawler
最后感想
其实整个程序不难,但开始怎么寻找方法花了不少时间,还考虑用有道笔记API但注册太麻烦,也没人维护。也考虑印象笔记等,但markdown支持html不友好。
打通流程后,又在调试html内容里面花了好久,有些固定格式文章呈现的效果比较满意,目前有些随机文章的格式还是不那么理想,日后有空再调。对于不同日期节假日的文章格式都有可能不一样,也做了一些处理。也想过做一个GUI界面,把数据存入数据库等,这些都可以以后慢慢延展,至少目前足够用了。
- 参考文章:
https://blog.csdn.net/jingyoushui/article/details/100109164
https://blog.csdn.net/jingyoushui/article/details/100138450
https://blog.csdn.net/qq_44667896/article/details/104793547
如何获取公众号文章并保存有道笔记相关推荐
- 使用Python快速获取公众号文章定制电子书(二)
原文链接 我的GitHub博客地址 接上篇文章使用Python快速获取公众号文章定制电子书(一).我们现在已经成功的将公众号历史消息的前十条文章给爬取了出来,使用 content_url 这个关键字段 ...
- 获取公众号文章小工具
python的自动获取公众号文章 前言 由于作者想每天都发一篇公众号文章,但是却又不想天天写文章,作者没有这个精力和时间,于是,我就想来,写一个小工具,每天就只需要简单的操作就可以快速发布一篇文章,虽 ...
- (Java篇)爬取微信公众号文章并保存为 PDF 格式
前言 背景: 某一天,拿着自己的手机看着技术文章,然而手机看技术文章,有时候确实蛋疼,因为一旦代码多起来,小屏幕看的还是眼花:又或者某一天觉得这一篇文章,觉得写的很棒棒哦,于是先收藏,打算过几天看,然 ...
- 四个步骤,获取公众号文章封面图
公众号也玩了好多年了,经常有朋友在后台私信问我:xxx文章的封面图可以发一下吗?也怪我,没有保留素材的习惯,就导致好多次都找不到原图了 相信很多朋友也有类似的情况,遇到喜欢的封面图后,发现推文正文中并 ...
- 【技术应用】java通过url爬虫获取公众号文章内容
[技术应用]java通过url爬虫获取公众号文章内容 一.前言 二.解决思路 三.爬虫工具 四.代码实现 1.爬取公众号文章 2.爬取CSDN文章 五.总结 一.前言 平时在微信或者钉钉发送消息时,会 ...
- 微信公众号文章批量保存到本地的方法
其他不多说,直接入主题,目前比较常见的保存微信文章的方法有以下几种,简要分析如下: 1. 手动保存 微信登陆电脑客户端,用自带浏览器打开微信公众号文章,然后选择,复制,粘贴到Word里,进行保存. 这 ...
- 使用Python快速获取公众号文章定制电子书(一)
原文链接 我的GitHub博客地址 前言 分享一个笔者最近写的 Python 相关的小 demo,爬取某个公众号的所有历史文章,并导出到本地,方便之后在线下环境直接观看.参考了刘志军的小册基于Pyth ...
- 搜狗微信下线了怎么获取公众号文章?手把手教你最新获取方式
关于微信公众号<云爬虫技术研究笔记>可以看到更多哦! 背景 最近发现搜狗微信在2019.10.29号的时候悄然下线了一个功能,也就是不能在搜狗搜索中指定公众号的名称,如下图 很多媒体以 ...
- python爬取正确但不出文件_使用Python爬取微信公众号文章并保存为PDF文件(解决图片不显示的问题)...
前言 第一次写博客,主要内容是爬取微信公众号的文章,将文章以PDF格式保存在本地. 爬取微信公众号文章(使用wechatsogou) 1.安装 pip install wechatsogou --up ...
最新文章
- NUC1312 Sum【水题+数学题】
- 开发日记-20190509
- 30.Node.js 全局对象
- ViewGroup.LayoutParams
- python一个中文占几个字节_python中英文字母和中文汉字所占的字节
- srsLTE源码学习:NAS非接入层、PDCP分组数据汇聚协议、PDU 协议数据单元 头文件
- mysql新浪微盘_Android62期视频教程全集下载
- ISO9001 试题及答案
- 米勒-拉宾(MillerRabbin)素性测试算法模板
- Ubuntu 16.04下使用Wine安装Windows版的微信(不太完美)
- Android开发基础不牢?怒斩获了30家互联网公司offer,终局之战
- 解决background中图片太大只显示一部分
- “消失”的Android技术博主们现在如何!Android开发者前路在哪?
- 开源项目推荐:OpenGL/Vulkan/Cairo/Skia/angle/VTK/OpenVG/MyPaint/GIMP/Krita/Pencil2D/inkspace/enve等绘图库或画图软件
- 对开发初步认识和体验
- win10电脑桌面透明便签_DesktopNoteOK桌面便签小工具下载|windows10桌面透明便签插件_最火软件站...
- 反演产品的精度和空间分辨率
- 微信小程序中的图片处理
- DebianLinux下如何安装软件(转)
- win7系统,网络ID是灰色的。就是要看网络工作组计算机的那个“网络 ID”的那个按钮。
热门文章
- centos挂载u盘只读_centos挂载u盘只读_针对优盘在linux下文件只读的解决方案
- CSS/HTML 5简洁带图标的input日期选择器
- android 模拟工具 mac,夜神模拟器mac版-夜神安卓模拟器Mac版下载 V3.8.5.5-PC6苹果网...
- 第十五天 11-常见的网络相关命令
- 命名实体识别(NER)知识汇总
- 球机器人 配重_DIY:拥有绝佳移动力的球平衡机器人
- IP协议 (通俗易懂),IP协议的主要功能及实现原理,IP地址分类,IP数据包分片,IP数据报格式。
- React.createElement()的使用
- Windows 8.1核心版通过注册表启用Guest账号的局域网共享
- 匈牙利命名法(Hungarian Notation)