利用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中的zip函数使用示例
Jan 29 Python
Python制作数据导入导出工具
Jul 31 Python
Python实现针对中文排序的方法
May 09 Python
python利用MethodType绑定方法到类示例代码
Aug 27 Python
Python3实现带附件的定时发送邮件功能
Dec 22 Python
Python中修改字符串的四种方法
Nov 02 Python
解决使用PyCharm时无法启动控制台的问题
Jan 19 Python
python3实现钉钉消息推送的方法示例
Mar 14 Python
Pytorch 实现自定义参数层的例子
Aug 17 Python
Python input函数使用实例解析
Nov 22 Python
pytorch实现保证每次运行使用的随机数都相同
Feb 20 Python
Python greenlet和gevent使用代码示例解析
Apr 01 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
PHP5/ZendEngine2的改进
2006/10/09 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
PHP中的use关键字及文件的加载详解
2016/11/28 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
ThinkPhP+Apache+PHPstorm整合框架流程图解
2020/11/23 PHP
鼠标移动到一张图片时变为另一张图片
2006/12/05 Javascript
使用js获取图片原始尺寸
2014/12/03 Javascript
jQuery实现数字加减效果汇总
2014/12/16 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
再谈Javascript中的异步以及如何异步
2016/08/19 Javascript
jQuery实现侧浮窗与中浮窗切换效果的方法
2016/09/05 Javascript
使用 Vue.js 仿百度搜索框的实例代码
2017/05/09 Javascript
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
利用node.js爬取指定排名网站的JS引用库详解
2017/07/25 Javascript
微信小程序实现form表单本地储存数据
2019/06/27 Javascript
初试vue-cli使用HBuilderx打包app的坑
2019/07/17 Javascript
javascript递归函数定义和用法示例分析
2020/07/22 Javascript
Python学习资料
2007/02/08 Python
Python实现爬虫设置代理IP和伪装成浏览器的方法分享
2018/05/07 Python
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
python实现飞机大战游戏
2020/10/26 Python
Python实现爬取并分析电商评论
2020/06/19 Python
让你相见恨晚的十个Python骚操作
2020/11/18 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
2021/02/24 HTML / CSS
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
基于Html5实现的语音搜索功能
2019/05/13 HTML / CSS
大学生咖啡店创业计划书
2014/01/21 职场文书
五年级学生评语大全
2014/12/26 职场文书
小学英语复习计划
2015/01/19 职场文书
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL
JavaScript小技巧带你提升你的代码技能
2021/09/15 Javascript
聊聊Python String型列表求最值的问题
2022/01/18 Python