Python模拟登入的N种方式(建议收藏)


Posted in Python onMay 31, 2020

这段时间在研究如何破解官网验证码,然后进行下一步的爬虫操作,然而一个多星期过去了,编写的代码去识别验证码的效率还是很低,尝试用了tesserorc库和百度的API接口,都无济于事,本以为追不上五月的小尾巴,突然想到我尝试了这么多方法何不为一篇破坑博客呢。

现在很多官网都会给出相应的反扒措施,就拿这个登入来说,如果你不登入账号那么你就只能获取微量的信息,甚至获取不了信息,这对我们爬虫来说是非常不友好的,但是我们总不可能每次都需要手动登入吧,一次二次你能接受,大工程呢?既然学了python,而不为用脚本代码帮你做这点事情呢?

图为简书登入模块:

Python模拟登入的N种方式(建议收藏)

不同方式优缺点对比:

突然想到一种可能更简单的方式,所以整理得三,不同情况参考不同用法!

如下:

方式 优点 缺点
requests的auth参数 极简 出现的次数很少
requests的session会话 维持cookies一致 需要构造一定参数
selenium自动化 最强的模拟登入 安装复杂,库名太多

以上就是三大登入的优缺点,个人推荐使用session去尝试模拟登入!

方式一: requests的auth参数:

这个是我无意在书上看到的。关于requests的高级用法中,提到了这点,这里就记录一下,个人觉得这种方式只可能出现在某网站中,学了也挺好的,省的限制观看次数,后续我也会更新如何破解vip视频的思路,有需要的关注我

使用类似场所:

Python模拟登入的N种方式(建议收藏)

用法很简单,代码如下:

# parasm: url : 网站
# parasm: username: 用户名
# parasm: password : 密码
import requests
url = '********'
r = requests.get(url, anth=('username', 'password'))
print(r.text)

还是一句话,这种方式极大可能出现在某网站中,其他情况基本不可能出现,那么就得使用下面二种方式了。

方式一: requests高级用法扩展:

相信很多人看书都不看全的,很多细节都在书中呢,下面扩展几种requests库的高级用法,很好用的东西。

超时处理: 某网站服务器搭建在国外,加载巨慢。代码可能抛出timeout : xxxx等情况,这个时候用它:

r = requests.get(url , timeout=30)

文件上传: 假如某网站需要上传文件,那么就使用它:

files = {'file': open('img.jpg', 'rb')}
r = requests.get(url, files=files)
print(r.text)

cookies设置: headers这个很多人都使用过吧,基本都是加一个代理头就完事了,其实也可以设置其他的参数,然后使用post请求,就可以简单的模拟登入一次了,用法如下:

这些字段一般都需要加上,常用的就是代理头user-agent,这个必须设置:

headers = {
'cookies': '浏览器复制',
'Host': '浏览器复制', 
'Referer' '浏览器复制'
'User-Agent': '浏览器复制'
}

方式二: requests的session会话使用:

会话是什么: 就好比你和朋友对接电话,你这头是客户端,朋友那头是服务端,你们接通电话,这个通话记录就代表一个会话,电话中,你可以通过声音知道是你朋友,在服务器中,你请求成功一次,客户端和服务端就维持了一个会话,这个会话能代表你的身份,那么这段时间在一个浏览器中,你进入网站就不需要在输入账号密码了,直到你退出浏览器,那么会话截至,下次登入就需要再次输入密码了。

很好的是,Session能很好的帮助我们维持会话,从而达到cookies的一致性。区别于一半的请求requests,就可以达到get 和 post 共同的作用;

基本用法如下:

s = requests.Session()
r = s.get(url)

那么我们使用会话从GitHub的模拟登入尝试下:

首先我们需要登入一次,看看需要构建什么参数:
登入网站

在这个界面就开启f12 , 不然看不了会话维持:

登入成功之后,如下图,查看构造参数:

Python模拟登入的N种方式(建议收藏)

打开这个From Data 会发现,authenticity_token 这个字段,我们可能构造不了,这个时候,就得回到 登入界面了, 打开源代码。F这个字段:

Python模拟登入的N种方式(建议收藏)

如图: 只需要爬取这个页面,获得这个参数 那么就可以构造登入的所有参数了, 爬虫代码如下:

def token(self):
    # 获得 authenticity_token 字段 方便下次模拟登入
		# login_url : 登入网址
    r = self.session.get(self.login_url, headers=self.headers)
    if r.status_code == 200:
      r.encoding = r.apparent_encoding
      html = etree.HTML(r.text)
      html = etree.tostring(html)
      html = etree.fromstring(html)
      tk = html.xpath('//*[@id="login"]/form/input[1]/@value')
      return tk

对于cookies的一致性,使用session 就已经搞定了这个问题,根据上图的Name字段中的session ,
我们可以找到会话网址: ‘https://github.com/session'

所以我们现在只需要构造一个函数去请求这个会话网址,就可以达到我们的要求了:

代码如下, 这里我构造了一个class类,账号密码用自己,或者前面传值过去,图中的函数是二个爬虫代码,可以根据需求设计:

