未进行可,严禁转载
背景
由于课题需要爬取朋友圈的内容作为研究数据,稍微研究了一下。 目前爬取有四种方法,我们一一来分析一下。
法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)
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 = ""
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))
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.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']:
PID = pinfo['pid']
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']:
PID = pinfo['pid']
app = Application(backend='uia').connect(process=PID)
Win_wechat = app['微信']
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.可以借鉴模拟鼠标点击的操作,自动操作微信进行消息的发送和回复,自动聊天机器人可以了解一下。
|