50行代码教你打造一个公众号文章采集器

Alfred的女票是一枚数据科学领域的新媒体运营官(是的,Alfred是一名程序员,Alfred有女票

),每天都要阅读大量的行业相关文章,以掌握行业的动向,挑选和生产相关内容。为此,她关注了一大批的相关公众号,每天都一个个公众号挨个点开阅读,怪麻烦的。

一来可能漏掉某些公众号更新的重要讯息,二来经常会看到转载的重复性的文章。

这可咋办呢?

身为一个合(gao)格(shi)的男票,我是那个看在眼里急在心里啊!

那就写一个公众号文章的收集器吧,每天早上9点的时候都把昨天一天以来各个行业内公众号发表的文章的标题、摘要和链接等相关信息爬下来,形成一个文档发给女票,这样可以大大方便阅读。

就这么愉快地决定了

需求很简单,主要分为两块,一块是公众号文章爬取,一块是把爬回来的文章储存为word文档。

公众号文章爬取

首先跟女票要了她关注的公众号,结果她发我很长很长的一串列表,足足有50多个公众号。算了算,如果每个公众号每天更新3篇文章,那么她每天最少就得看150多篇公众号文章,确实是够呛呀。

接着是爬取公众号文章。这方面早已有人造好了轮子,也就是基于搜狗微信搜索的微信公众号爬虫接口:WechatSogou,在此感谢@Chyroc。

传送门:

https://github.com/Chyroc/WechatSogou

也就是,我们不用自己造轮子,只需要调用API就好了。

wechatsogou 的使用很简单,先实例化一个WechatSogouAPI,便可以调用get_gzh_article_by_history()方法返回最近10篇文章,比如说要爬取“Alfred在纽西兰”的文章,便是:

ws_api = wechatsogou.WechatSogouAPI() ws_api. get_gzh_article_by_history('Alfred在纽西兰')

这样便可以返回一个json文件,里面包含“Alfred在纽西兰”公众号的最近10篇文章。

这个轮子是不是嗖嗖的?

可见,文章储存在“article”对应的列表里,相关的信息有标题(title)、摘要(abstract)、文章链接(content_url)、发表时间(datetime)、是否头条(main)、版权状况(copyright_stat)等。

这就是说,只要实例化一个WechatSogouAPI,然后遍历一下长长的公众号列表,便可以把所有公众号近期发表的文章爬取下来了。然后加一个时间过滤,便可获得一天以来发表的文章。

当然,作为一个贴心的男票,我还加上了头条文章过滤和原创文章过滤,默认把不是头条和不是原创的文章都过滤掉,并把它封装成一个function:

from datetime import * import wechatsogou # 文章爬取 def get_articles(headline=True, original=True, timedel=1, add_account=None): with open('gzh.txt', 'r') as f: accounts = [account.strip() for account in f.readlines()] # add_account必须是一个list或None if add_account is not None: if isinstance(list, add_account): accounts.extend(add_account) with open('gzh.txt', 'w') as f: for account in accounts: f.write(account) else: print('add_account should be a list') ws_api = wechatsogou.WechatSogouAPI(captcha_break_time=3) articles = [] for account in accounts: articles.extend(reformat(ws_api.get_gzh_article_by_history(account))) # 时间过滤,只选取规定天数以内的 timestamp = int((datetime.now()-timedelta(days=timedel)).timestamp()) articles = [article for article in articles if article['datetime'] > timestamp] # 头条文章过滤,是否选取头条文章,默认是 if headline: articles = [article for article in articles if article['main'] == 1] # 原创文章过滤,是否选取原创文章,默认是 if original: articles = [article for article in articles if article['copyright_stat'] == 100] return articles # 为保存每篇文章的字典添加一个公众号来源 def reformat(data): atcs = data.get('article') if atcs is not None: wechat_name = data.get('gzh')['wechat_name'] for article in atcs: article['wechat_name'] = wechat_name return atcs

存储为word文档

