如何获取公众号文章并保存有道笔记

  • 写作目的
  • 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

如何获取公众号文章并保存有道笔记相关推荐

  1. 使用Python快速获取公众号文章定制电子书(二)

    原文链接 我的GitHub博客地址 接上篇文章使用Python快速获取公众号文章定制电子书(一).我们现在已经成功的将公众号历史消息的前十条文章给爬取了出来,使用 content_url 这个关键字段 ...

  2. 获取公众号文章小工具

    python的自动获取公众号文章 前言 由于作者想每天都发一篇公众号文章,但是却又不想天天写文章,作者没有这个精力和时间,于是,我就想来,写一个小工具,每天就只需要简单的操作就可以快速发布一篇文章,虽 ...

  3. (Java篇)爬取微信公众号文章并保存为 PDF 格式

    前言 背景: 某一天,拿着自己的手机看着技术文章,然而手机看技术文章,有时候确实蛋疼,因为一旦代码多起来,小屏幕看的还是眼花:又或者某一天觉得这一篇文章,觉得写的很棒棒哦,于是先收藏,打算过几天看,然 ...

  4. 四个步骤,获取公众号文章封面图

    公众号也玩了好多年了,经常有朋友在后台私信问我:xxx文章的封面图可以发一下吗?也怪我,没有保留素材的习惯,就导致好多次都找不到原图了 相信很多朋友也有类似的情况,遇到喜欢的封面图后,发现推文正文中并 ...

  5. 【技术应用】java通过url爬虫获取公众号文章内容

    [技术应用]java通过url爬虫获取公众号文章内容 一.前言 二.解决思路 三.爬虫工具 四.代码实现 1.爬取公众号文章 2.爬取CSDN文章 五.总结 一.前言 平时在微信或者钉钉发送消息时,会 ...

  6. 微信公众号文章批量保存到本地的方法

    其他不多说,直接入主题,目前比较常见的保存微信文章的方法有以下几种,简要分析如下: 1. 手动保存 微信登陆电脑客户端,用自带浏览器打开微信公众号文章,然后选择,复制,粘贴到Word里,进行保存. 这 ...

  7. 使用Python快速获取公众号文章定制电子书(一)

    原文链接 我的GitHub博客地址 前言 分享一个笔者最近写的 Python 相关的小 demo,爬取某个公众号的所有历史文章,并导出到本地,方便之后在线下环境直接观看.参考了刘志军的小册基于Pyth ...

  8. 搜狗微信下线了怎么获取公众号文章?手把手教你最新获取方式

    关于微信公众号<云爬虫技术研究笔记>可以看到更多哦! 背景 最近发现搜狗微信在2019.10.29号的时候悄然下线了一个功能,也就是不能在搜狗搜索中指定公众号的名称,如下图   很多媒体以 ...

  9. python爬取正确但不出文件_使用Python爬取微信公众号文章并保存为PDF文件(解决图片不显示的问题)...

    前言 第一次写博客,主要内容是爬取微信公众号的文章,将文章以PDF格式保存在本地. 爬取微信公众号文章(使用wechatsogou) 1.安装 pip install wechatsogou --up ...

最新文章

  1. NUC1312 Sum【水题+数学题】
  2. 开发日记-20190509
  3. 30.Node.js 全局对象
  4. ViewGroup.LayoutParams
  5. python一个中文占几个字节_python中英文字母和中文汉字所占的字节
  6. srsLTE源码学习:NAS非接入层、PDCP分组数据汇聚协议、PDU 协议数据单元 头文件
  7. mysql新浪微盘_Android62期视频教程全集下载
  8. ISO9001 试题及答案
  9. 米勒-拉宾(MillerRabbin)素性测试算法模板
  10. Ubuntu 16.04下使用Wine安装Windows版的微信(不太完美)
  11. Android开发基础不牢?怒斩获了30家互联网公司offer,终局之战
  12. 解决background中图片太大只显示一部分
  13. “消失”的Android技术博主们现在如何!Android开发者前路在哪?
  14. 开源项目推荐:OpenGL/Vulkan/Cairo/Skia/angle/VTK/OpenVG/MyPaint/GIMP/Krita/Pencil2D/inkspace/enve等绘图库或画图软件
  15. 对开发初步认识和体验
  16. win10电脑桌面透明便签_DesktopNoteOK桌面便签小工具下载|windows10桌面透明便签插件_最火软件站...
  17. 反演产品的精度和空间分辨率
  18. 微信小程序中的图片处理
  19. DebianLinux下如何安装软件(转)
  20. win7系统,网络ID是灰色的。就是要看网络工作组计算机的那个“网络 ID”的那个按钮。

热门文章

  1. centos挂载u盘只读_centos挂载u盘只读_针对优盘在linux下文件只读的解决方案
  2. CSS/HTML 5简洁带图标的input日期选择器
  3. android 模拟工具 mac,夜神模拟器mac版-夜神安卓模拟器Mac版下载 V3.8.5.5-PC6苹果网...
  4. 第十五天 11-常见的网络相关命令
  5. 命名实体识别(NER)知识汇总
  6. 球机器人 配重_DIY:拥有绝佳移动力的球平衡机器人
  7. IP协议 (通俗易懂),IP协议的主要功能及实现原理,IP地址分类,IP数据包分片,IP数据报格式。
  8. React.createElement()的使用
  9. Windows 8.1核心版通过注册表启用Guest账号的局域网共享
  10. 匈牙利命名法(Hungarian Notation)