前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者:徐洲更

为了实现该爬虫我们需要用到如下工具

  • Chrome浏览器
  • Python 3 语法知识
  • Python的Requests库

此外,这个爬取程序利用的是微信公众号后台编辑素材界面。原理是,当我们在插入超链接时,微信会调用专门的API(见下图),以获取指定公众号的文章列表。因此,我们还需要有一个公众号。

PS:如有需要Python学习资料的小伙伴可以加下方的群去找免费管理员领取

点击加群即可免费获取Python学习资料

可以免费领取源码项目实战视频PDF文件

正式开始

我们需要登录微信公众号,点击素材管理,点击新建图文消息,然后点击上方的超链接。

接着,按F12,打开Chrome的开发者工具,选择Network

此时在之前的超链接界面中,点击「选择其他公众号」,输入你需要爬取的公众号(例如中国移动)

此时之前的Network就会刷新出一些链接,其中以"appmsg"开头的便是我们需要分析的内容

我们解析请求的URL

https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid=MzI1MjU5MjMzNA==&type=9&query=&token=143406284&lang=zh_CN&f=json&ajax=1

它分为三个部分

  • https://mp.weixin.qq.com/cgi-bin/appmsg: 请求的基础部分
  • ?action=list_ex: 常用于动态网站,实现不同的参数值而生成不同的页面或者返回不同的结果
  • &begin=0&count=5&fakeid: 用于设置?里的参数,即begin=0, count=5

通过不断的浏览下一页,我们发现每次只有begin会发生变动,每次增加5,也就是count的值。

接着,我们通过Python来获取同样的资源,但直接运行如下代码是无法获取资源的

import requests
url = "https://mp.weixin.qq.com/cgi-bin/appmsg?action=list_ex&begin=0&count=5&fakeid=MzI1MjU5MjMzNA==&type=9&query=&token=1957521839&lang=zh_CN&f=json&ajax=1"
requests.get(url).json()
# {'base_resp': {'ret': 200003, 'err_msg': 'invalid session'}}

我们之所以能在浏览器上获取资源,是因为我们登录了微信公众号后端。而Python并没有我们的登录信息,所以请求是无效的。我们需要在requests中设置headers参数,在其中传入Cookie和User-Agent,来模拟登陆

由于每次头信息内容都会变动,因此我将这些内容放入在单独的文件中,即"wechat.yaml",信息如下

cookie:  ua_id=wuzWM9FKE14...
user_agent: Mozilla/5.0...

之后只需要读取即可

# 读取cookie和user_agent
import yaml
with open("wechat.yaml", "r") as file:file_data = file.read()
config = yaml.safe_load(file_data)headers = {"Cookie": config['cookie'],"User-Agent": config['user_agent']
}requests.get(url, headers=headers, verify=False).json()

在返回的JSON中,我们就看到了每个文章的标题(title), 摘要(digest), 链接(link), 推送时间(update_time)和封面地址(cover)等信息。

appmsgid是每一次推送的唯一标识符,aid则是每篇推文的唯一标识符。

实际上,除了Cookie外,URL中的token参数也会用来限制爬虫,因此上述代码很有可能输出会是{'base_resp': {'ret': 200040, 'err_msg': 'invalid csrf token'}}

接着我们写一个循环,获取所有文章的JSON,并进行保存。

import json
import requests
import time
import randomimport yaml
with open("wechat.yaml", "r") as file:file_data = file.read()
config = yaml.safe_load(file_data)headers = {"Cookie": config['cookie'],"User-Agent": config['user_agent']
}# 请求参数
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
begin = "0"
params = {"action": "list_ex","begin": begin,"count": "5","fakeid": config['fakeid'],"type": "9","token": config['token'],"lang": "zh_CN","f": "json","ajax": "1"
}# 存放结果
app_msg_list = []
# 在不知道公众号有多少文章的情况下,使用while语句
# 也方便重新运行时设置页数
i = 0
while True:begin = i * 5params["begin"] = str(begin)# 随机暂停几秒,避免过快的请求导致过快的被查到time.sleep(random.randint(1,10))resp = requests.get(url, headers=headers, params = params, verify=False)# 微信流量控制, 退出if resp.json()['base_resp']['ret'] == 200013:print("frequencey control, stop at {}".format(str(begin)))break# 如果返回的内容中为空则结束if len(resp.json()['app_msg_list']) == 0:print("all ariticle parsed")breakapp_msg_list.append(resp.json())# 翻页i += 1

