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

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

如今不少官网都会给出相应的反扒措施,就拿这个登入来讲,若是你不登入帐号那么你就只能获取微量的信息,甚至获取不了信息,这对咱们爬虫来讲是很是不友好的,可是咱们总不可能每次都须要手动登入吧,一次二次你能接受,大工程呢?既然学了python,而不为用脚本代码帮你作这点事情呢?html

图为简书登入模块:python

 

v2-6eb8c9cae7d72eb1c7fb06f997bb4a10_720w.jpeg

 

不一样方式优缺点对比:git

忽然想到一种可能更简单的方式,因此整理得三,不一样状况参考不一样用法!github

以下:web

 

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

 

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

方式一: requests的auth参数:cookie

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

使用相似场所:

 

v2-20f0f8fa31c322a3d8c5c428ee164e05_720w.jpeg

 

用法很简单,代码以下:

# 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 , 否则看不了会话维持:

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

 

v2-fee7020bac318ea61445f01afeb7ebbe_720w.jpeg

 

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

 

v2-a7232d87fc10c60203d2e6101a652cae_720w.jpeg

 

如图: 只须要爬取这个页面,得到这个参数 那么就能够构造登入的全部参数了, 爬虫代码以下:

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游戏网页作一个实例: 网址

点击登入:

 

v2-2c242207c108a6e325393744a46d2078_720w.jpeg

 

弹出登入表单:

 

v2-284609ddadfb0fe8382f47d7d75c6865_720w.jpeg

 

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

代码以下:

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 模拟登入内容请搜索之前的文章或继续浏览下面的相关文章但愿你们之后多多支持!

相关文章
相关标签/搜索