爬虫笔记(三):实战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. 图片验证

这个部分我做了两天,吐血了!!!
先简述一下这部分怎么做哈:

  1. 图片验证这个功能需要借助超级鹰这一工具,没有用过这个的小伙伴可以看一下我的爬虫笔记(一)的前半部分,或者找其他的博客看一下,很简单的~
  2. 我们要将这整个网页截图下来,然后将图片验证这一部分再单独截取下来,发送给超级鹰解析,得到需要一个坐标的列表,这个坐标就是鼠标需要点击的图片的坐标(整个网页其左上角是原点,即(0, 0))
  3. 当然如果超级鹰返回的是空列表,那就点击刷新按钮啦(我测试的时候倒是没有遇到这种情况);验证完成后,点击确定按钮就行啦

其实整体思路还挺简单的,但是有关截图和点击坐标那里,实在是太麻烦啦!!!

(当然也有可能是我的技术有限,如果大家有其他的方法请指导我一下,蟹蟹您!!!)

首先,封装一个超级鹰的工具:

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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode c++ 超出内存限制

给两个主要原因&#xff0c;这两个原因&#xff0c;如果在递归或者循环里就很容易导致内存超出限制 首先就是误用 如果只是变量的变化实现的话&#xff0c;或者-就可以了&#xff0c;不需要写成AAx的形式&#xff0c;那样会重新开辟一块内存 其次就是值传递 值传递也是会开辟…

在Linux中对Nginx进行安全加固

准备工作 在IP为x.x.x.x的服务器上安装nginx&#xff0c;确保Linux系统为nginx环境。 检查nginx是否配置nginx账号锁定策略 配置nginx账号锁定策略&#xff0c;降低被攻击概率。 第一步&#xff0c;查看nginx的锁定状态。 命令&#xff1a;passwd -S nginx 若结果出现“P…

【gcc】webrtc发送侧计算 丢包率

大神的分析 : 提到: 每当收到cc-feedback或者收到RR-report的时候就能统计出丢包率,在cc-controller中就会调用SendSideBandwidthEstimation::UpdatePacketsLost()去更新丢包率,同时进行码率预估 G:\CDN\rtcCli\m98\src\modules\congestion_controller\goog_cc\send_side_b…

今日arXiv最热NLP大模型论文:像人一样浏览网页执行任务,腾讯AI lab发布多模态端到端Agent

Agent的发展成为了LLM发展的一个热点。只需通过简单指令&#xff0c;Agent帮你完成从输入内容、浏览网页、选择事项、点击、返回等一系列需要执行多步&#xff0c;才能完成的与网页交互的复杂任务。 比如给定任务&#xff1a;“搜索Apple商店&#xff0c;了解iPad智能保护壳Sm…

Qt中的绝对位置与相对位置

在Qt的开发中&#xff0c;有时候需要获取鼠标点击的位置的坐标。在Qt中坐标分为相对坐标和绝对坐标&#xff1b;相对坐标是以控件的左上角为&#xff08;0&#xff0c;0&#xff09;点的坐标系的坐标&#xff0c;绝对坐标是以显示器屏幕的左上角为&#xff08;0&#xff0c;0&a…

蓝桥杯-常用STL(二)

常用STL &#x1f388;1.集合&#x1f388;2.set的基础使用&#x1f52d;2.1引入库&#x1f52d;2.2插入元素&#x1f52d;2.3删除元素&#x1f52d;2.4判断元素是否存在&#x1f52d;2.5遍历元素&#x1f52d;2.6清空 &#x1f388;3.set与结构体 &#x1f388;1.集合 &#x…

【Algorithms 4】算法(第4版)学习笔记 04 - 2.1 初级排序算法

文章目录 前言参考目录学习笔记1&#xff1a;前置说明1.1&#xff1a;全序关系1.2&#xff1a;Comparable API 实现 demo1.3&#xff1a;排序算法模板2&#xff1a;选择排序2.1&#xff1a;内循环实现过程拆解2.2&#xff1a;代码实现2.3&#xff1a;特点3&#xff1a;插入排序…

【kubernetes】集群网络(二):Flannel的VxLan、Host-GW模式

文章目录 1 Pod的IP地址的分配2 CNI3 Flannel3.1 Flannel的安装3.2 VxLan3.3 Host-GW 4 总结 1 Pod的IP地址的分配 当节点上只安装了docker&#xff0c;则会用veth pairdocker0实现单个节点上容器之间的通信&#xff0c;并且这些容器都在同一个IP段&#xff0c;如果不修改&…

(2024,SaFaRI,双三上采样和 DFT,空间特征和频率特征)基于扩散模型的图像空间和频率感知恢复方法

Spatial-and-Frequency-aware Restoration method for Images based on Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 修改数据保真度 3.2 …

