Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码


Posted in Python onMay 28, 2020

一位伙计自己开了个游戏室,想在群里拉点人,就用所学知识帮帮忙,于是就有了这篇文章,今天小编特此通过实例代码给大家介绍下Python selenium 加载并保存QQ群成员去除其群主、管理员信息的示例代码

模拟登陆页面

页面分析

思路:

点击登陆按钮
选择要登陆的账号

Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码

代码实现

# Author:smart_num_1
# Blog:https://blog.csdn.net/smart_num_1
# WeChat:Be_a_lucky_dog

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait

def login(driver = None):
 already_dic = {}
 # 创建一个字典,保存电脑登陆的QQ
 
 login_button = WebDriverWait(driver = driver,timeout = 100).until(EC.presence_of_element_located((By.XPATH,'//p[@class="user-info"]/a')))
 login_button.click()
 # 点击登录,获取电脑登陆的QQ
 
 already_login_number = WebDriverWait(driver = driver,timeout = 100).until(EC.presence_of_element_located((By.XPATH,'//div[@id="loginWin"]/iframe')))
 driver.get(url = already_login_number.get_attribute('src'))
 # 此步骤目的,是因为登录框是一个子页面,在上一级页面中获得到的这个子页面
 
 already_login_numbers = WebDriverWait(driver = driver,timeout = 100).until(EC.presence_of_all_elements_located((By.XPATH,'//span[contains(@class,"nick")]')))
 # 获取电脑登陆的QQ
 
 print('在以下账号中选择所需账号')
 for already_login_number in already_login_numbers:
  already_dic[already_login_number.get_attribute('innerText')] = already_login_number
  print(already_login_number.get_attribute('innerText'))
 QQ_NeedToLogin = input('需要登陆: ')
 # 通过获取键名,在 already_dic 获得相应的键值
 already_dic[QQ_NeedToLogin].click()
 # 模拟点击要登陆的QQ,达到登陆的效果
 time.sleep(1)

if __name__ == '__main__':
	start_url = 'https://qun.qq.com/index.html#click' 
	# 群首页,用来登陆账号
	driver = webdriver.Chrome(executable_path = './chromedriver.exe')
	# 因为selenium 需要用到浏览器、浏览器驱动,但是还要配置环境变量,很麻烦,如果这样指定 webdriver 路径的话,就可以省去那一步
	driver.get(url=start_url)
 login(driver=driver)

选择所需加载群

页面分析

打开群管理界面,会看到这样的信息,我们的目的是爬取已加入群的成员信息

Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码

代码实现

# Author:smart_num_1
# Blog:https://blog.csdn.net/smart_num_1
# WeChat:Be_a_lucky_dog
def get_group_number(driver = None):
 group_number_dic = {}
 # 同样的,利用字典储存信息
 my_group_list = WebDriverWait(driver = driver,timeout = 100).until(EC.presence_of_all_elements_located((By.XPATH,'//ul[@class="my-group-list"]/li')))
 # 获取每个已加入群的节点信息
 print('在以下群中选择:')
 i = 1
 for my_group in my_group_list:
  try:
   group_number_dic[str(i)] = my_group
   print('第 %s 个--- '%str(i) + my_group.get_attribute('title') + ' ' + my_group.get_attribute('data-id'))
   i += 1
  except:
   continue
 # 打印出获得的群信息,获取所有的目标群
 group = input('获取群编号 : ')
 # 通过键名获取键值,得到要点击的目标
 group_number_dic[group].click()
 return driver
if __name__ == '__main__':
	member_url_test = 'https://qun.qq.com/member.html'
	driver.get(url = member_url_test)
 driver = get_group_number(driver=driver)

保存所需信息

页面分析

可以看到,是个动态加载的页面,因为用的是selenium,所以就没必要分析到底是通过请求那个url得到的信息,直接模拟滚动获取就可以了

Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码

代码实现

# Author:smart_num_1
# Blog:https://blog.csdn.net/smart_num_1
# WeChat:Be_a_lucky_dog
def get_group_member(driver = None):
 driver.refresh()
 # 刷新一下界面,防止上一步点击过后,页面不更新的情况
 elem_end = WebDriverWait(driver = driver,timeout = 100).until(EC.presence_of_element_located((By.XPATH,'//td[@class="td-user-nick"]/img')))
 # 添加了等待,这个定位可以随便的选择,确保页面加载完毕的
 for i in range(10):
  time.sleep(0.5)
  driver.execute_script("var action=document.documentElement.scrollTop=10000")
  print('加载中······')
 # 这个滚动范围可以任选,因为每次会加载21个信息,我看过我加的群,在10次过后的成员基本属于潜水的人了,要不要的就无所谓了
 group_members = driver.find_elements_by_xpath('//tr[contains(@class,"mb")]')
 for group_member in group_members:
  try:
   data = group_member.text.split('\n')[2].split(' ')[0]
   # 这一步,得到一个列表,从第一位开始分别是成员、群昵称、QQ号、性别、Q龄、入群时间、等级(积分)、最后发言,在这里我是只需要QQ号码
   #对于其他信息,根据自己需要,添加代码即可
   if data.isdigit() == True:
    with open('./record.txt','a',encoding = 'utf-8') as record:
     record.write(data + '@qq.com')
     record.write('\n')
  except:
   continue
 print('Loaded')

完整代码

