我在《昆明单车骑行群体分析报告(2019版)》中曾用python的itchat模块抓取了我加入的昆明单车群信息,并做了简要分析。

在持续十来天抓取群数据的时候,我发现一个奇怪现象,就是有一个群神出鬼没,有时候能抓到它的信息,有时候不能。

伸出规模的乐途群

从图中可以看到,监测的12天中,乐途群的信息出现了5次,有七天没抓到它的数据。

在我的另一个小号中,我写了一个帖子,对这个“神奇”的现象用我惯有的笔法夸张了一番《骑行之苦,苦在恨水;骑行之乐,乐在乐途》。

我检查了各个群的设置,都是一模一样;我检查了是否itchat有抓取的群数量限制,答案是否定的;我甚至检查了是不是群主为了好玩不定时把我踢出群又把我拉回去。

很明显都是不是以上原因。原因一定出在代码上。

今早我再次检查了代码,终于找到原因所在。

先贴上原来的代码【代码是我在网上抄的,做了简单的调整以适合我的需要】:

#!/usr/bin/env python

# coding: utf-8

import itchat

from itchat.content import TEXT

from itchat.content import *

import sys

import os

import socket

import time

import pandas as pd

import re

import datetime

itchat.auto_login(hotReload=True)

friends = itchat.get_friends(update=True)[0:]

if socket.gethostname()=='xxxx':

root=r'C:\Users\xxxx'

else:

root=r'E:\OneDrive - xxx'

roomslist = []

def getroom_message(n):

#获取群的 username,对群成员进行分析需要用到

itchat.dump_login_status() # 显示所有的群聊信息,默认是返回保存到通讯录中的群聊

RoomList = itchat.search_chatrooms(name=n)

if RoomList is None:

pass

#print("{0} group is not found!".format(name))

else:

# print('取得:',RoomList[0]['UserName'])

return RoomList[0]['UserName']

def getchatrooms():

#获取群聊列表

roomslist = itchat.get_chatrooms()

#print('列表',roomslist)

return roomslist

for i in getchatrooms():

roomslist.append(i['NickName'])

data=[]

for n in roomslist:

ChatRoom = itchat.update_chatroom(getroom_message(n), detailedMember=True)

for i in ChatRoom['MemberList']:

data.append({'群名称':ChatRoom['NickName'],

'省份':i['Province'],

'用户名':i['NickName'],

'ID':i['UserName'],

'性别':i['Sex']})

df=pd.DataFrame(data)

df.to_csv((root+'\jupyter\群数据{}-{}-{}.csv').format(time.localtime().tm_year,time.localtime().tm_mon,time.localtime().tm_mday))

问题处在什么地方?

并不是itchat有bug,而是第一个函数getroom_message(n)出了问题。

RoomList = itchat.search_chatrooms(name=n)

这一行中,原作者用了【name】作为参数传递给函数,我看网上其他资源都是用的这个函数以及这个参数。并且返回的是【RoomList】中第一个元素。

但是检查search_chatrooms()函数源代码可以发现【name】接收的是群聊的名称【NickName】,而【userName】接收的是群聊的id,并且【name】参数会把相似的群聊名称收集到【matchlist】中:

ef search_chatrooms(self, name=None, userName=None):

with self.updateLock:

if userName is not None:

for m in self.chatroomList:

if m['UserName'] == userName:

return copy.deepcopy(m)

elif name is not None:

matchList = []

for m in self.chatroomList:

if name in m['NickName']:

matchList.append(copy.deepcopy(m))

return matchList

所以在我这个例子中,【NickName】包含“云南乐途户外骑行联盟”的有三个群聊,那么getroom_message(n)函数返回的RoomList就有3个群聊名称。由于在python中,list是可变的,其元素位置不固定,所以,当取RoomList的第一个元素时,返回的结果就可能是三个群聊名称中的任意一个而不一定是“云南乐途户外骑行联盟”。

所以我们需要在getroom_message(n)返回的RoomList中再一次判断,每一个元素的【NickName】键对应的值是不是等于参数【n】。

但我又发现,去改这个函数是没有意义的,整个这个getroom_message(n)函数都是多余的。

我们只需要想办法获取到群聊的【userName】,将其放入到一个list中,然后循环获取其相关信息即可,于是有了最终的代码。

最终代码

如下所示:

#!/usr/bin/env python

# coding: utf-8

import itchat

from itchat.content import TEXT

from itchat.content import *

import sys

import os

import socket

import time

import pandas as pd

import re

import datetime

itchat.auto_login(hotReload=True)

friends = itchat.get_friends(update=True)[0:]

if socket.gethostname()=='xxxx':

root=r'C:\Users\xxxx'

else:

root=r'E:\OneDrive - xxx'

roomslist = []

def getchatrooms():

#获取群聊列表

res = itchat.get_chatrooms()

for each in res:

roomslist.append(each['UserName'])

return roomslist

data=[]

for group_id in getchatrooms():

ChatRoom = itchat.update_chatroom(group_id, detailedMember=True)

for i in ChatRoom['MemberList']:

data.append({'群名称':ChatRoom['NickName'],

'省份':i['Province'],

'用户名':i['NickName'],

'ID':i['UserName'],

'性别':i['Sex']})

df=pd.DataFrame(data)

df.to_csv((root+'\jupyter\群数据{}-{}-{}.csv').format(time.localtime().tm_year,time.localtime().tm_mon,time.localtime().tm_mday))

与换来的代码相比,就仅仅是去掉了getroom_message(n)函数,稍微修改了一下getchatrooms()函数,把itchat.update_chatroom()函数的参数直接修改为roomslist中获取的群聊【userName】。

如此一来,名称相似的群聊再也不会神出鬼没地时而出现时而不出现了。

python itchat库_用python【itchat】库获取群聊信息的正确姿势相关推荐

  1. chatgpt赋能python:Python微信获取群聊信息:顶级互联的新标准

    Python 微信获取群聊信息:顶级互联的新标准 Python 作为一种开源编程语言,已成为解决各种工程问题的首选方式之一.Python 是一种直观,并且简单易懂的编程语言,同时也非常强大,能够完成各 ...

  2. 使用python获取群聊信息并分析群聊成员

    在之前用python的itchat玩了一波微信好友以后,最近突然想继续玩一下微信群聊.说做就做,就以公司的微信群来一波操作吧. 代码主要实现的功能主要是,获取微信群聊,获取群聊中的用户信息,以及根据这 ...

  3. python微信群聊机器人_Python + itchat 实现微信机器人聊天(支持自动回复指定群聊)...

    Python + itchat 实现微信机器人聊天(支持自动回复指定群聊) 发布时间:2018-10-25 22:38, 浏览次数:600 , 标签: Python itchat <>Py ...

  4. Python + itchat 实现微信机器人聊天(支持自动回复指定群聊)

    Python + itchat 实现微信机器人聊天(支持自动回复指定群聊) 最近对Python上瘾,闲来无事搞个Python+itchat玩下微信机器人自动回复. 首先要打开cmd输入以下代码,安装r ...

  5. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  6. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  7. 微信python天天学_用python玩微信

    Python玩转微信 大家每天都在用微信,有没有想过用python来控制我们的微信,不多说,直接上干货! 这个是在 itchat上做的封装 http://itchat.readthedocs.io/z ...

  8. 小猪的Python学习之旅 —— 19.Python微信自动好友验证,自动回复,发送群聊链接

    小猪的Python学习之旅 -- 19.Python微信自动好友验证,自动回复,发送群聊链接 标签:Python 一句话概括本文: 上一节利用itchat这个库,做了小宇宙早报的监测与转发, 本节新增 ...

  9. Python微信自动好友验证,自动回复,发送群聊链接

    引言: 一开始二维码加群,但是呢,这个东西隔一段时间会过期,我需要 每隔一段时间去更新二维码,然后当群人数超过100人了,只能邀请进群, 这个时候就需要别人添加我为好友,然后我通过,打开交流群,添加成 ...

最新文章

  1. 【转载】【VSCode】Windows下VSCode编译调试c/c++
  2. 快速安装Git客户端及TortoiseGit并使用
  3. flume高可用-balance-配置文件编写
  4. 从实验现象详细分析BGP的路由策略与选路原则
  5. 限时团购,6.5折:《C# 7.0 核心技术指南》
  6. Android官方开发文档Training系列课程中文版:线程执行操作之定义线程执行代码
  7. 【HBase从入门到精通系列】如何避免HBase写入过快引起的各种问题
  8. 涉及反射/内省/泛型的优化实践
  9. Monto Carlo估计动作价值(action values)
  10. 系统定时任务linux,Linux系统管理之定时任务
  11. DPDK QOS4 -- PORT数据结构的初始化
  12. ISCC2021-WP合集
  13. 软件工程小组第八次会议记录
  14. python为csv文件添加表头_csv大文件分割以及添加表头
  15. 【音视频】常见的音频处理算法
  16. VUE子路由跳转,各位大神,为啥我这个子路由跳转不到相应的子页面,求助求助
  17. java打字小游戏_JAVA打字小游戏
  18. 元宇宙「虚拟世界」,构建身临其境的社交世界
  19. 8小时浓度均值即连续8个小时浓度的平均值
  20. docker最简单部署python项目

热门文章

  1. Java精品项目源码前后端分离项目第17期基于遗传算法学校排课系统
  2. 《复旦名师陈果:好的孤独》-陈果读书笔记
  3. 数学分析教程史济怀练习9.3
  4. linux CentOS 7 在线安装 zabbix 官网的思路,最简洁
  5. 关于手机功能NFC(以华为V9为例)
  6. 9.28前端培训评价 + 前端作业1的问题与解决
  7. 2019最新《知乎萧井陌大神的Web前端+Flask后端课程分享》
  8. 《有限与无限的游戏》第三章 我是自己的天才:经典摘抄(2)
  9. crt打开FTP文件服务器,crt登陆到ftp服务器
  10. idea 打开项目所有java类变成咖啡图标 打开类上面是0110图标