主函数

新建浏览器,进行登录,由于验证码的识别准确率不是百分之百,需要多次尝试。

    async def main(self, username, pwd, url):  # 定义main协程函数,

        login_count = 0

        # 打开浏览器
browser = await launch(
{'headless': False, "userDataDir": r"./temp_data", 'args': ['--no-sandbox'], }) # 登录检测
while login_count < 10:
# 登录
await self.login(browser, username, pwd, url) # 检测是否登录成功
if await self.check_login(browser):
break
else:
login_count += 1 # 尝试登录次数大于10就退出
if login_count > 10:
print("login failed!")
await browser.close()
return do_something() await browser.close()

登录函数

可以替换程序中验证操作函数,实现不同的验证方式。
其中提交过程采用了xpath定位提交按钮。

    async def login(self, browser, username, pwd, url):
page = await browser.newPage() # 启动个新的浏览器页面
await page.setUserAgent(
'Mozilla/5.0 (Windows NT 6.1; WOW64) '
'AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/68.0.3440.106 Safari/537.36') await page.goto(url) # 访问登录页面 # 就是在浏览器运行的时候,始终让window.navigator.webdriver=false
# navigator是windiw对象的一个属性,同时修改plugins,languages,navigator 且让
await page.evaluate(
'''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''') # 以下为插入中间js,将淘宝会为了检测浏览器而调用的js修改其结果。
await page.evaluate('''() =>{ window.navigator.chrome = { runtime: {}, }; }''')
await page.evaluate('''() =>{ Object.defineProperty(navigator,
'languages', { get: () => ['en-US', 'en'] }); }''')
await page.evaluate('''() =>{ Object.defineProperty(navigator,
'plugins', { get: () => [1, 2, 3, 4, 5,6], }); }''') time.sleep(2) # 使用type选定页面元素,并修改其数值,用于输入账号密码,修改的速度仿人类操作,因为有个输入速度的检测机制
# 因为 pyppeteer 框架需要转换为js操作,而js和python的类型定义不同,所以写法与参数要用字典,类型导入
await page.type('#username', username, {'delay': self.input_time_random() - 50})
await page.type('#password', pwd, {'delay': self.input_time_random()}) # await page.screenshot({'path': './picture/headless-test-result.png'}) # 截图测试 time.sleep(1) # 验证码操作
verification_code(page); # 点击提交
submit = await page.xpath("//button[@class='auth_login_btn primary full_width']")
await submit[0].click() time.sleep(1)

验证码识别和输入

我在这里利用了某网站的验证码识别api,通过http方式就能上传验证码图片,并获取验证码。这个网站每天有固定的1000张图片免费次数,足够我们使用。第一个请求链接的用户名和密码换成我们注册该网站的用户名和密码即可。具体可以看官方的API文档。
该网站地址:http://fast.95man.com/

    # 验证码登录
async def verification_code(self, page):
await page.waitFor(5 * 1000) # 等待验证码图片加载
yazhengma = await page.waitForSelector('#captchaImg') # 定位验证码元素
await yazhengma.screenshot({'path': './picture/yazhengma.png'}) # 保存验证码图片 # 获取验证码
code = self.get_code('./picture/yazhengma.png') # 输入验证码
await page.type('#captchaResponse', code, {'delay': self.input_time_random()}) def get_code(self, file_path):
# 以下为GET请求
url = 'http://api.95man.com:8888/api/Http/UserTaken?user=username&pwd=password&isref=0'
token_request = requests.get(url)
token_raw = str(token_request.content) # 切片获取token
token = token_raw[4: -1] print(token) # 发送图片解析请求
url = "http://api.95man.com:8888/api/Http/Recog?Taken=" + token + "&imgtype=1&len=4"
file_path = file_path
files = {'file': open(file_path, 'rb')} # 上传图片
r = requests.post(url, files=files)
print(r.url, r.text) # 切片获取验证码
return r.text[6:10]

参考

本文中的验证码像素级保存和获取登录页面时的反反爬操作是参考了别人的博客完成的。

https://www.jianshu.com/p/4dd2737a3048
https://www.jianshu.com/p/a4c4935d5dd7
http://fast.95man.com/auth/quickchk.html

