爬虫笔记(三):实战qq登录
咳咳,再这样下去会进橘子叭hhhhhh
以及,这个我觉得大概率是成功的,因为测试了太多次,登录并且验证之后,qq提醒我要我修改密码才可以登录捏QAQ
1. selenium
有关selenium具体是啥,这里就不再赘述了,其他的博客分享的都很清楚,我就大概说一下:selenium是一个模拟用户操作的工具,通过selenium就可以点击网页中某一按钮,或者拖动某一图形(是捏,首先想到的就是滑块验证hhhhh
2. selenium使用
写在最前面:
如果想要使用selenium,就需要安装对应的浏览器驱动。例如使用谷歌浏览器,就要安装对应版本的驱动;使用火狐浏览器,就要安装对应版本的火狐驱动
除此之外,敲重点!!!selenium需安装3.x的版本,否则就会有闪退的情况哈!!!
我所使用的是谷歌浏览器,版本号如下(想要查询谷歌的版本号,点击右上角的三个点,找到最下面的帮助->关于谷歌就看到啦):

根据这个版本号,去网上搜了一下,找到了一个可以下载驱动的网址~
我看其他人也会用这个下载驱动的网址,不过截至到2024年2月初,谷歌的最新版本已经是121啦,有点高,所以大家用第一个就好啦
下载了驱动后,将其放进谷歌的文件夹里,我的是这个(应该一般都是C盘的这个文件夹叭hhhhhh)

然后将绿线的这个文件路径放到环境变量里就好啦
接下来,看一下怎么使用这个驱动哈~
from selenium import webdriver
from selenium.webdriver import ChromeOptions# 实现规避检测
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])# 实例化浏览器
Chrome_Drive_Path = 'C:\Program Files\Google\Chrome\Application\chromedriver.exe'
driver = webdriver.Chrome(executable_path=Chrome_Drive_Path, options=option)
# 网页屏幕最大化
driver.maximize_window()
driver.get('https://im.qq.com/index/')
然后就发现qq的页面被自动打开啦!!!

3. 输入qq号和密码
打开了qq页面后,我们需要点击登录按钮,但是这个操作肯定不能由我们自己做,所以就需要selenium来帮咱们完成这个工作啦(power!!!)
首先,需要找到这个登录按钮的位置,找到之后,就可以根据这个标签的name在网页中定位到这个标签,然后点击它啦

# find_element_by_name根据name定位
# 如果标签中有id也可以用id定位,如果有class也可以用class定位
login_btn = driver.find_element_by_name('im.qq.com.login')
# 找到后点击
login_btn.click()
然后,点击登录后,就会出现如下界面啦,咱们肯定选择密码登录啦,需要找到密码登录的按钮,也就是红线标出的位置~

但是这里可以看到,密码登录这个按钮是在整个页面的子页面里,也就是html里又嵌套了一个html,这个也就是iframe。如果想要在这个子页面中找到某个标签,就需要多一步——即进入这个页面的操作
# 进入嵌套的子页面中,frame-login就是<iframe>标签的name,即上图中的绿线部分
driver.switch_to.frame('frame-login')
# 通过id定位到密码登录这一按钮
pwd_btn = driver.find_element_by_id('switcher_plogin')
pwd_btn.click()
然后,就可以到输入账号密码这一环节啦~
老规矩,定位到这两个文本框的位置,然后借助selenium输入咱的qq号和密码~

name = driver.find_element_by_id('u')
# 向文本框中填入
name.send_keys('qq号')
pwd = driver.find_element_by_id('p')
pwd.send_keys('qq密码')
sleep(1)
btn = driver.find_element_by_id('login_button')
btn.click()
# 点击登录后的下一个页面是验证,为了避免页面还未加载完就定位标签,在这里加上1s的停顿,然后再进行后续的操作
sleep(1)
然后,验证的页面就出现啦!!!

