Python 爬取微信公众号文章和评论 (有源码)

image

关注我,一个仍存梦想的屌丝程序员,每天为你分享高质量编程博客。

follow us for dream

关注我回复 “微信爬虫” 获取源代码

背景说明

感觉微信公众号算得是比较难爬的平台之一,不过一番折腾之后还是小有收获的。没有用Scrapy(估计爬太快也有反爬限制),但后面会开始整理写一些实战出来。简单介绍下本次的开发环境:

  • python3

  • requests

  • psycopg2 (操作postgres数据库)

抓包分析

前一篇文章介绍过抓包前要做的准备,这里不再做相关说明。本次实战对抓取的公众号没有限制,但不同公众号每次抓取之前都要进行分析。打开Fiddler,将手机配置好相关代理,为避免干扰过多,这里给Fiddler加个过滤规则,只需要指定微信域名mp.weixin.qq.com就好:

image

Fiddler配置Filter规则

平时关注的公众号也比较多,本次实战以“36氪”公众号为例,继续往下看:

image

“36氪”公众号

image

公众号右上角 -> 全部消息

在公众号主页,右上角有三个实心圆点,点击进入消息界面,下滑找到并点击“全部消息”,往下请求加载几次历史文章,然后回到Fiddler界面,不出意外的话应该可以看到这几次请求,可以看到返回的数据是json格式的,同时文章数据是以json字符串的形式定义在general_msg_list字段中:

image

公众号文章列表抓包请求

分析文章列表接口

把请求URL和Cookie贴上来进行分析:

Cookie: pgv_pvid=2027337976; 

下面把重要的参数说明一下,没提到的说明就不那么重要了:

  • __biz:相当于是当前公众号的id(唯一固定标志)

  • offset:文章数据接口请求偏移量标志(从0开始),每次返回的json数据中会有下一次请求的offset,注意这里并不是按某些规则递增的

  • count:每次请求的数据量(亲测最多可以是10)

  • pass_ticket:可以理解是请求票据,而且隔一段时间后(大概几个小时)就会过期,这也是为什么微信公众号比较难按固定规则进行抓取的原因

  • appmsg_token:同样理解为非固定有过期策略的票据

  • Cookie:使用的时候可以把整段贴上去,但最少仅需要wap_sid2这部分

是不是感觉有点麻烦,毕竟不是要搞大规模专业的爬虫,所以单就一个公众号这么分析下来,还是可以往下继续的,贴上截取的一段json数据,用于设计文章数据表:

{    "ret": 0,    "errmsg": "ok",    "msg_count": 10,    "can_msg_continue": 1,    "general_msg_list": "{\"list\":[{\"comm_msg_info\":{\"id\":1000005700,\"type\":49,\"datetime\":1535100943,\"fakeid\":\"3264997043\",\"status\":2,\"content\":\"\"},\"app_msg_ext_info\":{\"title\":\"金融危机又十年:钱荒之下,二手基金迎来高光时刻\",\"digest\":\"退出永远是基金的主旋律。\",\"content\":\"\",\"fileid\":100034824,\"content_url\":\"http:\\/\\/mp.weixin.qq.com\\/s?__biz=MzI2NDk5NzA0Mw==&mid=2247518479&idx=1&sn=124ab52f7478c1069a6b4592cdf3c5f5&chksm=eaa6d8d3ddd151c5bb95a7ae118de6d080023246aa0a419e1d53bfe48a8d9a77e52b752d9b80&scene=27#wechat_redirect\",\"source_url\":\"\",\"cover\":\"http:\\/\\/mmbiz.qpic.cn\\/mmbiz_jpg\\/QicyPhNHD5vYgdpprkibtnWCAN7l4ZaqibKvopNyCWWLQAwX7QpzWicnQSVfcBZmPrR5YuHS45JIUzVjb0dZTiaLPyA\\/0?wx_fmt=jpeg\",\"subtype\":9,\"is_multi\":0,\"multi_app_msg_item_list\":[],\"author\":\"石亚琼\",\"copyright_stat\":11,\"duration\":0,\"del_flag\":1,\"item_show_type\":0,\"audio_fileid\":0,\"play_url\":\"\",\"malicious_title_reason_id\":0,\"malicious_content_type\":0}}]}",    "next_offset": 20,    "video_count": 1,    "use_video_tab": 1,    "real_type": 0}

可以简单抽取想要的数据,这里将文章表结构定义如下,顺便贴上建表的SQL语句:

image

-- ------------------------------ Table structure for tb_article-- ----------------------------DROP TABLE IF EXISTS "public"."tb_article";CREATE TABLE "public"."tb_article" (  "id" serial4 PRIMARY KEY,  "msg_id" int8 NOT NULL,  "title" varchar(200) COLLATE "pg_catalog"."default" NOT NULL,  "author" varchar(20) COLLATE "pg_catalog"."default",  "cover" varchar(500) COLLATE "pg_catalog"."default",  "digest" varchar(200) COLLATE "pg_catalog"."default",  "source_url" varchar(800) COLLATE "pg_catalog"."default",  "content_url" varchar(600) COLLATE "pg_catalog"."default" NOT NULL,  "post_time" timestamp(6),  "create_time" timestamp(6) NOT NULL);COMMENT ON COLUMN "public"."tb_article"."id" IS '自增主键';COMMENT ON COLUMN "public"."tb_article"."msg_id" IS '消息id (唯一)';COMMENT ON COLUMN "public"."tb_article"."title" IS '标题';COMMENT ON COLUMN "public"."tb_
  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值