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中使用第三方库xlrd来写入Excel文件示例
Apr 05 Python
处理Python中的URLError异常的方法
Apr 30 Python
python虚拟环境virtualenv的使用教程
Oct 20 Python
tensorflow 获取变量&打印权值的实例讲解
Jun 14 Python
Python中交换两个元素的实现方法
Jun 29 Python
python分批定量读取文件内容,输出到不同文件中的方法
Dec 08 Python
PyTorch搭建多项式回归模型(三)
May 22 Python
Python中的 sort 和 sorted的用法与区别
Aug 10 Python
python实现将字符串中的数字提取出来然后求和
Apr 02 Python
浅谈pytorch 模型 .pt, .pth, .pkl的区别及模型保存方式
May 25 Python
Python获取android设备cpu和内存占用情况
Nov 15 Python
Python+Selenium自动化环境搭建与操作基础详解
Mar 13 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
使用bcompiler对PHP文件进行加密的代码
2010/08/29 PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
2011/10/23 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
jquery 学习之一 对象访问
2010/11/23 Javascript
24款热门实用的jQuery插件推荐
2014/12/24 Javascript
比例尺、缩略图、平移缩放之百度地图添加控件方法
2015/08/03 Javascript
JavaScript提高网站性能优化的建议(二)
2016/07/24 Javascript
jQuery Plupload上传插件的使用
2017/04/19 jQuery
Angularjs上传文件组件flowjs功能
2017/08/07 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
详解VueJs中的V-bind指令
2018/05/03 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
JS实现随机点名器
2020/04/12 Javascript
[01:01:24]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第三局
2016/02/25 DOTA
[01:13:01]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第三场
2018/04/05 DOTA
python的类变量和成员变量用法实例教程
2014/08/25 Python
python使用socket远程连接错误处理方法
2015/04/29 Python
python计算列表内各元素的个数实例
2018/06/29 Python
python取余运算符知识点详解
2019/06/27 Python
python使用递归的方式建立二叉树
2019/07/03 Python
python对象转字典的两种实现方式示例
2019/11/07 Python
用pushplus+python监控亚马逊到货动态推送微信
2021/01/29 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
台湾家适得:Homeget
2019/02/11 全球购物
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
2014/09/09 面试题
酒店执行总经理岗位职责
2013/12/15 职场文书
银行工作检查书范文
2014/01/31 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
2016年中秋节慰问信
2015/12/01 职场文书
领导激励员工的演讲稿,各种会上用得到,建议收藏
2019/08/13 职场文书