Python–selenium 加载并保存QQ群成员,去除其群主、管理员信息。
一位老哥自己开了个游戏,想在群里拉点人,就用所学知识帮帮忙,于是就有了这篇文章。。。
拙笔,拿来分享一下。纯属原创,其他有关selenium文章参考播客主页:https://blog.csdn.net/smart_num_1

基本思路

  • 模拟登陆页面
    • 页面分析
    • 代码实现
  • 选择所需加载群
    • 页面分析
    • 代码实现
  • 保存所需信息
    • 页面分析
    • 代码实现
  • 完整代码
    • 转载请标明出处

模拟登陆页面

页面分析

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

代码实现

# Author:smart_num_1
# Blog:https://blog.csdn.net/smart_num_1
# WeChat:Be_a_lucky_dogfrom 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 WebDriverWaitdef login(driver = None):already_dic = {}# 创建一个字典,保存电脑登陆的QQlogin_button = WebDriverWait(driver = driver,timeout = 100).until(EC.presence_of_element_located((By.XPATH,'//p[@class="user-info"]/a')))login_button.click()# 点击登录,获取电脑登陆的QQalready_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")]')))# 获取电脑登陆的QQprint('在以下账号中选择所需账号')for already_login_number in already_login_numbers:already_dic[already_login_number.get_attribute('innerText')] = already_login_numberprint(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)

选择所需加载群

页面分析

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

代码实现

# Author:smart_num_1
# Blog:https://blog.csdn.net/smart_num_1
# WeChat:Be_a_lucky_dogdef 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 = 1for my_group in my_group_list:try:group_number_dic[str(i)] = my_groupprint('第 %s 个--- '%str(i) + my_group.get_attribute('title') + ' ' + my_group.get_attribute('data-id'))i += 1except:continue# 打印出获得的群信息,获取所有的目标群group = input('获取群编号 : ')# 通过键名获取键值,得到要点击的目标group_number_dic[group].click()return driverif __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得到的信息,直接模拟滚动获取就可以了

代码实现

# Author:smart_num_1
# Blog:https://blog.csdn.net/smart_num_1
# WeChat:Be_a_lucky_dogdef 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:continueprint('Loaded')

完整代码

# Author:smart_num_1
# Blog:https://blog.csdn.net/smart_num_1
# WeChat:Be_a_lucky_dogfrom 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 osdef 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:continueprint('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 = 1for my_group in my_group_list:try:group_number_dic[str(i)] = my_groupprint('第 %s 个--- '%str(i) + my_group.get_attribute('title') + ' ' + my_group.get_attribute('data-id'))i += 1except:continuegroup = input('获取群编号 : ')group_number_dic[group].click()return driverdef 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_numberprint(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_numbermember_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':breakos.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群成员,去除其群主、管理员信息相关推荐

  1. python爬取qq群成员_Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码...

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

  2. python读取加载并保存pkl文件

    1.读取加载pkl文件 import _pickle as cPicklef=open('./valid.pkl','rb+') info=cPickle.load(f) print(info) 2. ...

  3. python selenium加载插件

    以chrome加载adblock_v3.6.12.crx插件为例: from selenium.webdriver.chrome.options import Options from seleniu ...

  4. Python gensim库使用word2vec 加载和保存模型、在预训练基础上训练自己的预料

    Python gensim库使用word2vec 常见: gensim.models.word2vec.Word2Vec(size=300, sg=1, min_count=1) 加载和保存模型 ge ...

  5. python 异步加载图片_Python 爬取拉钩网异步加载页面

    如下是我简单的获取拉钩网异步加载页面信息的过程 获取的是深圳 Python 岗位的所有信息,并保存在Mongo中 (对于异步加载,有的人说是把你要爬页面的信息整个页面先爬下来,保存本地,然后再看有没有 ...

  6. selenium加载插件自动化控制插件

    项目背景 最近我想把自己在哔哩哔哩上发的视频全部下载下来,发现哔哩哔哩网页版没有下载功能,app客户端只能一个一个缓存, 然后我找到网上的一些教程,发现大多数都是让我去下载一些客户端的软件,我不想用, ...

  7. Knockout应用开发指南 第六章:加载或保存JSON数据

    原文:Knockout应用开发指南 第六章:加载或保存JSON数据 加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地 ...

  8. Android_WebView加载网页保存信息到Cookie

    WebView加载网页保存信息到Cookie     一.知识点     1.WebView加载INTERNET网页        2.Android Activity和网页jsp之间传递参数     ...

  9. 成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入

    成功解决:将后缀.pyx格式文件(linux环境)编译成pyd文件(windows环境下)实现python编程加载或导入 目录 解决问题 解决思路 解决方法 解决问题 .pyx格式文件,在window ...

最新文章

  1. 常用API(Object、String、StringBuffer、用户登陆注册)
  2. kubernetes组件
  3. 是个狠角色。。 | 今日最佳
  4. 如何打开笔记本电脑的摄像头_Win8系统笔记本电脑摄像头无法使用的解决办法...
  5. Liferay6.2.1 集成 CAS4.0 实现单点登录与应用系统集成
  6. 回调函数 线程_从0实现基于Linux socket聊天室-多线程服务器一个很隐晦的错误-2...
  7. 用python建立socket,用python建立socket服务器
  8. python redis模块_大数据入门4 | Redis安装及python中的redis模块加载
  9. 如何实现百万TPS?详解JMQ4的存储设计
  10. web FG interview all
  11. IO流(1)--文件流及其原理
  12. 微信小程序项目实例——打卡时钟
  13. windows7 C盘清理(图解)
  14. 学python看谁的视频比较好-python学习视频好的有哪些
  15. 实验吧-Web-天网管理系统
  16. Nvidia Deepstream极致细节:3. Deepstream Python RTSP视频输出显示
  17. 有哪些办法可以将ip地址更换?
  18. java的学习????
  19. Cadence Orcad Capture新建原理图Symbol及新建和添加元件库到工程的方法图文教程及视频演示
  20. java中printf,print,println,区别及用法详解

热门文章

  1. 线条边框简笔画图片大全_SAI教程:漫画人物简笔画图片大全
  2. c#程序中的AssemblyInfo.cs
  3. 在计算机语言中什么是赋值的意思,赋值语句
  4. discuz论坛用户--设置--修改头像不显示
  5. leetcode刷题总结
  6. 围观“模拟面试大赛”有感
  7. 2019 iOS马甲包过审经验4.3和2.1的过包技巧
  8. 【译文】使用Rstudio调试代码(debug)
  9. hosts文件配置及其作用
  10. 杏子语录(2019年11月)