利用Python读取微信朋友圈的多种方法总结


Posted in Python onAugust 23, 2021

背景

由于课题需要爬取朋友圈的内容作为研究数据,稍微研究了一下。

目前爬取有四种方法,我们一一来分析一下。

法1,不适用

加某个微信号为好友,给这个微信号查看自己朋友圈的权限,然后那个微信号会把你自己朋友圈生成一个链接给你。一来这个和我需求不同,我是要爬取我好友的朋友圈,不是我自己的朋友圈,二来这个套路明显是公众号吸粉的套路,这个方法舍弃。。。

法2,已不能用

原理是在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()

如果你微信还能玩网页版可以试试,上面代码只是把你朋友联系人读取出来,拼成一个大的图片。操作朋友圈代码我没试,自己百度可以找到。

法3:Appnium

没试,但是理论上可以的,是在PC上装手机的模拟器,然后装微信,然后用工具Appnium模拟操作,读取朋友圈数据。但是Appnium不是一个库,是一套软件,安装需要java环境等,还有配置,非常麻烦,因此没有上手试,可以百度,有例子。

法4:模拟操作

这个简单,但是不是完整例子,后续还要自己写,先记录一下吧。

思路很简单,就是利用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】下面,因此用下面代码获取朋友圈按钮

利用Python读取微信朋友圈的多种方法总结

#获取微信窗口上朋友圈按钮实例
    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.可以看到,目前只打印当前窗口的内容,后续要将窗口滑动,然后再次读取,另外还需要对数据进行处理,因为数据比较乱:

利用Python读取微信朋友圈的多种方法总结

2.可以借鉴模拟鼠标点击的操作,自动操作微信进行消息的发送和回复,自动聊天机器人可以了解一下。

总结

到此这篇关于利用Python读取微信朋友圈的文章就介绍到这了,更多相关Python读取微信朋友圈内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python 文件与目录操作
Dec 24 Python
简单谈谈Python中函数的可变参数
Sep 02 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
python使用pycharm环境调用opencv库
Feb 11 Python
基于数据归一化以及Python实现方式
Jul 11 Python
python实现公司年会抽奖程序
Jan 22 Python
Django框架之登录后自定义跳转页面的实现方法
Jul 18 Python
Python如何实现强制数据类型转换
Nov 22 Python
python 用 xlwings 库 生成图表的操作方法
Dec 22 Python
pandas to_excel 添加颜色操作
Jul 14 Python
Python headers请求头如何实现快速添加
Nov 03 Python
浅谈Python列表嵌套字典转化的问题
Apr 07 Python
教你使用一行Python代码玩遍童年的小游戏
一文搞懂Python Sklearn库使用
python库sklearn常用操作
Aug 23 #Python
Python使用psutil库对系统数据进行采集监控的方法
Aug 23 #Python
Python 中的Sympy详细使用
Aug 07 #Python
Anaconda配置各版本Pytorch的实现
Aug 07 #Python
python开发的自动化运维工具ansible详解
You might like
php根据分类合并数组的方法实例详解
2013/11/06 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
PHP中$_SERVER使用说明
2015/07/05 PHP
php的socket编程详解
2016/11/20 PHP
详解php与ethereum客户端交互
2018/04/28 PHP
php输出形式实例整理
2020/05/05 PHP
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
javascript 实用的文字链提示框效果
2010/06/30 Javascript
jQuery事件 delegate()使用方法介绍
2012/10/30 Javascript
js 延迟加载 改变JS的位置加快网页加载速度
2012/12/11 Javascript
基于MVC3方式实现下拉列表联动(JQuery)
2013/09/02 Javascript
javascript遍历控件实例详细解析
2014/01/10 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
JS实现动态生成表格并提交表格数据向后端
2020/11/25 Javascript
JS两种类型的表单提交方法实例分析
2016/11/28 Javascript
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
2019/06/24 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
[06:44]2018DOTA2亚洲邀请赛4.5 SOLO赛 MidOne vs Sumail
2018/04/06 DOTA
Python异常学习笔记
2015/02/03 Python
Python进行数据提取的方法总结
2016/08/22 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
python+POP3实现批量下载邮件附件
2018/06/19 Python
pycharm 配置远程解释器的方法
2018/10/28 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
Python爬虫实战之12306抢票开源
2019/01/24 Python
Python File(文件) 方法整理
2019/02/18 Python
python实现的汉诺塔算法示例
2019/10/23 Python
Tensorflow Summary用法学习笔记
2020/01/10 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
结合CSS3的新特性来总结垂直居中的实现方法
2016/05/30 HTML / CSS
HTML5微信播放全屏问题的解决方法
2017/03/09 HTML / CSS
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
梅西百货官网:Macy’s
2020/08/04 全球购物
初中生入团申请书范文(五篇)
2019/10/16 职场文书
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android