JMeter GUI:测试计划和工作台

什么是测试计划&#xff1f; 测试计划是您添加 JMeter 测试所需元素的地方。 它存储运行所需测试所需的所有元素&#xff08;如线程组、计时器等&#xff09;及其相应的设置。 下图显示了测试计划的示例 测试计划是您添加 JMeter 测试所需元素的地方。 它存储运行所需测试…

Modbus协议学习第六篇之基于libmodbus库的示例程序(可以联合Modbus模拟仿真软件进行调试)

前置工作 学了这么多Modbus的知识&#xff0c;如果不进行实际的操作&#xff0c;总感觉懂的不透彻。基于此&#xff0c; 本篇博文就带各位读者来了解下如何通过编写程序来模拟与Modbus Slave仿真软件的通讯。当然了&#xff0c;这里有两个前提&#xff0c;如下&#xff1a; 1.请…

【深度强化学习】Python:OpenAI Gym-CarRacing 自动驾驶 | 提供项目完整代码 | 车道检测功能 | 路径训练功能 | 车辆控制功能

💭 写在前面:本篇是关于 OpenAI Gym-CarRacing 自动驾驶项目的博客,面向掌握 Python 并有一定的深度强化学习基础的读者。GYM-Box2D CarRacing 是一种在 OpenAI Gym 平台上开发和比较强化学习算法的模拟环境。它是流行的 Box2D 物理引擎的一个版本,经过修改以支持模拟汽车…

一键部署幻兽帕鲁服务器免费一年方案

一、背景介绍 简单讲一下历程&#xff0c;幻兽帕鲁从在1月19日上线&#xff0c;24小时内在线人数峰值便突破200万&#xff0c;作为2024年第一款现象级游戏&#xff0c;《幻兽帕鲁》上线后&#xff0c;由于人数太多&#xff0c;频现服务器过载导致游戏卡顿掉线的情况。为了能够…

【GitHub项目推荐--大语言模型课程】【转载】

Large Language Model Course Large Language Model Course&#xff08;大型语言模型课程&#xff09;是一个开源项目&#xff0c;该课程分为三个部分&#xff1a; LLM 基础&#xff1a;涵盖了数学、Python 和神经网络的基础知识。 LLM 科学家&#xff1a;专注于学习如何使用…

【机器学习】基于K-近邻的车牌号识别

实验四: 基于K-近邻的车牌号识别 1 案例简介 ​ 图像的智能处理一直是人工智能领域广受关注的一类技术&#xff0c;代表性的如人脸识别与 CT 肿瘤识别&#xff0c;在人工智能落地的进程中发挥着重要作用。其中车牌号识别作为一个早期应用场景&#xff0c;已经融入日常生活中&…

LVGL部件7

一.图片部件 1.知识概览 2.函数接口 1.lv_img_set_pivot 在LVGL&#xff08;LittlevGL&#xff09;中&#xff0c;要设置图像对象的旋转中心点&#xff0c;可以使用 lv_img_set_pivot 函数。该函数的原型如下&#xff1a; void lv_img_set_pivot(lv_obj_t * img, lv_coord_…

Flask框架开发学习笔记《5》简易服务器代码

Flask框架开发学习笔记《5》 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 简易服务器代码 接口解析那一块很关键&#xff0c;学后端服务器这一块&#xff0c;感觉主要就是学习相应地址的接口怎么处理。 然后写清楚每个地址…

在centos 7 中安装配置Jdk、Tomcat、及Tomcat自启动

目录 一、安装配置Jdk 1.创建目录并上传文件 2.解压JDK压缩包 3.配置JDK环境变量 4.设置环境变量生效 二、安装配置Tomcat 1.上传Tomcat并解压 2.启停Tomcat 3.修改tomcat-user.xml配置 4.配置远程访问Tomcat 5.远程项目发布 三.Tomcat自启动配置 1.配置Tomcat自启…

各大厂急招鸿蒙开发员,争抢鸿蒙工程师

余承东宣布鸿蒙原生应用全面启动&#xff0c;华为开始了全面抛弃安卓的进程。 多家互联网公司也发布了鸿蒙OS的App开发工程师的岗位&#xff0c;开启了抢人大战。 有的企业开出了近百万的年薪招聘鸿蒙OS工程师&#xff0c;而华为甚至为鸿蒙OS资深架构师开出了100万-160万元的…

Kotlin快速入门系列10

Kotlin的委托 委托模式是常见的设计模式之一。在委托模式中&#xff0c;有两个对象参与处理同一个请求&#xff0c;接受请求的对象将请求委托给另一个对象来处理。与Java一样&#xff0c;Kotlin也支持委托模式&#xff0c;通过关键字by。 类委托 类的委托即一个类中定义的方…