在上面代码中,我将fakeid和token也存放在了"wechat.yaml"文件中,这是因为fakeid是每个公众号都特有的标识符,而token则会经常性变动,该信息既可以通过解析URL获取,也可以从开发者工具中查看

在爬取一段时间后,就会遇到如下的问题

{'base_resp': {'err_msg': 'freq control', 'ret': 200013}}

此时你在公众号后台尝试插入超链接时就能遇到如下这个提示

这是公众号的流量限制,通常需要等上30-60分钟才能继续。为了完美处理这个问题,你可能需要申请多个公众号,可能需要和微信公众号的登录系统斗智斗勇,或许还需要设置代理池。

但是我并不需要一个工业级别的爬虫,只想爬取自己公众号的信息,因此等个一小时,重新登录公众号,获取cookie和token,然后运行即可。我可不想用自己的兴趣挑战别人的饭碗。

最后将结果以JSON格式保存。

# 保存结果为JSON
json_name = "mp_data_{}.json".format(str(begin))
with open(json_name, "w") as file:file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))

或者提取文章标识符,标题,URL,发布时间这四列信息,保存成CSV。

info_list = []
for msg in app_msg_list:if "app_msg_list" in msg:for item in msg["app_msg_list"]:info = '"{}","{}","{}","{}"'.format(str(item["aid"]), item['title'], item['link'], str(item['create_time']))info_list.append(info)
# save as csv
with open("app_msg_list.csv", "w") as file:file.writelines("\n".join(info_list))

下一篇,将介绍如何根据每个文章的连接地址,来获取每篇文章的阅读量信息。

参考资料

https://blog.csdn.net/kindred_joe/article/details/99289890
https://blog.csdn.net/qq_28804275/article/details/82150874

最终代码如下(代码可能有bug,谨慎使用),使用方法为python wechat_parser.py wechat.yaml

import json
import requests
import time
import random
import os
import yaml
import sysif len(sys.argv) < 2:print("too few arguments")sys.exit(1)yaml_file = sys.argv[1]
if not os.path.exists(yaml_file):print("yaml_file is not exists")sys.exit(1)with open(yaml_file, "r") as file:file_data = file.read()
config = yaml.safe_load(file_data)headers = {"Cookie": config['cookie'],"User-Agent": config['user_agent']
}# 请求参数
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
begin = "0"
params = {"action": "list_ex","begin": begin,"count": "5","fakeid": config['fakeid'],"type": "9","token": config['token'],"lang": "zh_CN","f": "json","ajax": "1"
}# 存放结果
if os.path.exists("mp_data.json"):with open("mp_data.json", "r") as file:app_msg_list = json.load(file)
else:app_msg_list = []
# 在不知道公众号有多少文章的情况下,使用while语句
# 也方便重新运行时设置页数
i = len(app_msg_list)
while True:begin = i * 5params["begin"] = str(begin)# 随机暂停几秒,避免过快的请求导致过快的被查到time.sleep(random.randint(1,10))resp = requests.get(url, headers=headers, params = params, verify=False)# 微信流量控制, 退出if resp.json()['base_resp']['ret'] == 200013:print("frequencey control, stop at {}".format(str(begin)))break# 如果返回的内容中为空则结束if len(resp.json()['app_msg_list']) == 0:print("all ariticle parsed")breakapp_msg_list.append(resp.json())# 翻页i += 1# 保存结果为JSON
json_name = "mp_data.json"
with open(json_name, "w") as file:file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))

