利用Python读取微信朋友圈的多种方法总结
作者:oldmao_2000 发布时间:2023-02-12 20:47:20
目录
背景
法1,不适用
法2,已不能用
法3:Appnium
法4:模拟操作
整体代码
后续工作及扩展
总结
背景
由于课题需要爬取朋友圈的内容作为研究数据,稍微研究了一下。
目前爬取有四种方法,我们一一来分析一下。
法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】下面,因此用下面代码获取朋友圈按钮
#获取微信窗口上朋友圈按钮实例
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.可以借鉴模拟鼠标点击的操作,自动操作微信进行消息的发送和回复,自动聊天机器人可以了解一下。
来源:https://blog.csdn.net/oldmao_2001/article/details/119787392
猜你喜欢
- js运行效果,含公历农历,生肖及节日的javascript日历代码:<html><head><meta htt
- 1、直接贴代码#!C:/Python27#coding=utf-8from selenium import webdriverfrom se
- 方法1:import sysprint(sys.argv)得到文件当前绝对路径字符串的一个列表['D:/pycharm/Practi
- 文 | 闲欢来源:Python 技术「ID: pythonall」今天在浏览知乎时,发现一个有趣的问题:如何优化 Python 爬
- 前言随着人工智能的不断发展,各种智能算法越来越普遍,本文就给大家介绍一种通过训练好的算法进行文字识别的方法,而且是Web页面可视化操作,方便
- 本文通过Python3+PyQt5实现自定义部件–Counters自定 窗口部件。这个窗口是3*3的网格。本文有两个例子如下: /home/
- 本文实例讲述了Python实现统计python文件中代码,注释及空白对应的行数。分享给大家供大家参考,具体如下:其实代码和空白行很好统计,难
- 大致功能:$() 取得所有元素$("div") 取得所有DIV$("#a1") 取得ID为a1的元素
- 简介在Python开发和测试过程中主要有两种模式可以选择:脚本模式、命令行模式。在代码的开发和调试过程中使用脚本模式很方便,目前比较主流的命
- 当我发现要写python的面向对象的时候,我是踌躇满面,坐立不安呀。我一直在想:这个坑应该怎么爬?因为python中关于面向对象的内容很多,
- 变量名1、组成:数字、字母、下划线2、变量名要有意义3、多个单词则用下划线,如user_id4、python的变量名不要驼峰显示字符串:1、
- 判断字符串长度函数:<SCRIPT LANGUAGE="JavaScript"><!--fu
- 最近在网上经常看到朋友们聊到UEO,我就想哈UEO是啥东西啊,我去找啦些资料看,他们都说将来UEO发展一定会比较好,我也说这是肯定的.我为什
- 本文实例讲述了Python装饰器基础概念与用法。分享给大家供大家参考,具体如下:装饰器基础前面快速介绍了装饰器的语法,在这里,我们将深入装饰
- 啊,inline-block,挺难琢磨并且迷人的声明上承诺了很多,其实提供了很少。很多次我拿到类似这样的 PSD 文件:就哭了。一般说来,这
- 我在初学时查阅过大量相关资料,发现其中提供的很多方法实际操作起来并不是那么回事。对于简单的应用,这些资料也许是有帮助的,但仅限于此,因为它们
- 一、先进行剪切操作圆形区域占图片可能不多,多余的部分不要。看下图。只要纽扣电池内部和少许的边缘部分,其余黑色背景部分不需要。先沿着纽扣电池的
- 1、需要准备工具xftp:上传项目文件本地下载地址:https://www.jb51.net/softs/81853.htmlxshell:
- 最近因需要用python写一个微服务来用MQTT给硬件传输图片,其中python用的是flask框架,大概流程如下:协议为:需要将图片数据封
- 本文实例讲述了Python函数基础用法。分享给大家供大家参考,具体如下:一、什么是命名关键字参数?格式: 在*后面参数都是命名关键字参数。特