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 相关文章推荐
Python操作Mysql实例代码教程在线版(查询手册)
Feb 18 Python
python的urllib模块显示下载进度示例
Jan 17 Python
python使用any判断一个对象是否为空的方法
Nov 19 Python
Python机器学习库scikit-learn安装与基本使用教程
Jun 25 Python
Python实现将数据写入netCDF4中的方法示例
Aug 30 Python
如何在Django中设置定时任务的方法示例
Jan 18 Python
Python中按键来获取指定的值
Mar 02 Python
python爬虫selenium和phantomJs使用方法解析
Aug 08 Python
python元组和字典的内建函数实例详解
Oct 22 Python
python使用python-pptx删除ppt某页实例
Feb 14 Python
Python文件读写w+和r+区别解析
Mar 26 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
Apr 08 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 date函数参数详解
2006/11/27 PHP
计算一段日期内的周末天数的php代码(星期六,星期日总和)
2009/11/12 PHP
Codeigniter生成Excel文档的简单方法
2014/06/12 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
2016/04/04 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
JS中 用户登录系统的解决办法
2013/04/15 Javascript
可自己添加html的伪弹出框实现代码
2013/09/08 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
微信公众号 客服接口的开发实例详解
2016/09/28 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
JavaScript设计模式之单例模式详解
2017/06/09 Javascript
JS返回顶部实例代码
2020/08/09 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
在vue中使用G2图表的示例代码
2019/03/19 Javascript
js图数据结构处理 迪杰斯特拉算法代码实例
2019/09/11 Javascript
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
Python入门篇之条件、循环
2014/10/17 Python
python使用socket连接远程服务器的方法
2015/04/29 Python
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
python标识符命名规范原理解析
2020/01/10 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
详解HTML5中的标签
2015/06/19 HTML / CSS
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
环保建议书100字
2014/05/14 职场文书
八荣八耻的活动方案
2014/08/16 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
校园广播稿100字
2014/10/06 职场文书
尼克胡哲观后感
2015/06/08 职场文书
Vue和Flask通信的实现
2021/05/19 Vue.js
python如何将mat文件转为png
2022/07/15 Python