栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

如何获取公众号文章并保存有道笔记
  • 写作目的
  • 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"]:
             # 提取每页文章的标题及对应的url
             items = []
             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("", "",
                html_content)
result = re.sub("", "", result)
result = re.sub("
", "", result) result = re.sub("", "", result) result = re.sub("", "", result) result = re.sub("", "", result) result = re.sub("", "", result) result = re.sub("", "", result) result = re.sub("", "", 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 index
        
    def 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().hex

data = {
            "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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/487524.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号