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的Tkinter实现一个简易计算器
Dec 31 Python
Python3使用requests发闪存的方法
May 11 Python
pycharm远程调试openstack的图文教程
Nov 21 Python
python中将一个全部为int的list 转化为str的list方法
Apr 09 Python
pycharm: 恢复(reset) 误删文件的方法
Oct 22 Python
python 多个参数不为空校验方法
Feb 14 Python
python os.fork() 循环输出方法
Aug 08 Python
如何使用python进行pdf文件分割
Nov 11 Python
使用NumPy读取MNIST数据的实现代码示例
Nov 20 Python
pd.DataFrame统计各列数值多少的实例
Dec 05 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
基于Python执行dos命令并获取输出的结果
Dec 30 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实现的简单日志写入函数
2015/03/31 PHP
javascript 支持链式调用的异步调用框架Async.Operation
2009/08/04 Javascript
javascript jscroll模拟html元素滚动条
2012/12/18 Javascript
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
将list转换为json失败的原因
2013/12/17 Javascript
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
2016/04/01 Javascript
深入理解jQuery之事件移除
2016/06/02 Javascript
利用jquery禁止外层滚动条的滚动
2017/01/05 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
JavaScript错误处理和堆栈追踪详解
2017/04/18 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
2017/07/04 Javascript
php main 与 iframe 相互通讯类(js+php同域/跨域)
2017/09/14 Javascript
vue中动态绑定表单元素的属性方法
2018/02/23 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
javascript实现贪吃蛇小练习
2020/07/05 Javascript
Antd中单个DatePicker限定时间输入范围操作
2020/10/29 Javascript
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
Python3实现从指定路径查找文件的方法
2015/05/22 Python
python实现ping的方法
2015/07/06 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
2018/01/15 Python
详解Python中的正则表达式
2018/07/08 Python
python数值基础知识浅析
2019/11/19 Python
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
预备党员个人总结
2015/02/14 职场文书
高中家长意见怎么写
2015/06/03 职场文书
详解Oracle块修改跟踪功能
2021/11/07 Oracle