最后爬回来的文章是一个list,里面每个dict存放着每篇文章的信息。我们需要把这个list保存到word文档里面,并且以一个清晰的排版呈现出来。

这时候有一个叫python-docx的库,可以很方便的帮助我们来做这件事情。

传送门:

https://python-docx.readthedocs.io/

Python-docx的使用也很简单,实例化一个类,再通过add_headingd()的方法添加标题、add_paragraph()方法添加段落、add_picture()方法添加图片,便可以按照我们的想法进行排版。例如:

from docx import Document from docx.shared import Inches document = Document() # 实例化一个Document类 document.add_heading('这是一个标题', 0) # 添加标题 document.add_paragraph('这是一段话') # 添加段落 document.add_picture('一个图片.jpeg', width=Inches(1)) 添加图片

上面一段代码生成的word文档长这样:

因此,遍历一下爬回来的list,然后排版,保存到本地,便大功告成了。

最后爬回来的文档开头长这样:

结尾长这样:

撒狗粮成功!溜了~

后记:

1. 后期还可以为这个采集器加上更多的功能,比如说再添加一个把word以邮件形式直接发送邮箱的功能,或者保存为Excel的功能等,都是可以的;

2. 当然也可以把它转换成小程序,方便运行;

3. 由于验证码识别的原因,有一些验证码需要人工识别,希望以后的wechatsougou可以更强大;

原文发布于微信公众号 - IT派(transfer_3255716726)

原文发表时间:2018-06-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏美团技术团队

大众点评订单系统分库分表实践

背景 原大众点评的订单单表早就已经突破两百G,由于查询维度较多,即使加了两个从库,优化索引,仍然存在很多查询不理想的情况。去年大量抢购活动的开展,使数据库达到瓶...

68860
来自专栏编程

EMC Unity架构和增强功能概述

EMC Unity是EMC最新发布的中端存储系列产品。Unity在简化管理、现代化架构设计、总拥有成本和灵活部署等方面建立了新的标准,满足大型或小型公司资源越趋...

33260
来自专栏IMWeb前端团队

Front-End MV*简述(一)

本文作者:IMWeb 何璇 原文出处:IMWeb社区 未经同意,禁止转载 近几年来由于web应用的交互越来越复杂,前端技术也迎来了一个飞速发展的时期。...

203100
来自专栏美团技术团队

移动端性能监控方案Hertz

性能问题是造成App用户流失的罪魁祸首之一。App的性能问题包括崩溃、网络请求错误或超时、响应速度慢、列表滚动卡顿、流量大、耗电等等。而导致App性能低下的原因...

89630
来自专栏企鹅号快讯

2018年Python 值得关注的开源库、工具和开发者

码个蛋第249次推文 1 开源库 Web 领域:Sanic ? https://github.com/channelcat/sanic 这个库的名字和之前一个很...

26990
来自专栏达摩兵的技术空间

重新思考数据输入

在目前的产品交互中,输入数据然后程序或者产品对数据进行验证是非常常见的需求,而产品进行验证的目的性也很明确,就是为了避免脏数据进入数据库。但是从产品交互本身来讲...

11020
来自专栏华章科技

推荐 12 款堪称神器的插件,提高工作效率必不可少

导读:工欲善其事,必先利其器,程序员的日常工作根本就离不开Chrome浏览器(还不知道的请面壁思过130s)!其他功能就不啰嗦了,今天来说说 Chrome 如何...

61520
来自专栏刺客博客

谈谈云免原理

7.5K20
来自专栏IMWeb前端团队

聊聊移动端跨平台开发的各种技术

介绍 最近出现的 React Native 再次让跨平台移动端开发这个话题火起来了,曾经大家以为在手机上可以像桌面那样通过 Web 技术来实现跨平台开发,却大多...

30950
来自专栏华章科技

12款堪称神器的 Chrome 插件,Max 你的工作效率!

导语:好的工具插件是提高程序员生产力的法宝,本文介绍了 12 款Chrome 插件,非常高效实用,还附带下载地址, 果断收藏~

28720

扫码关注云+社区

领取腾讯云代金券