4. 图片验证
这个部分我做了两天,吐血了!!!
先简述一下这部分怎么做哈:
- 图片验证这个功能需要借助超级鹰这一工具,没有用过这个的小伙伴可以看一下我的爬虫笔记(一)的前半部分,或者找其他的博客看一下,很简单的~
- 我们要将这整个网页截图下来,然后将图片验证这一部分再单独截取下来,发送给超级鹰解析,得到需要一个坐标的列表,这个坐标就是鼠标需要点击的图片的坐标(整个网页其左上角是原点,即(0, 0))
- 当然如果超级鹰返回的是空列表,那就点击刷新按钮啦(我测试的时候倒是没有遇到这种情况);验证完成后,点击确定按钮就行啦
其实整体思路还挺简单的,但是有关截图和点击坐标那里,实在是太麻烦啦!!!
(当然也有可能是我的技术有限,如果大家有其他的方法请指导我一下,蟹蟹您!!!)
首先,封装一个超级鹰的工具:
def getCode(filePath):c = Chaojiying_Client('超级鹰的账号', '超级鹰的密码', '软件Key')im = open(filePath, 'rb').read()# 注意这个的9004,由字母数字验证码的1902改成了图像识别验证码的9004return c.PostPic(im, 9004)['pic_str']
然后,将整个页面截取下来,并且获取页面的尺寸和截图下来的页面的尺寸(是的,这两个尺寸不一样,这就是整个操作中最狗的地方)
driver.save_screenshot('total.png')
# 整个页面的尺寸
size_total = driver.get_window_size()
# 截图页面的尺寸
img_total = Image.open('total.png')
w, h =img_total.size
然后,我们想要将验证码这一部分截取下来,就需要验证码的尺寸,定位到验证码这里,就发现这六张图片其实是一个图片,当然,它依旧在一个iframe里~

# 进入iframe中
driver.switch_to.frame('tcaptcha_iframe_dy')
# 定位到验证码的图片部分,我这里用的是xpath(在img标签右键->copy->full xpath就有啦)
code_total = driver.find_element_by_xpath('/html/body/div/div[3]/div[2]/div[1]/div[1]/img')
# 获取验证码的尺寸
size = code_total.size
接下来就对验证码的部分进行截取(这里需要注意一个问题,网页的尺寸和截图网页的尺寸是不一样的,而咱们获得的验证码的尺寸与网页的尺寸是吻合的,所以如果要在截图网页上再截取验证码部分,就没办法太精确,我的建议是截的大一些)
rangle = (int(w/2 - size['width']*w/size_total['width']), int(h/2 - size['height']*h/size_total['height']),int(w/2 + size['width']*w/size_total['width']), int(h/2 + size['height']*h/size_total['height'])
)
img_code = img_total.crop(rangle)
img_code.save('code.png')
这里的rangle就是坐标啦,这样就可以获得验证码的图片啦(就是这么大~)

然后,得到了验证码的图片后,就可以提交给超级鹰啦
# res的结果是这样的,中间以“|”作为分隔符
# x1的坐标,y1的坐标|x2的坐标,y2的坐标|x3的坐标,y3的坐标
res = getCode('code.png')
在这里需要判断一下这个结果res是不是一个空值,如果是空值,就点击一下刷新的按钮
if len(res)==0:print('超级鹰结果为空')ref = driver.find_element_by_css_selector('.status-normal')ref.click()
然后,从res中分割出坐标,放进列表里(这里就是抄的网课啦)~
axis_list = []
if '|' in res:list = res.split('|')count = len(list)for i in range(count):xy_list = []x = int(list[i].split(',')[0])y = int(list[i].split(',')[1])xy_list.append(x)xy_list.append(y)axis_list.append(xy_list)
else:xy_list = []x = int(res.split(',')[0])y = int(res.split(',')[1])xy_list.append(x)xy_list.append(y)axis_list.append(xy_list)
然后然后然后,就是点击图片这里啦
这里需要注意,我们所得到的截图的尺寸,和网页的尺寸是不一样的,所以这里要转成网页的坐标,就需要处理一下经过截图得到的坐标~
for axis in axis_list:# 这里是截图的坐标,在原截图的坐标上加超级鹰的结果就行x = int(w/2-size['width']*w/size_total['width']+axis[0])y = int(h/2-size['height']*h/size_total['height']+axis[1])# 截图的尺寸转成网页的尺寸x = int(x*size_total['width']/w)y = int(y*size_total['height']/h)# 这是一个动作链,简单来说,就是鼠标一次会移动距离(x, y),然后点击一下click()# 为了使得上面这个动作链执行,需要perform()ActionChains(driver).move_by_offset(x, y).click().perform()# 这里注意一下,每次move_by_offset都是在上一次操作的坐标那里开始移动吗,也就是相对距离# 但是我们得到的绝对坐标吖,所以就需要加上reset_actions(),让动作链每一次都返回到(0,0)原坐标ActionChains(driver).reset_actions()# 每次停顿1ssleep(1)
# 点击确认按钮
ver_btn = driver.find_element_by_css_selector('.verify-btn')
ver_btn.click()
在网页上就可以看到相应的图片被选中了,如果没有选中,那一定是你的坐标算错啦!!!