pyppeteer 登录一般网站 并利用 http方法获取登录页面的验证码的更多相关文章

  1. 利用getComputedStyle方法获取元素css的属性值

    在平时的工作中有时候会碰到需要获取元素当前样式的问题,查了一下可以用getComputedStyle这个方法来获取元素计算后的样式(有些我们在css里面没有写的,浏览器默认的样式也可以获得) getC ...

  2. Jquery学习笔记:利用find和children方法获取后代元素

    在很多场景下,需要根据一个已知的jquery对象,去查找其满足条件的后代节点. 这时可以利用 find函数和children来处理. find和children函数都可有一个参数,常见的是一个字符串, ...

  3. 解决微信公众号授权登录和开放平台微信第三方应用授权登录获取到的用户Openid关联问题

    开发背景: 最近一段时间一直在做关于微信方面的网站应用开发,这段时间也收获的不少关于微信开发方面的开发技能,接触的比较多的主要有微信公众号和微信网站app第三方登录授权,以及微信会员卡,优惠券和扫描二 ...

  4. Java分享笔记:使用keySet方法获取Map集合中的元素

    /*--------------------------- Map集合中利用keySet方法获取所有的元素值: ....keySet方法:将Map中的所有key值存入到Set集合中, ....利用Se ...

  5. MVC3控制器方法获取Form数据方法

    http://www.cnblogs.com/bianlan/archive/2013/01/12/2857310.html 控制器方法获取View页面传送的数据有多种方法,以Edit方法为例: 1. ...

  6. 利用SQL注入漏洞登录后台的实现方法

    利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...

  7. Java 爬虫遇到需要登录的网站,该怎么办?

    这是 Java 网络爬虫系列博文的第二篇,在上一篇 Java 网络爬虫,就是这么的简单 中,我们简单的学习了一下如何利用 Java 进行网络爬虫.在这一篇中我们将简单的聊一聊在网络爬虫时,遇到需要登录 ...

  8. 2020.10.20 利用POST请求模拟登录知乎

    前两天学习了Python的requests模块的相关内容,对于用GET和PSOT请求访问网页以抓取需要的内容有了初步的了解,想要再从一些复杂的网站积累些经验.最开始我采用最简单的get(url)方法想 ...

  9. MVC5 网站开发之六 管理员 1、登录、验证和注销

    上次业务逻辑和展示层的架构都写了,可以开始进行具体功能的实现,这次先实现管理员的登录.验证和注销功能. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 MV ...

随机推荐

  1. App与小程序对接

    背景: 商品详情页,点击分享,分享到微信好友,点开链接App拉起小程序. 用户在小程序浏览完成,跳转至原App购买商品. 功能点: 实现APP与小程序互调. 前提: 已对接好友盟ShareSDK(需要 ...

  2. 适用初学者的5种Python数据输入技术

    摘要:数据是数据科学家的基础,因此了解许多加载数据进行分析的方法至关重要.在这里,我们将介绍五种Python数据输入技术,并提供代码示例供您参考. 数据是数据科学家的基础,因此了解许多加载数据进行分析 ...

  3. MiniCat:手写Http服务器

    minicat 项目介绍 已实现http基础协议.参数接受.servlet.filter.cookie.多文件上传等.支持NIO. 一款轻量化Http服务器.支持bio.nio两种模式.归属Coody ...

  4. Elementary OS常见软件(TIM、微信、企业微信)安装(二)

    前言 最终没忍住还是把开发环境迁移到了Elementary OS上来,这其中也没少折腾,试过Ubuntu 20.04 LTS和deepin V20可以(),deepin真的很不错可能是我的电脑兼容性不 ...

  5. phpmyadmin 4.8.1任意文件包含(CVE-2018-12613)

    简介 环境复现:https://gitee.com/xiaohua1998/hctf_2018_warmup 考察知识点:文件包含漏洞(phpmyadmin 4.8.1任意文件包含) 线上平台:榆林学 ...

  6. C#推流RTMP,摄像头、麦克风、桌面、声卡(附源码)

    这段时间一直都在研究推流的技术,经过断断续续将近两个月的摸索实践,终于能稳定地推流了. 这个demo的主要功能就是将采集到的摄像头或桌面的视频.以及麦克风或声卡的音频数据推到Nginx-RTMP服务器 ...

  7. 【VUE】2.渲染组件&重定向路由

    1.删除多余组件,使环境赶紧 1. 整理App.vue, 删除多余内容,在template 模板区域增加一个路由占位符 router-view:渲染路径匹配到的视图组件 <template> ...

  8. vim进入粘贴模式

    最近使用linux的vim编辑器编写程序时,遇到一些繁琐的模板想要复制粘贴进去,直接进入插入模式点复制,复制出来的格式不对没办法运行 解决办法: 这是因为 Vim 自动缩进了,按照如下设置可以解决该问 ...

  9. php数字运算与格式化

    浮点数高精度运算 PHP 官方手册 浮点数的精度有限.尽管取决于系统,PHP 通常使用 IEEE 754 双精度格式,则由于取整而导致的最大相对误差为 1.11e-16.非基本数学运算可能会给出更大误 ...

  10. CSUST 第15届 校赛总结

    一直想记录一下自己的比赛,却感觉空间说说有点不适,思考了一番还是打算放到自己的博客园 这次比赛总体来说还是不错,签到还是稳的一批,基本前四小时都在rk1 开局切了几道签到题,然后开了一道思维gcd,正 ...