Python爬虫实战练习:爬取微信公众号文章相关推荐

  1. Python爬虫案例:爬取微信公众号文章

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 文章转载于公众号:早起Python 作者:陈熹 大家好,今天我们来讲点Selenium自动化,你是 ...

  2. Python爬虫系列之爬取微信公众号新闻数据

    Python爬虫系列之爬取微信公众号新闻数据 小程序爬虫接单.app爬虫接单.网页爬虫接单.接口定制.网站开发.小程序开发 > 点击这里联系我们 < 微信请扫描下方二维码 代码仅供学习交流 ...

  3. Python爬虫实例:爬取微信公众号图片(表情包)

    背景: 在学习了简单爬虫的编写之后,我试图通过编写爬取公众号图片(表情包)来丰富我的聊天技能,亦不致于败给各种熊猫头. 在学习了requests库之后,就能够很轻松地爬取静态页面的信息,把网页对象获取 ...

  4. 使用python的requests库爬取微信公众号文章中的图片

    1.首先导入我们需要的库: import requests from lxml import etree import os 以某篇文章为例,复制该文章连接: 2.使用requests库获取该网址的响 ...

  5. 爬虫python下载文献代码_Python爬虫案例:爬取微信公众号文章

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 文章转载于公众号:早起Python 作者:陈熹 大家好,今天我们来讲点Selenium自动化,你是 ...

  6. 使用代理爬去微信公众号_Python3网络爬虫开发实战之使用代理爬取微信公众号文章...

    本节目标 我们的主要目标是利用代理爬取微信公众号的文章,提取正文.发表日期.公众号等内容,爬取来源是搜狗微信,其链接为 http://weixin.sogou.com/,然后把爬取结果保存到 MySQ ...

  7. python爬虫能爬取微信密码吗_爬虫如何爬取微信公众号文章

    下篇文章:python爬虫如何爬取微信公众号文章(二) 下下篇连接python爬虫如何实现每天爬取微信公众号的推送文章 因为最近在法院实习,需要一些公众号的数据,然后做成网页展示出来便于查看,之前我倒 ...

  8. python爬取微信公众号文章(包含文章内容和图片)

    之前虽然做过网页爬取,但微信爬取一直没做过,因为我一直不知道网页可以进微信公众平台,只用过微信客户端进微信公众号.既然可以通过网页进微信公众平台,那么爬取微信公众号文章就流程上就没太多难度了. 自己在 ...

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

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

  10. Python爬取微信公众号文章、点赞数

    代码还是热乎的,只要你细心一步步的慢慢调试,绝壁没问题 前期准备 订阅号: Python: Fiddler: 微信账号: 流程 使用用微信公众号生成cookie 使用Fiddler抓取微信公众号数据, ...

最新文章

  1. php 2 往数据库添加数据
  2. 数字图像处理- 3.4 空间滤波 and 3.5 平滑空间滤波器
  3. nova-scheduler详解 openstack-ice版
  4. 详解jQuery对象与DOM对象的相互转换
  5. 中物体的显示模式_美学,色彩模式,图像格式
  6. 13、创建触发器(CREATE TRIGGER)
  7. 电脑如何测网速_物联网卡的网速到底怎么样呢
  8. Java扫描仪toString()方法及示例
  9. linux下nand flash驱动工作原理,1.3.4. Nand flash驱动工作原理
  10. multiset实现ALV树
  11. 【python】15行代码下载快手无水印短视频
  12. 命令行解压cab文件
  13. js实现公历(阳历)和农历(阴历)的换算
  14. 哈利波特信息站web网页课设报告(html+css)
  15. 内网渗透之信息收集(更新中)
  16. 好玩的手机淘宝社群,发单初体验
  17. 系统安全 --------- 账号安全管理
  18. Thunder团队第三周 - Scrum会议1
  19. nodejs 设置API代理
  20. 关于清除Reper病毒

热门文章

  1. 央行数字货币研究报告:法定数字币势在必行,或先应用于票据领域
  2. 手工释放cache内存
  3. 新媒体运营教程:活动运营的5个基本要素!
  4. 2018最受欢迎开源免费CMS建站系统排行榜
  5. powerbuilder(pb)连接mongodb数据库:使用ODBC连接
  6. windows上gn编译指引
  7. PHP刷CSDN博客脚本
  8. js es6使用数组的every方法遇到的问题
  9. 腾讯地图,百度地图兴趣点(POI)分类关键词表
  10. 电信运营商的 MBOSS 系统