最后,最后的结果就变成这个样了(叹气)

5. 贴上完整的代码叭~
from selenium import webdriver
from selenium.webdriver import ActionChains, ChromeOptions
from selenium.webdriver.chrome.service import Servicefrom time import sleep
from PIL import Imagefrom chaojiying import Chaojiying_Clientdef getCode(filePath):c = Chaojiying_Client('超级鹰账号', '超级鹰密码', '软件Key')im = open(filePath, 'rb').read()return c.PostPic(im, 9004)['pic_str']if __name__ == "__main__":# 实现规避检测option = ChromeOptions()option.add_experimental_option('excludeSwitches', ['enable-automation'])# 实例化浏览器Chrome_Drive_Path = 'C:\Program Files\Google\Chrome\Application\chromedriver.exe'# 4.x版本的用法,但是因为会闪退,就放弃了# chrome_driver_path_obj = Service(Chrome_Drive_Path)# driver = webdriver.Chrome(service=chrome_driver_path_obj)driver = webdriver.Chrome(executable_path=Chrome_Drive_Path, options=option)driver.maximize_window()driver.get('https://im.qq.com/index/')login_btn = driver.find_element_by_name('im.qq.com.login')login_btn.click()driver.switch_to.frame('frame-login')pwd_btn = driver.find_element_by_id('switcher_plogin')pwd_btn.click()name = driver.find_element_by_id('u')name.send_keys('qq账号')pwd = driver.find_element_by_id('p')pwd.send_keys('qq密码')sleep(1)btn = driver.find_element_by_id('login_button')btn.click()sleep(1)# 图片验证码# 定位整张验证码图片的标签driver.switch_to.frame('tcaptcha_iframe_dy')code_total = driver.find_element_by_xpath('/html/body/div/div[3]/div[2]/div[1]/div[1]/img')size_total = driver.get_window_size()size = code_total.size# # 对整张图片进行截图driver.save_screenshot('total.png')img_total = Image.open('total.png')w, h =img_total.sizerangle = (int(w/2 - size['width']*w/size_total['width']), int(h/2 - size['height']*h/size_total['height']),int(w/2 + size['width']*w/size_total['width']), int(h/2 + size['height']*h/size_total['height']))img_code = img_total.crop(rangle)img_code.save('code.png')## print('网页尺寸', size_total)## 超级鹰res = getCode('code.png')print(res)#if len(res)==0:print('超级鹰结果为空')ref = driver.find_element_by_css_selector('.status-normal')ref.click()axis_list = []if '|' in res:list = res.split('|')count = len(list)for i in range(count):xy_list = []x = int(list[i].split(',')[0])y = int(list[i].split(',')[1])xy_list.append(x)xy_list.append(y)axis_list.append(xy_list)else:xy_list = []x = int(res.split(',')[0])y = int(res.split(',')[1])xy_list.append(x)xy_list.append(y)axis_list.append(xy_list)# 点击验证码for axis in axis_list:x = int(w/2-size['width']*w/size_total['width']+axis[0])y = int(h/2-size['height']*h/size_total['height']+axis[1])x = int(x*size_total['width']/w)y = int(y*size_total['height']/h)print('超级鹰结果', x, y)ActionChains(driver).move_by_offset(x, y).click().perform()# 每一次都从(0,0)开始移动ActionChains(driver).reset_actions()sleep(1)# 点击确认ver_btn = driver.find_element_by_css_selector('.verify-btn')ver_btn.click()sleep(1)
相关文章:
爬虫笔记(三):实战qq登录
咳咳,再这样下去会进橘子叭hhhhhh 以及,这个我觉得大概率是成功的,因为测试了太多次,登录并且验证之后,qq提醒我要我修改密码才可以登录捏QAQ 1. selenium 有关selenium具体是啥,这里就不再赘述了&#x…...
又涨又跌 近期现货黄金价格波动怎么看?
踏入2024年一月的下旬,现货黄金价格可以说没了之前火热的状态,盘面上是又涨又跌。面对这样的行情,很多投资者不知道如何看了。下面我们就来讨论一下怎么把握近期的行情。 先区分走势类型。在现货黄金市场中有两种主要的走势类型,一…...
软件压力测试:探究其目的与重要性
随着软件应用在各行各业中的广泛应用,确保软件在高负载和极端条件下的稳定性变得至关重要。软件压力测试是一种验证系统在不同负载条件下的性能和稳定性的方法。本文将介绍软件压力测试的目的以及为什么它对软件开发和部署过程至关重要。 验证系统性能的极限&#x…...
Android.bp入门指南之浅析Android.bp文件
文章目录 Android.bp文件是什么?Android.bp的主要作用模块定义依赖关系构建规则模块属性插件支持模块的可配置性 为什么会引入Android.bp语法例子 Android.bp文件是什么? Android.bp 文件是 Android 构建系统(Android Build Systemÿ…...
2024年美赛 (D题ICM)| 湖流网络水位控制 |数学建模完整代码+建模过程全解全析
当大家面临着复杂的数学建模问题时,你是否曾经感到茫然无措?作为2022年美国大学生数学建模比赛的O奖得主,我为大家提供了一套优秀的解题思路,让你轻松应对各种难题。 让我们来看看美赛的D题! 完整内容可以在文章末尾领…...
安卓网格布局GridLayout
<?xml version"1.0" encoding"utf-8"?> <GridLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:la…...
DHCP简介
定义 动态主机配置协议DHCP(Dynamic Host Configuration Protocol)是一种用于集中对用户IP地址进行动态管理和配置的技术。即使规模较小的网络,通过DHCP也可以使后续增加网络设备变得简单快捷。 DHCP是在BOOTP(BOOTstrap Protoc…...
Hadoop生态系统中一些关键组件的详细解析
1. Hadoop核心组件 HDFS(Hadoop Distributed File System): 分布式文件存储系统。提供高吞吐量的数据访问,非常适合用于大规模数据集。有高容错性,通过在多个节点间复制数据块来实现。 MapReduce: 一种编程模型,用于在…...
功能强大的开源数据中台系统 DataCap 2024.01.1 发布
推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台,建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件:https://github.com/devlive-commun…...
Redis的bitmap使用不当,我内存爆了
背景 最近发现Redis的内存持续暴涨, 涨的有点吓人,机器都快扛不住了,不得不进行Redis内存可视化分析,发现大量的String类型的大key 经分析,最近上线了页面UV的统计,那目前如何做的呢? 通过访…...
基于python的新闻爬虫
咱们这个任务啊,就是要从一个指定的网站上,抓取新闻内容,然后把它们整整齐齐地保存到本地。具体来说,就是要去光明网的板块里,瞅瞅里面的新闻,把它们一条条地保存下来。 首先,咱得有个网址&…...
C#基础题
值类型和引用类型之间的区别是什么? 值类型在内存中存储实际值,而引用类型存储对对象的引用。值类型在栈上分配内存,而引用类型在堆上分配内存。值类型是不可变的,而引用类型是可变的。值类型的大小是固定的,而引用类型…...
AI大语言模型学习笔记之三:协同深度学习的黑魔法 - GPU与Transformer模型
Transformer模型的崛起标志着人类在自然语言处理(NLP)和其他序列建模任务中取得了显著的突破性进展,而这一成就离不开GPU(图形处理单元)在深度学习中的高效率协同计算和处理。 Transformer模型是由Vaswani等人在2017年…...
c++阶梯之auto关键字与范围for
auto关键字(c11) 1. auto关键字的诞生背景 随着程序的逐渐复杂,程序代码中用到的类型也越来越复杂。譬如: 类型难以拼写;含义不明确容易出错。 比如下面一段代码: #include <string> #include &…...
第八篇:node模版引擎Handlebars及他的高级用法(动态参数)
🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📘 引言: …...
css3 属性 backface-visibility 的实践应用
backface-visibility 是一个用于控制元素在面对屏幕不同方向时的可见性的CSS3特性。它有两个可能的值: visible:当元素不面向屏幕(即背面朝向用户)时,元素的内容是可以被看到的。hidden:当元素不面向屏幕…...
嵌入式学习第十七天
C语言小项目: 制作俄罗斯方块小游戏(全部) 主函数部分 #include <stdio.h> #include <unistd.h> #include <string.h> #include <signal.h> #include <stdlib.h> #include <time.h> #include "b…...
使用Python的Turtle模块简单绘制烟花效果
import turtle import random# 初始化屏幕 screen turtle.Screen() screen.bgcolor("black") screen.title("烟花模拟")# 创建一个Turtle来绘制烟花 firework turtle.Turtle() firework.hideturtle() firework.speed(0) # 设置绘图速度为最快# 绘制烟花…...
数学建模-退火算法和遗传算法
退火算法和遗传算法 一.退火算法 退火算法Matlab程序如下: [W]xlsread(D:100个目标经度纬度);>> x[W(:,1)];>> y[W(:,2)];>> w[x y];;d1[70, 40];>> w[d1;w;d1]ww*pi/180;%角度化成弧度dzeros(102);%距离矩阵初始化for i1:101…...
Qt开源版 vs 商业版 详细比较!!!!
简单整理Qt开源版与商业版有哪些差别,仅供参考。 简单对比 开源版商业版许可证大部分采用对商业使用不友好的LGPLv3具备商业许可证保护代码专有许可证相关大部分模块使用LGPLv3和部分模块使用GPL组成仅第三方开源组件使用Qt的其他许可证Qt模块功能支持支持技术支持…...
终极WZ文件编辑器:从地图设计到资源定制的完整工作流
终极WZ文件编辑器:从地图设计到资源定制的完整工作流 【免费下载链接】Harepacker-resurrected All in one .wz file/map editor for MapleStory game files 项目地址: https://gitcode.com/gh_mirrors/ha/Harepacker-resurrected Harepacker-resurrected是一…...
League-Toolkit启动故障系统性排查方案:从现象到根治的完整解决路径
League-Toolkit启动故障系统性排查方案:从现象到根治的完整解决路径 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 问…...
市场比较好的显示屏模块供货商哪家强
市场比较好的显示屏模块供货商推荐在显示屏模块市场,众多企业各展所长,为不同行业提供着优质的产品。以下为您介绍十家市场上表现出色的显示屏模块供货商:杭州斡能电子有限公司(杭州斡能) 杭州斡能始创于2008年10月&am…...
FineBI连接MySQL实战:手把手教你从零搭建第一个学生数据分析看板
FineBI连接MySQL实战:从零构建学生数据分析看板 当教务系统的学生信息沉睡在MySQL数据库中时,FineBI能像魔法师一样将它们唤醒为生动的可视化图表。我曾为某高校搭建第一个招生分析看板时,仅用三小时就让校领导看到了历年录取数据的立体画像—…...
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
Java岗位从P5到P7的成长路径P5到P7是Java开发者从初级到高级的关键阶段,需要技术深度、系统设计能力和项目经验的全面提升。以下是分阶段的资源推荐和成长建议。P5(初级工程师)阶段核心能力要求:基础语法、框架使用、简单业务开发…...
Alpamayo-R1-10B入门必看:VLA模型与传统端到端/模块化架构的本质差异
Alpamayo-R1-10B入门必看:VLA模型与传统端到端/模块化架构的本质差异 1. 引言:自动驾驶决策的十字路口 想象一下,你正在教一个新手司机开车。传统的方法有两种:一种是让他死记硬背所有交通规则和操作步骤(模块化&…...
MedGemma-X实战体验:像医生一样提问,AI智能回答
MedGemma-X实战体验:像医生一样提问,AI智能回答 1. 引言:当AI学会“看”和“说” 想象一下,你是一位放射科医生,面对一张复杂的胸部X光片,心中闪过几个疑问:“右肺中叶的阴影是炎症还是陈旧性…...
LeaguePrank:5分钟学会英雄联盟个性化美化工具终极指南 [特殊字符]
LeaguePrank:5分钟学会英雄联盟个性化美化工具终极指南 🎮 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 想要在英雄联盟中展示与众不同的个人形象吗?LeaguePrank 正是你需要的个性化美化工…...
Z-Image-Turbo行业应用:教育领域课件插图自动化生成
Z-Image-Turbo行业应用:教育领域课件插图自动化生成 1. 教育课件插图的痛点与机遇 老师们每天都要准备各种教学课件,从数学公式图示到历史事件场景,从生物细胞结构到地理地貌展示。传统方式下,要么花费大量时间搜索合适的图片&a…...
Hunyuan-MT-7B快速入门:无需代码,用浏览器就能翻译33种语言
Hunyuan-MT-7B快速入门:无需代码,用浏览器就能翻译33种语言 1. 为什么选择Hunyuan-MT-7B翻译模型 在全球化协作日益紧密的今天,语言障碍仍然是许多企业和个人面临的现实挑战。传统翻译工具要么功能有限,要么需要复杂的编程接口&…...