# Author:smart_num_1
# Blog:https://blog.csdn.net/smart_num_1
# WeChat:Be_a_lucky_dog
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.chrome.options import Options
import time
import random
import os
def get_group_member(driver = None):
 driver.refresh()
 elem_end = WebDriverWait(driver = driver,timeout = 100).until(EC.presence_of_element_located((By.XPATH,'//td[@class="td-user-nick"]/img')))
 for i in range(10):
  time.sleep(0.5)
  driver.execute_script("var action=document.documentElement.scrollTop=10000")
  print('加载中······')
 group_members = driver.find_elements_by_xpath('//tr[contains(@class,"mb")]')
 for group_member in group_members:
  try:
   data = group_member.text.split('\n')[2].split(' ')[0]
   if data.isdigit() == True:
    with open('./record.txt','a',encoding = 'utf-8') as record:
     record.write(data + '@qq.com')
     record.write('\n')
  except:
   continue
 print('Loaded')
def get_group_number(driver = None):
 group_number_dic = {}
 my_group_list = WebDriverWait(driver = driver,timeout = 100).until(EC.presence_of_all_elements_located((By.XPATH,'//ul[@class="my-group-list"]/li')))
 print('在以下群中选择:')
 i = 1
 for my_group in my_group_list:
  try:
   group_number_dic[str(i)] = my_group
   print('第 %s 个--- '%str(i) + my_group.get_attribute('title') + ' ' + my_group.get_attribute('data-id'))
   i += 1
  except:
   continue
 group = input('获取群编号 : ')
 group_number_dic[group].click()
 return driver
def login(driver = None):
 already_dic = {}
 login_button = WebDriverWait(driver = driver,timeout = 100).until(EC.presence_of_element_located((By.XPATH,'//p[@class="user-info"]/a')))
 login_button.click()
 already_login_number = WebDriverWait(driver = driver,timeout = 100).until(EC.presence_of_element_located((By.XPATH,'//div[@id="loginWin"]/iframe')))
 driver.get(url = already_login_number.get_attribute('src'))
 already_login_numbers = WebDriverWait(driver = driver,timeout = 100).until(EC.presence_of_all_elements_located((By.XPATH,'//span[contains(@class,"nick")]')))
 print('在以下账号中选择所需账号')
 for already_login_number in already_login_numbers:
  already_dic[already_login_number.get_attribute('innerText')] = already_login_number
  print(already_login_number.get_attribute('innerText'))
 QQ_NeedToLogin = input('需要登陆: ')
 already_dic[QQ_NeedToLogin].click()
 time.sleep(1)
def start(driver = None,url = None):
 print('Please wait for loading\n')
 driver.get(url = url)
 driver = get_group_number(driver=driver)
 print('Please wait for loading\n')
 get_group_member(driver=driver)
if __name__ == '__main__':
 print('Please wait for loading')
 chrome_options=Options()
 chrome_options.add_argument('--headless')
 try:
  random.seed(time.time())
  QQ_number = '738334209'
  start_url = 'https://qun.qq.com/index.html#click'
  member_url = 'https://qun.qq.com/member.html#gid=%s'%QQ_number
  member_url_test = 'https://qun.qq.com/member.html'
  driver = webdriver.Chrome(executable_path = './chromedriver.exe',chrome_options=chrome_options)
  try:
   driver.get(url=start_url)
   login(driver=driver)
   while True:
    start(driver = driver,url = member_url_test)
    flag = input('是否继续爬取? yes or no : ')
    if flag == 'no':
     break
    os.system('cls')
   driver.quit()
  except:
   print('Something wrong')
   driver.quit()
 except:
  print('Something wrong!!!!!!')
  os.system('pause')

转载请标明出处:https://blog.csdn.net/smart_num_1/article/details/106326488

总结

到此这篇关于Python selenium 加载并保存QQ群成员 去除其群主、管理员信息的示例代码的文章就介绍到这了,更多相关Python selenium 加载并保存QQ群成员内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python 参数列表中的self 显式不等于冗余
Dec 01 Python
在Python的Flask框架下收发电子邮件的教程
Apr 21 Python
python的pdb调试命令的命令整理及实例
Jul 12 Python
Python使用修饰器执行函数的参数检查功能示例
Sep 26 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
Apr 10 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
Feb 26 Python
python文件操作seek()偏移量,读取指正到指定位置操作
Jul 05 Python
Python类绑定方法及非绑定方法实例解析
Oct 09 Python
python中yield的用法详解
Jan 13 Python
python如何在word中存储本地图片
Apr 07 Python
Python连续赋值需要注意的一些问题
Jun 03 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Apr 07 Python
Python爬虫requests库多种用法实例
May 28 #Python
在pycharm中创建django项目的示例代码
May 28 #Python
python中有函数重载吗
May 28 #Python
Python可以实现栈的结构吗
May 27 #Python
Python如何脚本过滤文件中的注释
May 27 #Python
Python如何获取文件指定行的内容
May 27 #Python
Python web如何在IIS发布应用过程解析
May 27 #Python
You might like
PHP APC的安装与使用详解
2013/06/13 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
yepnope.js 异步加载资源文件
2011/09/08 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
2016/01/14 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
2016/02/02 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
jQuery插件dataTables添加序号列的方法
2016/07/06 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
2018/08/13 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
Python进行数据科学工作的简单入门教程
2015/04/01 Python
Python实现简单过滤文本段的方法
2017/05/24 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
详解Python3中的 input() 函数
2020/03/18 Python
Pandas之read_csv()读取文件跳过报错行的解决
2020/04/21 Python
PyQt5实现画布小程序
2020/05/30 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
详解canvas在圆弧周围绘制文本的两种写法
2018/05/22 HTML / CSS
美国珠宝店:Helzberg Diamonds
2018/10/24 全球购物
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
日本最大的购物网站:日本乐天市场(Rakuten Ichiba)
2020/11/04 全球购物
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
不听老师话的万能检讨书
2014/10/04 职场文书
任命书格式模板
2015/09/22 职场文书
大学组织委员竞选稿
2015/11/21 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
Python采集壁纸并实现炫轮播
2022/04/30 Python
索尼ICF-36收音机评测
2022/04/30 无线电