Python读取微信朋友圈的四种方法分析与实现
本文总结了利用Python读取微信朋友圈的四种方法。首先排除了通过好友链接查看自身朋友圈及已关闭的网页版微信方案。接着分析了基于Appium模拟器的可行性,重点介绍了通过pywinauto库模拟PC微信窗口操作的具体实现。文章提供了获取进程、定位控件、模拟点击及读取数据的完整代码示例,并探讨了后续数据清洗与自动回复的扩展方向。
背景
由于课题研究需要,需爬取朋友圈内容作为数据支撑,因此对此进行了初步调研。
目前可行的抓取方式主要有四种,下面将逐一分析其可行性与实现细节。
方法一:不适用
该方案要求添加某个微信号为好友,并授权其查看朋友圈权限,随后该账号会生成一个链接供你查看。此方法存在两个主要问题:一是需求不符,我们需要获取的是好友的朋友圈数据,而非自己的;二是该模式常见于公众号引流手段,因此不予采用。
方法二:已不可用
其原理是在PC端操作,通过登录网页版微信并扫码后执行相关指令。
经测试,微信目前已关闭网页版入口,因此该方法失效。以下提供一段相关代码供参考:
import itchat
import os
import math
from PIL import Image
# 获取数据
def download_image():
# 扫描二维码登陆微信,即通过网页版微信登陆
itchat.auto_login()
# 返回一个包含用户信息字典的列表
friends = itchat.get_friends(update=True)
# 在当前位置创建一个用于存储头像的目录wechatImages
base_path = 'wechatImages'
if not os.path.exists(base_path):
os.mkdir(base_path)
# 获取所有好友头像
for friend in friends:
# 获取头像数据
img_data = itchat.get_head_img(userName = friend['UserName'])
#判断备注名是否为空
if friend['RemarkName'] != '':
img_name = friend['RemarkName']
else :
img_name = friend['NickName']
# 在实际操作中如果文件名中含有*标志,会报错。则直接可以将其替换掉
if img_name is "*":
img_name = ""
#通过os.path.join()函数来拼接文件名
img_file = os.path.join(base_path, img_name + '.jpg')
print(img_file)
with open(img_file, 'wb') as file:
file.write(img_data)
# 拼接头像
def join_image():
base_path = 'headImages'
files = os.listdir(base_path) #返回指定的文件或文件夹的名字列表
print(len(files))
each_size = int(math.sqrt(float(6400 * 6400) / len(files)))#计算每个粘贴图片的边长
lines = int(6400 / each_size)#计算总共有多少行
print(lines)
image = Image.new('RGB', (6400, 6400))# new(mode, size, color=0) 定义一张大小为640*640大小的图片,不给出第三个参数默认为黑色
x = 0 #定义横坐标
y = 0 #定义纵坐标
for file_name in files:
img = Image.open(os.path.join(base_path, file_name)) #找到/打开图片
img = img.resize((each_size, each_size), Image.ANTIALIAS)#实现图片同比例缩放,Image.ANTIALIAS添加滤镜效果
image.paste(img, (x * each_size, y * each_size))#将缩放后的照片放到对应的坐标下
x += 1
if x == lines:#如果每行的粘贴内容够了,则换行
x = 0
y += 1
image.save('jointPic.jpg')#最后将全部的照片保存下来
if __name__ == '__main__':
download_image()
join_image()
若你的微信仍支持网页版,可尝试上述代码。该代码仅用于读取好友联系人并拼接成一张大图,朋友圈抓取部分未做实测,读者可自行搜索相关资源。
方法三:Appium
此方法未经过实际测试,但理论上可行。其思路是在PC上安装手机模拟器,安装微信客户端,并利用Appium工具模拟用户操作以读取朋友圈数据。然而,Appium是一套完整的软件框架,安装依赖Java环境等配置,过程繁琐,故未深入尝试。网上有相关示例可供参考。
方法四:模拟操作
该方法逻辑简单,但非完整案例,后续需自行完善,此处先做记录。
核心思路是利用PC版微信,读取窗口信息并模拟人工操作。具体包括打开朋友圈窗口,读取显示朋友圈内容的控件,从而获取数据。
首先需在电脑上打开并登录微信,若未运行则无法获取微信进程号。
import psutil# 用于获取微信电脑版的进程信息;
import pywinauto# 用于自动化控制微信电脑版
from pywinauto.application import Application
若未安装相关库,可通过pip install快速安装。
随后在main函数中编写核心代码。
PID = 0#用来保存微信的进程号
for proc in psutil.process_iter():#循环电脑上的进程,获取进程号和名称
try:
pinfo = proc.as_dict(attrs=['pid', 'name'])
except psutil.NoSuchProcess:#没有运行微信程序
pass
else:
if 'WeChat.exe' == pinfo['name']:#当进程名为WeChat.exe的时候,把进程号记下来
PID = pinfo['pid']
#进程ID用来提供给 PyWinAuto.application 以连接微信电脑版,connect是要已经运行微信才行
app = Application(backend='uia').connect(process=PID)
#获得微信窗口实例
Win_wechat = app['微信']
接下来是关键步骤。由于微信新版窗口布局有所调整,若不能灵活变通则会导致失败。首先调用以下语句,以树形结构打印窗口上所有控件:
Win_wechat.print_control_identifiers()#以树形方式打印窗口上所有控件
观察输出结果,找到【title=“朋友圈”, control_type=“Button”】所在的父控件。在当前版本中,该按钮位于【Pane6】下,因此使用以下代码获取朋友圈按钮:

#获取微信窗口上朋友圈按钮实例
Button_pyq = Win_wechat['Pane6'].child_window(title="朋友圈", control_type="Button")
随后执行打开朋友圈窗口的操作。
#获取按钮坐标
cords = Button_pyq.rectangle()
# 接着控制微信电脑版,模拟鼠标点击,把朋友圈窗口打开
pywinauto.mouse.click(button='left', coords=(cords.left + 10, cords.top + 10))
运行至此,朋友圈窗口已打开。接下来获取该窗口实例,并将当前窗口内容以树形结构显示出来。
Win_pyq = app['朋友圈']#获取朋友圈窗口实例
Win_pyq.draw_outline(colour = 'red',thickness = 2)# 在当前定位到的窗口围画出一条边界线,方便我们看出定位到了哪个控件
Win_pyq.dump_tree()
完整代码
import psutil# 用于获取微信电脑版的进程信息;
import pywinauto# 用于自动化控制微信电脑版
from pywinauto.application import Application
if __name__ == '__main__':
PID = 0#用来保存微信的进程号
for proc in psutil.process_iter():#循环电脑上的进程,获取进程号和名称
try:
pinfo = proc.as_dict(attrs=['pid', 'name'])
except psutil.NoSuchProcess:#没有运行微信程序
pass
else:
if 'WeChat.exe' == pinfo['name']:#当进程名为WeChat.exe的时候,把进程号记下来
PID = pinfo['pid']
#进程ID用来提供给 PyWinAuto.application 以连接微信电脑版,connect是要已经运行微信才行
app = Application(backend='uia').connect(process=PID)
#获得微信窗口实例
Win_wechat = app['微信']
#win.print_control_identifiers()#以树形方式打印窗口上所有控件
#获取微信窗口上朋友圈按钮实例
Button_pyq = Win_wechat['Pane6'].child_window(title="朋友圈", control_type="Button")
#获取按钮坐标
cords = Button_pyq.rectangle()
# 接着控制微信电脑版,把朋友圈窗口打开
pywinauto.mouse.click(button='left', coords=(cords.left + 10, cords.top + 10))
Win_pyq = app['朋友圈']#获取朋友圈窗口实例
Win_pyq.draw_outline(colour = 'red',thickness = 2)# 在当前定位到的窗口围画出一条边界线,方便我们看出定位到了哪个控件
Win_pyq.dump_tree()#树形打印
后续工作及扩展
1. 目前代码仅打印当前窗口内容,后续需实现窗口滑动以读取更多内容,并对杂乱的数据进行清洗处理:

2. 可借鉴模拟鼠标点击的操作,自动操控微信进行消息发送和回复,实现自动聊天机器人功能。
总结
本文介绍了利用Python读取微信朋友圈的相关方法。更多关于Python读取微信朋友圈的内容,请搜索本站往期文章或继续浏览后续相关文章,希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









