国庆期间,我成功用Python爬取了几个公众号的历史文章数据。但是在此之前,我其实和大多数小伙伴一样都是Python零基础小白。
我想,这其中我一定是做对了某些事。
通过这篇文章,我想和你分享,
1)我的思考过程
2)我的完整爬虫过程
文末附微信公众号文章下载工具
1.
为什么我能够把这件事做成?
其实是因为做对了两个维度的努力
1)做对的事情
2)把事情做对
这两个维度本质上是一个关于面积的计算:
把事做成=做对的事情 x 把事情做对
查理芒格说,要“去鱼多的地方捕鱼”。
做对的事情,指的是战略方向的正确。
比如下文我提到用Python来爬取公众号,作为Python零基础小白,我的思考点不是如何从零到一学习Python,而是想着找现成的Python爬取公众号文章的案例来学习,直接复制别人成功的经验。这就是做对的事情,
做大概率正确的事情,不至于多走弯路。
把事情做对,指的是战术层面的执行。比如下文我研究Python爬取公众号文章方法的时候,我把能想到的所有搜索渠道都搜了一遍,把能想到的所有关键词也都组合了一遍。但是我也相信,绝大多数小伙伴用百度搜问题的时候,不到20分钟就放弃了。
我相信这些小伙伴一定没好好学过概率论,因为假如一件事情成功的概率是20%,只要能持续重复14次,就可以把这件事情成功的概率提高到95%。
推导过程如下:
做一次失败的概率为:1-20%=80%=0.8
重复做n次至少有一次成功的概率是95%,就相当于重复做n次每一次都不成功的概率是5%,
重复做n次都不成功:80%^n=1-95%=5%=0.05
n=log(0.8,0.05)=13.42
所以重复做13.42次,你成功的概率能达到95%。
所以正确事情重复做,大概率是会成功的。
下面就来和你分享一下我的解题过程:
所以正确事情重复做,大概率是会成功的。
下面就来和你分享一下我的解题过程:
2.
第一步,澄清问题
1)探究问题的本质
为什么我需要爬取公众号数据?
因为太久没写文章,加上被催稿,于是我决定动笔。
在此之前,我准备先搭建好选题库,因为选题意味着文章受众群体和阅读数据直接挂钩。
如何找到一个好的选题?
最简单有效的方法,就是找竞品账号,看看别人的公众号里,哪些文章火了。那些被验证过的选题,都可以纳入你的选题库。于是问题来了,
我该如何爬取别人公众号的数据?
2)准确的描述问题
问题是落差,是理想结果与现状之间的落差。
我的理想结果:导出竞品账号公众号的历史数据,这里的数据需要包含「标题」、「文章链接」、「阅读数」、「点赞数」、「在看数」。我的现状:并不清楚如何导出这些数据。
第二步,寻找对策
生活中我们所遇到的所有问题都可以囊括成两类问题,一类问题是你见过类似的,但是以前的解决方法无效。一类问题是你从来没有遇见过的,摸不着头脑,没有经验可循。
如何寻找对策?
我们可以运用系统思维来解决问题。
所谓的系统思维,就是通过构建、选择以及改善模型来帮助我们更加高效地表达和思考的思维方式。
对于模型的选择,大致有两种方式,一种方式是选择已有的模型进行使用。但是在实际解决问题的时候,我们很多时候会发现自己找不到一个合适的模型,
那该怎么办呢?
这时候就需要我们自己来构建一个新的模型。最常见的构建模型的方法是采用KJ法
1)进行头脑风暴尽可能的罗列要点2)按照内在的相似性、相关性进行归纳
针对这个故事背景,构建出来的模型无非两个维度,如果有现成的数据就直接用别人的数据,如果实在找不到现成的数据,再考虑自己手动爬取。
「1.找现成的数据」
我想到了几个方案,
01 借助壹伴插件导出公众号历史文章
壹伴是可以直接导出个人公众号的历史数据的,但研究发现,它并不支持导出其他公众号的历史数据。
02 借助第三方公众号数据平台
1) 新榜
搜索公众号-点击进入详情页-点击右上角「内容列表」
能查看历史数据,但是仅支持查看最近7天内的推文,显然也不能满足我的需求。
其他相似平台,如清博大数据、西瓜数据都存在相应的局限。
03 某宝付费
淘宝的主流店铺都支持将公众号文章导出为「Word、PDF、HTML格式」,少部分店铺支持导出为Excel格式,价格普遍在4.9元/1000篇左右。
问了几个店铺都不支持导出阅读量等数据,如果你只需要将文章导出为PDF,淘宝付费无疑是很好的选择。
「2.手动爬取数据」
**01 找可以下载公众号文章的软件 **
这里提到的软件,文末会附获取方式
通过查询【公众号文章】、【下载】等关键词,我成功找到了几个可以下载公众号文章的软件。
1)WeChatDownload
这款软件我几年前用过,可以将文章导出为Word、PDF、HTML格式,并支持下载文章评论,缺点依然是不支持下载文章阅读量等数据,无法导出为Excel格式。
2)微信公众号文章下载器
和WechatDownload类似,由吾爱大神开发,支持将文章导出为Word、PDF、HTML格式,并支持下载文章评论。
3)微信公众号文章搜索导出助手
优点:支持将文章批量导出为Word、PDF、Txt、Excel、HTML,也可以将微信文章中视频、语音、音乐音频、评论留言、文章链接、封面头图。
缺点:软件需要付费,目前会员价格49元/年,获取阅读量、评论数、点赞数、在看数据需要付费调用接口25元/1000次。
如果需要爬取的公众号数量不多,这个方案是可以考虑的。
既然上面的方法都不能完美的满足我的需求,于是我产生了一个大胆的想法,干脆自己手动爬虫。
02手动爬虫
最直接想到的就是用Python进行爬虫,
可是问题在于,我并不会Python呀!
于是又构成了一个新的问题,
1)澄清问题
我的理想结果:借助python爬取公众号数据,数据需要包含「标题」、「文章链接」、「阅读数」、「点赞数」、「在看数」。
我的现状:并不会使用Python进行爬虫
2)寻找对策
上面提到了,对于模型的选择,最直接的方式就是选择已有的模型进行使用。
这里我需要的模型是「Python爬取公众号文章的实操案例」。
我猜测互联网上一定有人用Python爬取过公众号的文章数据,
我需要的并不是从头学习python,
而是从别人的成功案例入手,
研究如何复刻。
果不其然,我在Youtube、知乎、B站、CSDN等平台都找到了很多教程。
第三步,选择对策
根据上文寻找的对策,有好几种方案都可以导出微信文章,但是大部分都无法满足我的定制化需求。
综合考虑,最后选择用「Python爬取公众号文章」。
第四步,解决问题
对这部分爬虫内容不感兴趣的小伙伴可以直接略过....
❶ 搜集Python爬取公众号文章的案例
我猜想你比较好奇的是,我是如何搜到这些内容的?
这里先卖个关子,后文揭晓答案。
❷ 安装Python并配置开发环境
这部分内容其实很容易通过B站搜索到相应的教程,配置Python的开发环境以及安装Pycharm大概2个小时内就可以搞定。
❸ 用Fiddler抓包微信接口
1.登录个人微信公众号后台-新的创作-写新图文进入文章编辑页面
2.鼠标右键-点击「检查」(或者快捷键F12打开开发者模式)-点击超链接-选择你需要爬取数据的公众号
3.在右侧开发者工具中点击「网络」-选择「全部」-然后找到appmsg?action=list_ex&begin=开头的数据包
4.点击appmsg?action=list_ex&begin=在负载里找到「fakied」和「token」,在标头里找到「cookie」和「user-agent」这四个数据是我们需要的。
5.运行Fiddler,打开微信公众号客户端,找到已关注订阅列表,打开该公众号的历史文章页面,并随便点开一篇文章。
6.找到带有mp/getappmsgext?的请求包,在「Params」里找到「Key」、「Pass_ticket」、「appmasg_token」,在「Headers」里找到「Cookie」和「User-Agent」这五个数据也是我们所需要的。
❹ 安装Python的requests库、Workbook库
使用WIN+R,输入‘cmd',进入个人计算机的dos系统,
输入命令'pip install requests',回车,等候电脑安装requests库。
不懂的可以百度,都有详细说明。
❺ 将网页爬取的「fakied」、「token」、「cookie」、「user-agent」值,以及Fiddler爬取的「Key」、「Pass_ticket」、「appmasg_token」、「Cookie」、「User-Agent」值替换进下方代码。
import requestsimport timeimport jsonfrom openpyxl import Workbookimport randomurl = "https://mp.weixin.qq.com/cgi-bin/appmsg"Cookie = "自己的cookies"headers = { "Cookie": Cookie, "User-Agent": "自己的user-agent",}token = "自己公众号的token"#公众号fakeid = "Mzk0NzI5NDc5MA%3D%3D"#公众号对应的idtype = '9'data1 = { "token": token, "lang": "zh_CN", "f": "json", "ajax": "1", "action": "list_ex", "begin": "0", "count": "4", "query": "", "fakeid": fakeid, "type": type,}def getMoreInfo(link): # 获得mid,_biz,idx,sn 这几个在link中的信息 mid = link.split("&")[1].split("=")[1] idx = link.split("&")[2].split("=")[1] sn = link.split("&")[3].split("=")[1] _biz = link.split("&")[0].split("_biz=")[1] pass_ticket = "fiddler中获取"#从fiddler中获取 appmsg_token = "fiddler中获取"#从fiddler中获取 url = "http://mp.weixin.qq.com/mp/getappmsgext"#获取详情页的网址 phoneCookie = "在fiddler中获取" headers = { "Cookie": phoneCookie, "User-Agent": "fiddler中获取" } data = { "is_only_read": "1", "is_temp_url": "0", "appmsg_type": "9", 'reward_uin_count': '0' } params = { "__biz": _biz, "mid": mid, "sn": sn, "idx": idx, "key": "fiddler中获取", "pass_ticket": pass_ticket, "appmsg_token": appmsg_token, "uin": "MTUyNzExNzYy", "wxtoken": "777", } requests.packages.urllib3.disable_warnings() content = requests.post(url, headers=headers, data=data, params=params).json() # print(content["appmsgstat"]["read_num"], content["appmsgstat"]["like_num"]) try: readNum = content["appmsgstat"]["read_num"] print("阅读数:"+str(readNum)) except: readNum = 0 try: likeNum = content["appmsgstat"]["like_num"] print("喜爱数:"+str(likeNum)) except: likeNum = 0 try: old_like_num = content["appmsgstat"]["old_like_num"] print("在读数:"+str(old_like_num)) except: old_like_num = 0 time.sleep(3) # 歇3s,防止被封 return readNum, likeNum,old_like_numdef getAllInfo(url): # 拿一页,存一页 messageAllInfo = [] # begin 从0开始 for i in range(33):#设置爬虫页码 begin = i * 4 data1["begin"] = begin requests.packages.urllib3.disable_warnings() content_json = requests.get(url, headers=headers, params=data1, verify=False).json() time.sleep(random.randint(1, 10)) if "app_msg_list" in content_json: for item in content_json["app_msg_list"]: spider_url = item['link'] readNum, likeNum,old_like_num = getMoreInfo(spider_url) info = { "title": item['title'], "url": item['link'], "readNum": readNum, "likeNum": likeNum, "old_like_num":old_like_num } messageAllInfo.append(info) return messageAllInfodef main(): f = Workbook() # 创建一个workbook 设置编码 sheet = f.active#创建sheet表单 # 写入表头 sheet.cell(row=1, column=1).value = 'title' # 第一行第一列 sheet.cell(row=1, column=2).value = 'url' sheet.cell(row=1, column=3).value = 'readNum(阅读数)' sheet.cell(row=1, column=4).value = 'likeNum(喜爱数)' sheet.cell(row=1, column=5).value = 'old_like_num(在看数)' messageAllInfo = getAllInfo(url)#获取信息 print(messageAllInfo) print(len(messageAllInfo))#输出列表长度 # 写内容 for i in range(1, len(messageAllInfo)+1): sheet.cell(row=i + 1, column=1).value = messageAllInfo[i - 1]['title'] sheet.cell(row=i + 1, column=2).value = messageAllInfo[i - 1]['url'] sheet.cell(row=i + 1, column=3).value = messageAllInfo[i - 1]['readNum'] sheet.cell(row=i + 1, column=4).value = messageAllInfo[i - 1]['likeNum'] sheet.cell(row=i + 1, column=5).value = messageAllInfo[i - 1]['old_like_num'] f.save(u'公众号.xls') # 保存文件if __name__ == '__main__': main()
❻ 运行Python,等待爬取结束。
第五步,复盘归档
虽然问题得到了解决,
但还远没结束。
我们还需要进行一次复盘。
复盘的意义在于从过去获得力量,
来帮助我们更好的面对未来。
通过这次活动,
1)我掌握了用Fiddler和Chalers进行抓包的知识;
2)成功的用Python完成了一个小项目,
获得正反馈后以后学习Python更有动力;
3)掌握了下载公众号文章的几种方法(稀缺的技能往往具备高价值);
4)之后如果需要用Python爬取其他内容例如豆瓣的信息,可以如法炮制。
在研究Python爬虫的过程中,
我还探索了另一种解决问题的方案,
采用无代码爬虫的方式。
这些工具并不能解决该场景提到的问题,
所以我没有展开介绍。
但在进行网页爬虫的时候,
反而会比Python来的更便捷。
3.
上面就是我的解题过程,
你可能还有几个问题想问我,
我一并回答。
1)你可能会觉得,这些操作也太浪费时间了吧?
可是,东西贵不贵,不仅取决于价格,还要看你的收益。
看起来,我这一次解决问题的过程,花费了很多时间,但是我的收获却比别人更巨大。
比如我以前爬虫知乎的时候,
用的是「Web Scraper」这款插件,
但是这次我在探索其他爬虫工具的时候,
我发现「后羿采集器」更好用,这就积累了经验。
成甲老师说“如果我们学习是为了提升自己的认知,形成更准确的决策判断力,那么,花时间在构建更系统的知识体系上,就是非常划算的事情。”
2)你可能会问我,“你是如何找到这些软件,以及Python爬取公众号文章的案例的?”
其实是经验的积累,基于经验的学习,
是对每个人而言最基本、最重要的方式。
你搜索的次数多了,
自然就会知道哪些渠道容易找到好东西。
你每次搜索资料的时候10分钟就搜不下去了,
我却要搜2个小时,你说谁更容易精进搜索技能?
成甲老师在《好好思考》这本书里划分了多元思维模型解决问题的四个层次
这四类不同思维模型的特点各有不同。
第一类,经验技巧型的策略往往源自个人有限的经验总结,
而第二类方法流程型的思维模型往往来自更大样本的归纳提炼,
第三类的学科原理型源于经过科学方法验证的规律,
第四类的哲学视角型是人类理性思辨思考问题的方式。
这四种思考深度没有绝对的高下好坏之分,而是有各自的使用场景。——《好好思考》
经过这次爬虫探索,
我掌握了很多新的技巧和方法,
这都会变成我的个人经验。
但是我把它梳理成一篇文章,
或者绘制成一张流程图这就变成了方法流程,
我可以用这套方法解决更多相似的问题。
对我而言它又属于零边际成本的产品,
所以我可以无限售卖,让它变成我的杠杆。
以上就是本文的全部内容,谢谢你的阅读。