背景
由于课题需要爬取朋友圈的内容作为研究数据,稍微研究了一下。
目前爬取有四种方法,我们一一来分析一下。
法1,不适用
加某个微信号为好友,给这个微信号查看自己朋友圈的权限,然后那个微信号会把你自己朋友圈生成一个链接给你。一来这个和我需求不同,我是要爬取我好友的朋友圈,不是我自己的朋友圈,二来这个套路明显是公众号吸粉的套路,这个方法舍弃。。。
法2,已不能用
原理是在pc上操作,然后打开网页版的微信,扫码后进行操作。
但是试了一下,现在微信已经关闭网页版了,因此该方法也不能用,一小段代码放上来:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
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上的微信,然后读取窗口信息,模拟手工操作,打开朋友圈窗口,然后读取显示朋友圈内容的控件,就可以看到内容。
先在电脑上打开并登录微信,没有运行就没法找到微信进程号。
1
2
3
|
import psutil # 用于获取微信电脑版的进程信息;
import pywinauto # 用于自动化控制微信电脑版
from pywinauto.application import application
|
没装用pip install安装一下,很快。
然后在main函数里面写代码
1
2
3
4
5
6
7
8
9
10
|
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' ]
|
1
2
3
4
|
#进程id用来提供给 pywinauto.application 以连接微信电脑版,connect是要已经运行微信才行
app = application(backend = 'uia' ).connect(process = pid)
#获得微信窗口实例
win_wechat = app[ '微信' ]
|
接下来是关键一步,由于微信新版窗口的布局有更改,因此下一步是关键,如果不会变通,就会失败,先调用下面语句,以树形方式打印窗口上所有控件
1
|
win_wechat.print_control_identifiers() #以树形方式打印窗口上所有控件
|
然后观察,【title=“朋友圈”, control_type=“button”】这句话在哪个控件下面,目前这个版本是在【pane6】下面,因此用下面代码获取朋友圈按钮
1
2
|
#获取微信窗口上朋友圈按钮实例
button_pyq = win_wechat[ 'pane6' ].child_window(title = "朋友圈" , control_type = "button" )
|
然后打开朋友圈窗口
1
2
3
4
|
#获取按钮坐标
cords = button_pyq.rectangle()
# 接着控制微信电脑版,模拟鼠标点击,把朋友圈窗口打开
pywinauto.mouse.click(button = 'left' , coords = (cords.left + 10 , cords.top + 10 ))
|
运行到这里,朋友圈窗口就打开了,接下来获取朋友圈窗口实例,然后把当前窗口内容以树形显示出来
1
2
3
4
|
win_pyq = app[ '朋友圈' ] #获取朋友圈窗口实例
win_pyq.draw_outline(colour = 'red' ,thickness = 2 ) # 在当前定位到的窗口围画出一条边界线,方便我们看出定位到了哪个控件
win_pyq.dump_tree()
|
整体代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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读取微信朋友圈内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/oldmao_2001/article/details/119787392