def login(self):
    # 模拟登入
    post_date = {
      'commit': 'Sign in',
      'authenticity_token': self.token(),
      'ga_id': '1453216517.1584352055',
      'login': self.email,
      'password': self.password
    }

    # 打印仓库信息
    r = self.session.post(self.post_url, data=post_date, headers=self.headers)
    if r.status_code == 200:
      self.get_info_1(r.text)

    # 打印个人信息和邮箱
    r = self.session.get(self.logined_url, headers=self.headers)
    if r.status_code == 200:
      self.get_info_2(r.text)

会话登入到这里就结束了,主要是构造参数挺麻烦的,需要页面里寻找,看到这里给个关注和赞啦。

方式三: selenium模拟登入:

如何下载selenium相关的插件,我就不做介绍了,篇幅有限

使用selenium 就是需要考虑到表单的切换,和定位元素等,其他都很简单,这里用4399游戏网页做一个实例: 网址

点击登入:

Python模拟登入的N种方式(建议收藏)

弹出登入表单:

Python模拟登入的N种方式(建议收藏)

这里我们需要切换表单,不然输入不了,怎么找到这个表单的,很简单,整块的高亮就行:

代码如下:

from selenium import webdriver # 导入库
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Chrome() # 声明浏览器
browser.implicitly_wait(30) # 隐性等待 在规定的时间内,最长等待S秒
browser.get('http://www.4399.com') # 打开设置的网址
# ID定位 或者其他的都行
browser.find_element_by_id('login_tologin').click() # 点击登入界面
browser.switch_to.frame("popup_login_frame") # 进入表单中
browser.find_element_by_css_selector('#username').clear()
browser.find_element_by_id('username').send_keys('账号')
browser.find_element_by_id('username').send_keys(Keys.TAB)
browser.find_element_by_id('j-password').send_keys('密码')
browser.find_element_by_id('j-password').send_keys(Keys.ENTER)

我给的例子没有涉及到验证码,如果涉及到验证码,要不人工输入,要么破解验证码,或者交给打码平台,最好的方式就是绕过验证码,这个我也在思考如何去实现。以上就是这周的知识总结,有帮助的话,就点个赞和关注吧!

到此这篇关于Python模拟登入的N种方式的文章就介绍到这了,更多相关Python 模拟登入内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
举例讲解Linux系统下Python调用系统Shell的方法
Nov 07 Python
Python3中使用PyMongo的方法详解
Jul 28 Python
Python字典,函数,全局变量代码解析
Dec 18 Python
在Python中使用gRPC的方法示例
Aug 08 Python
Django框架的中的setting.py文件说明详解
Oct 15 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
Sep 06 Python
利用python实现AR教程
Nov 20 Python
Python threading.local代码实例及原理解析
Mar 16 Python
Python‘==‘ 及 ‘is‘相关原理解析
Sep 05 Python
Python中常用的os操作汇总
Nov 05 Python
python 检测nginx服务邮件报警的脚本
Dec 31 Python
python爬虫爬取某网站视频的示例代码
Feb 20 Python
Python多线程正确用法实例解析
May 30 #Python
PyQt5实现简单的计算器
May 30 #Python
PyQt5实现登录页面
May 30 #Python
Python网页解析器使用实例详解
May 30 #Python
PyQt5实现画布小程序
May 30 #Python
Java ExcutorService优雅关闭方式解析
May 30 #Python
Python定时任务APScheduler原理及实例解析
May 30 #Python
You might like
PHP 可阅读随机字符串代码
2010/05/26 PHP
如何获知PHP程序占用多少内存(memory_get_usage)
2012/09/23 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
nodejs中使用多线程编程的方法实例
2015/03/24 NodeJs
JQuery标签页效果的两个实例讲解(4)
2015/09/17 Javascript
AngularJS ngModel实现指令与输入直接的数据通信
2016/09/21 Javascript
JS前端笔试题分析
2016/12/19 Javascript
Node+Express+MongoDB实现登录注册功能实例
2017/04/23 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
详解10分钟学会vue滚动行为
2017/09/21 Javascript
极简主义法编写JavaScript类
2017/11/02 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
vue-cli3自动消除console.log()的调试信息方式
2020/10/21 Javascript
[03:40]DOTA2亚洲邀请赛小组赛第二日 赛事回顾
2015/01/31 DOTA
高质量Python代码编写的5个优化技巧
2017/11/16 Python
Python输入二维数组方法
2018/04/13 Python
Python爬虫实现爬取百度百科词条功能实例
2019/04/05 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
django框架基于queryset和双下划线的跨表查询操作详解
2019/12/11 Python
python3连接mysql获取ansible动态inventory脚本
2020/01/19 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
Python如何操作docker redis过程解析
2020/08/10 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
华丽的手绘陶瓷:MacKenzie-Childs
2017/02/04 全球购物
白酒业务员岗位职责
2013/12/27 职场文书
青春无悔演讲稿
2014/05/08 职场文书
管理标语大全
2014/06/24 职场文书
会计工作态度自我评价
2015/03/06 职场文书
主持人开场白台词
2015/05/29 职场文书
2016年班主任培训心得体会
2016/01/07 职场文书
公司年会主持词范文!
2019/05/07 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python
使用springMVC所需要的pom配置
2021/09/15 Java/Android