基于Pywinauto实现简陋微信朋友圈爬虫

Python读取微信朋友圈_微信强制访问朋友圈代码-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/oldmao_2001/article/details/119787392参考这位博主的工作,我进一步更新了代码。

开发环境:Windows10+Anaconda1.6.3(conda 4.3.30)+Jupyter Notebook5.0.0+Python3.6.2

本工具实现功能:

自动读取历史微信朋友圈的发布者、点赞者列表、评论列表

本工具工作流程:

1.读取电脑版微信进程号,连接此进程

    #初始化默认进程
    PID = 0
    #我们把进程ID来提供给PyWinAuto ,以便于链接微信电脑版
    for proc in psutil.process_iter():
        try:
            pinfo = proc.as_dict(attrs=['pid','name'])
        except psutil.NoSuchProcess:
            pass
        else:
            if 'Wechat.exe' == pinfo['name'] or 'WeChat.exe' == pinfo['name']:
                PID = pinfo['pid']
              
    #PyWinAuto实例化并启动应用
    app = Application(backend='uia').connect(process= PID)
    windows = app.windows()

2.打开微信电脑版并打开朋友圈(可选)

    #控制微信电脑版,把朋友圈打开
    #win = app['微信']
    #win.print_control_identifiers()#以树形方式打印窗口上所有控件

    #pyq_but = win.child_window(title = '朋友圈',control_type = "Button")
    #pyq_but.draw_outline()
    #cords = pyq_but.rectangle()
    
    #点击朋友圈按钮
    #pywinauto.mouse.click(button = 'left',coords = (cords.left + 10,cords.top + 10))

2.读取朋友圈窗口内容

    pyq_win = app['朋友圈']
    pyq_win.draw_outline()
    
    pyq_win.set_focus()

3.统计窗口内控件数

    pyq_2=pyq_win.child_window(title="朋友圈", control_type="List")#pyq_2类型为        pywinauto.application.WindowSpecification,控件类型为ListBox
    #每条朋友圈信息就是一个pyq_2的一个子控件
    pyq_list=pyq_2.children(control_type="ListItem")
    count=len(pyq_list)#count记录当前页面朋友圈条数

4.循环读取每一个控件的内容

    pyq_item=pyq_2.child_window(control_type="ListItem",found_index=k)
    publisher=pyq_item.window_text()
    newline_index = publisher.find("\n")

5.拆分出控件内显示的发布者与点赞评论列表信息

if newline_index != -1:
    publisher = publisher[:newline_index-1]#截取冒号之前
    file.write("\n发布者:\n")
    file.write(publisher+"\n")
    pyq_comment_list=pyq_item.child_window(control_type="Text")
    des=pyq_item.descendants(control_type="Text")
    file.write("点赞评论列表:\n")
    for element in des:
        text=element.window_text()
        if text!="昨天" and text!="刚刚" and not text.endswith("前"):
            file.write(text+"\n")

6.翻页

for j in range(5):
    #朋友圈窗口,scroll方法无效
    pywinauto.keyboard.send_keys('{DOWN}')  # 向下滑动一次
    time.sleep(0.01)

注意:

1. 具体滑动次数根据设备性能和设备设置不同而不同,建议使用者根据自己的需求进行修改

2.本工具无法保证抓取结果不重复不遗漏,未来开发者可进一步开发去重功能

3.本工具无法读取微信朋友圈图片内容

完整代码如下:

# -*- coding:utf-8 -*-
import psutil
import pywinauto
import time
from IPython.display import clear_output as clear
from pywinauto.application import Application

'''
psutil 用于获取微信电脑版的进程信息
pywinauto 用于自动化控制微信电脑版
'''
def getWechat():
    #初始化默认进程
    PID = 0
    #我们把进程ID来提供给PyWinAuto ,以便于链接微信电脑版
    for proc in psutil.process_iter():
        try:
            pinfo = proc.as_dict(attrs=['pid','name'])
        except psutil.NoSuchProcess:
            pass
        else:
            if 'Wechat.exe' == pinfo['name'] or 'WeChat.exe' == pinfo['name']:
                PID = pinfo['pid']
              
    #PyWinAuto实例化并启动应用
    app = Application(backend='uia').connect(process= PID)
    windows = app.windows()
        
    #控制微信电脑版,把朋友圈打开
    #win = app['微信']
    #win.print_control_identifiers()#以树形方式打印窗口上所有控件

    #pyq_but = win.child_window(title = '朋友圈',control_type = "Button")
    #pyq_but.draw_outline()
    #cords = pyq_but.rectangle()
    
    #点击朋友圈按钮
    #pywinauto.mouse.click(button = 'left',coords = (cords.left + 10,cords.top + 10))
    pyq_win = app['朋友圈']
    pyq_win.draw_outline()
    
    pyq_win.set_focus()  # 将焦点设置到朋友圈窗口
    open("output.txt", "w", encoding="utf-8")
    times=50# 向下滑动次数
    with open("output.txt", "w", encoding="utf-8") as file:
        for i in range(times):  
            pyq_2=pyq_win.child_window(title="朋友圈", control_type="List")#pyq_2类型为pywinauto.application.WindowSpecification,控件类型为ListBox
            #每条朋友圈信息就是一个pyq_2的一个子控件
            pyq_list=pyq_2.children(control_type="ListItem")
            count=len(pyq_list)#count记录当前页面朋友圈条数
            for k in range(count-1):
                try:
                    pyq_item=pyq_2.child_window(control_type="ListItem",found_index=k)
                    publisher=pyq_item.window_text()
                    newline_index = publisher.find("\n")
                    # 如果找到换行符,获取从开头到换行符的内容
                    if newline_index != -1:
                        publisher = publisher[:newline_index-1]#截取冒号之前
                    file.write("\n发布者:\n")
                    file.write(publisher+"\n")
                    pyq_comment_list=pyq_item.child_window(control_type="Text")
                    des=pyq_item.descendants(control_type="Text")
                    file.write("点赞评论列表:\n")
                    for element in des:
                        text=element.window_text()
                        if text!="昨天" and text!="刚刚" and not text.endswith("前"):
                            file.write(text+"\n")
                except:
                    print("读取错误")
                    break

            for j in range(5):
                #朋友圈窗口,scroll方法无效
                pywinauto.keyboard.send_keys('{DOWN}')  # 向下滑动一次
                time.sleep(0.01)  # 等待滑动完成
    
    #先扫描当前页面
    #一层循环 读取当前页面朋友圈条数,读取每一条朋友圈
    #二层循环 本条朋友圈内 读取Text子窗口总数,读取点赞列表和每一条评论 提取信息输出
    #向下滑动
    print("输出结束")
    
if __name__ == '__main__':
    getWechat()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值