爬虫笔记(三):实战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改成了图像识别验证码的9004
    return 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()
    # 每次停顿1s
    sleep(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 Service

from time import sleep
from PIL import Image

from chaojiying import Chaojiying_Client


def 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.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')
    #
    # 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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ZKFair Pass (FEB) NFT 上线 10 分钟售罄,市场反响激烈

据 ZKFair 推特显示&#xff0c;1 月 31 日晚间&#xff0c;ZKFair 与 Element 联合发布的 2 万张限量 ZKFair Pass&#xff08;FEB&#xff09;于 10 分钟内售罄。ZKFair Pass (FEB) 是 ZKFair 和 Element 联合推出的限时权益卡&#xff0c;总量 2 万张&#xff0c;持卡人将获…

基于junit4搭建自定义的接口自动化测试框架

随着业务的逐步稳定&#xff0c;对于接口的改动也会逐渐变少。更多的是对业务逻辑的优化&#xff0c;功能实现的完善。对于测试来说&#xff0c;重复繁琐的功能测试不仅效率低下&#xff0c;而且耗费一定的人力资源。笔者支持的信息流业务下的一个图文管理平台就是一个功能较为…

机器学习入门-----sklearn

机器学习基础了解 概念 机器学习是人工智能的一个实现途径 深度学习是机器学习的一个方法发展而来 定义:从数据中自动分析获得模型,并利用模型对特征数据【数据集:特征值+目标值构成】进行预测 算法 数据集的目标值是类别的话叫做分类问题;目标值是连续的数值的话叫做回…

【开源】SpringBoot框架开发无代码动态表单系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 动态类型模块2.2 动态文件模块2.3 动态字段模块2.4 动态值模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 动态类型表3.2.2 动态文件表3.2.3 动态字段表3.2.4 动态值表 四、系统展示五、核心代码5.1 查询档案类型5.…

智慧文旅:驱动文化与旅游融合发展的新动力

随着科技的快速发展和人们生活水平的提高&#xff0c;文化和旅游的融合成为了时代发展的必然趋势。智慧文旅作为这一趋势的引领者&#xff0c;通过先进的信息技术手段&#xff0c;推动文化与旅游的深度融合&#xff0c;为产业的发展注入新的活力。本文将深入探讨智慧文旅如何成…

数据库运维工作量直接减少 50%,基于大模型构建智能问答系统的技术分享

本文源自百度智能云数据库运维团队的实践&#xff0c;深入探讨了基于大模型构建「知识库智能问答系统」的设计过程和应用。 全文包括了总体的技术方案选型、各个模块的设计实现、重点难点问题的突破、以及目前的落地场景应用等。 该系统自从内部上线以来&#xff0c;整体的回…

大语言模型之LlaMA系列-LlaMA 2及LlaMA_chat(下)

多转一致性的系统消息 - System Message for Multi-Turn Consistency 在对话设置中&#xff0c;某些指示应适用于所有对话轮次。 例如&#xff0c;简洁地响应&#xff0c;或"充当"某个公众人物。当我们向Llama 2-Chat提供此类指示时&#xff0c;后续应响应始终遵守约…

十、Qt三维图表

一、Data Visualization模块概述 Data Visualization的三维显示功能主要有三种三维图形来实现&#xff0c;三各类的父类都是QAbstract3DGraph&#xff0c;从QWindow继承而来。这三类分别是&#xff1a;三维柱状图Q3DBar三维空间散点Q3DScatter三维曲面Q3DSurface 1、相关类的…

混乱字母排序——欧拉路数论

题目描述 小明接到一个神秘的任务&#xff1a;对于给定的 n 个没有顺序的字母对&#xff08;无序代表这两个字母可以前后顺序颠倒&#xff0c;区分大小写&#xff09;。请构造一个有 (n1) 个字母的混乱字符串使得每个字母对都在这个字符串中出现。 输入输出格式 输入格式 第…

蓝桥杯备战——10.超声波模块

1.分析原理图 蓝桥杯单片机板子的原理图做的简直是依托答辩&#xff0c;乱糟糟的不说还弄成黑白的&#xff0c;明明很简单的东西&#xff0c;弄成一大堆。 可以看到&#xff0c;J2跳线帽如果P10接N_A1,P11接N_B1就是用作超声波功能。N_A1用作发生超声波功能&#xff0c;而N_B1…

【blender插件】(1)快速开始

特性 blender的python API有如下特性: 编辑用户界面可以编辑的任意数据(场景,网格,粒子等)。修改用户首选项、键映射和主题。运行自己的配置运行工具。创建用户界面元素,如菜单、标题和面板。创建新的工具。场景交互式工具。创建与Blender集成的新渲染引擎。修改模型的数据…

pinctrl/gpio子系统(2)-gpio子系统介绍及驱动源码简单分析

文章目录 1.gpio子系统api2.gpio相关of函数3.gpio子系统驱动分析3.1设备树信息分析3.2驱动程序分析 4.最后 1.gpio子系统api 这里的api都是基于gpio的编号去进行操作 1&#xff09;gpio_request&#xff0c;用于申请一个GPIO管脚 int gpio_request(unsigned gpio, const char …

前缀和 差分

差分和前缀和都是算法里边比较重要的知识点&#xff0c;不过学习的难度并不高&#xff0c;这篇文章会讲解相关的内容。 1. 前缀和怎么玩 1&#xff09;一维前缀和 在该数之前&#xff0c;包括该数的所有数之和&#xff0c;有点类似高中学的数列的前n项和Sn。 2&#xff09;二维…

【sentinel流量卫兵搭建与微服务整合】

sentinel流量卫兵搭建与微服务整合 搭建sentinel dashboard控制台微服务整合 搭建sentinel dashboard控制台 1、下载 官网链接 由于官网github网络原因&#xff0c;导致长时间下载失败。 网盘链接 网盘提取码&#xff1a;dwgj 2、运行 将下载jar包放在任意非中文、不包含特殊…

专有云 ABC Stack 联合银联商务打造金融级云平台,入选《2024 央国企上云用云典型案例》

2024 年 1 月&#xff0c;在中国信通院《2024 央国企上云用云典型案例》征集中&#xff0c;百度智能云携手银联商务提交的《银联商务金融级云平台》成功入选「上云用云解决方案典型案例」。 在国家「1 朵央企云统领&#xff0c;N 朵行业云共载&#xff0c;M 朵私有云共生」的央…

jenkins 下载插件sentry-cli失败 证书过期

现状 npm set ENTRYCLI_CDNURLhttps://cdn.npm.taobao.org/dist/sentry-cli npm set sentrycli_cdnurlhttps://cdn.npm.taobao.org/dist/sentry-cli 原因是npm原域名停止解析&#xff0c;在访问上面sentry-cli的cdn资源的时候 证书过期无法下载。 解决&#xff1a; 替换证书过期…

BL808 Linux支持WIFI

BL808芯片介绍 BL808是高度集成的AIoT芯片组&#xff0c;具有Wi-Fi/BT/BLE/Zigbee等无线互联单元&#xff0c;包含多个 CPU 以及音频编码译码器、视频编码译码器和 AI 硬件加速器&#xff0c;适用于各种高性能和低功耗应用领域。 外围接口包括 USB2.0、 Ethernet、 SD/MMC、 …

【python3.8 pre-commit报错】记录pre-commit install报错

一、问题 在执行pre-commit install --allow-missing-config命令时&#xff0c;报错 Traceback (most recent call last):File "C:\ProgramData\Anaconda3\envs\py38\lib\runpy.py", line 192, in _run_module_as_mainreturn _run_code(code, main_globals, None,F…

【Linux】 Linux编译器-gcc/g++使用

&#x1f497;个人主页&#x1f497; ⭐个人专栏——Linux学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读1. Linux编译器-gcc/g使用1.1 引入1.2 初识gcc/g1.3 程序运行的四个阶段1.3.1 预处理1.3.2 编译1.3.3 汇编1.3.4 链接 1.…

Git―基本操作

Git ⛅认识 Git⛅安装 GitCentos(7.6)Ubuntu ⛅Git―基本操作创建本地仓库&#x1f342;配置本地仓库&#x1f342;工作区, 暂存区, 版本库&#x1f342;版本库工作区 添加文件&#x1f342;查看文件&#x1f342;修改文件&#x1f342;版本回退&#x1f342;☃️案例 撤销修改…