Python 模拟登录几种常见方法

Posted Sudo高

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 模拟登录几种常见方法相关的知识,希望对你有一定的参考价值。

方法一:直接使用已知的cookie访问

 

优点:

  简单,但需要先在浏览器登录

原理:

  简单地说,cookie保存在发起请求的客户端中,服务器利用cookie来区分不同的客户端。因为http是一种无状态的连接,当服务器一下子收到好几个请求时,是无法判断出哪些请求是同一个客户端发起的。而“访问登录后才能看到的页面”这一行为,恰恰需要客户端向服务器证明:“我是刚才登录过的那个客户端”。于是就需要cookie来标识客户端的身份,以存储它的信息(如登录状态)。

  当然,这也意味着,只要得到了别的客户端的cookie,我们就可以假冒成它来和服务器对话。这给我们的程序带来了可乘之机。

  我们先用浏览器登录,然后使用开发者工具查看cookie。接着在程序中携带该cookie向网站发送请求,就能让你的程序假扮成刚才登录的那个浏览器,得到只有登录后才能看到的页面。

具体步骤:

1.用浏览器登录,获取浏览器里的cookie字符串

  先使用浏览器登录。再打开开发者工具,转到network选项卡。在左边的Name一栏找到当前的网址,选择右边的Headers选项卡,查看Request Headers,这里包含了该网站颁发给浏览器的cookie。对,就是后面的字符串。把它复制下来,一会儿代码里要用到。

  注意,最好是在运行你的程序前再登录。如果太早登录,或是把浏览器关了,很可能复制的那个cookie就过期无效了。

 

 

 

 

2 贴代码

  这边直接使用requests 库来进行请求    urllib库的版本 太繁琐  代码写的也多

"""
直接获取 个人中心的页面
手动粘贴 辅助 pc 抓包的 cookies
放在 request对象的请求头里面
"""

import  requests

#1 数据url
url = "http://www.juming.com"

# 这里是从 浏览器复制过来的 cookiestr = \'pgv_pvi=3062528000; _;=; =1579855336,1580038094,,1582021806; IESESSION=alive; pgv_si=s7468463104; ASPSESSIONIDQSTAQSCD=NKOGKGPBDCLNOOGIGFADHCNP; ASPSESSIONIDSQSATRCD=PHDHCNDCBHEFKINKPOFBDHEF; ASPSESSIONIDQQSARSDC=KOIIFBJCHHCLKPMKPNCEJHOI; ASPSESSIONIDSSRARSDD=HOFGFPJCFGBDDOJBOGNOGCPL; Hm_lvt_512ed551fae9428abd7d743009588c7a=1580038094,1581251646,1582021806; ASPSESSIONIDSSQCRSCD=JLDCMFOCJBJHNDIFJEEFBHDL; _qddab=3-qwql4k.k6u9ijsq; ASPSESSIONIDQSSATQDC=BKNFMPADENCCEEFACHFGEALB; ASPSESSIONIDQSSAQSCD=KIDLMNBDAHIGKPNLJIMMGGFG;\' agent = \'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36\' #2 添加请求头 headers = { "User-Agent":agent, } #把cookie字符串处理成字典,以便接下来使用 cookies = {} for line in cookiestr.split(\';\'): key, value = line.split(\'=\', 1) cookies[key] = value s=requests.session() rs=s.get(url,headers=headers,cookies =cookies, verify=False) #5 读取数据 rs.encoding=\'gbk\' # 把数据存到文本里 f=open("01cook.html","w",encoding=\'gbk\') f.write(rs.text) f.close()

 

方法二:模拟登录后再携带得到的cookie访问

原理:

  我们先在程序中向网站发出登录请求,也就是提交包含登录信息的表单(用户名、密码等)。从响应中得到cookie,今后在访问其他页面时也带上这个cookie,就能得到只有登录后才能看到的页面。

具体步骤:

1.找出表单提交到的页面

  还是要利用浏览器的开发者工具。转到network选项卡,并勾选Preserve Log(重要!)。在浏览器里登录网站。然后在左边的Name一栏找到表单提交到的页面。怎么找呢?看看右侧,转到Headers选项卡。首先,在General那段,Request Method应当是POST。其次最下方应该要有一段叫做Form Data的,里面可以看到你刚才输入的用户名和密码等。也可以看看左边的Name,如果含有login这个词,有可能就是提交表单的页面(不一定!)。

 

 

 

  这里要强调一点,“表单提交到的页面”通常并不是你填写用户名和密码的页面!所以要利用工具来找到它。

 

2.找出要提交的数据

  虽然你在浏览器里登陆时只填了用户名和密码,但表单里包含的数据可不只这些。从Form Data里就可以看到需要提交的所有数据。

 

 

3.写代码

 

from urllib import parse   #转译
import requests

 # 1.1 登录的网址
login_url = "https://www.jinmi.com/Login/index"


#1.2 登录的参数
login_form_data = {
    "userKey": "xxx",
    "password": "xxxx",
}

agent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3650.400 QQBrowser/10.4.3341.400";

#带着参数 发送post请求
#添加请求头
headers = {
    "User-Agent": agent
}

#1 参数 将来 需要转译 转码; 2 post 请求的 data 要求是bytes
login_str = parse.urlencode(login_form_data).encode(\'utf-8\')

## 构建请求对象
response = requests.post(login_url,login_form_data,headers = headers)

## 获得访问 cookie
cookies = response.cookies

setting_url = "https://www.jinmi.com/User/index"

# 这边直接访问会员中心
rs = requests.get(setting_url, headers=headers, cookies=cookies)


#5 读取数据
rs.encoding=\'utf-8\'

# 把数据存到文本里
f=open("03cook.html","w",encoding=\'utf-8\')
f.write(rs.text)
f.close()

方法三:模拟登录后用session保持登录状态

原理:

  session是会话的意思。和cookie的相似之处在于,它也可以让服务器“认得”客户端。简单理解就是,把每一个客户端和服务器的互动当作一个“会话”。既然在同一个“会话”里,服务器自然就能知道这个客户端是否登录过。

具体步骤:

1.找出表单提交到的页面

2.找出要提交的数据

  这两步和方法二的前两步是一样的

3.写代码

 

# 1。定义请求参数
login_url = "https://www.jinmi.com/Login/index"

headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36",
}
# 1.2 登录的参数
data = {
"userKey": "wwww",
"password": "wwwww",
}

# 构造Session
session = requests.session()

# 在session中发送登录请求,此后这个session里就存储了cookie
session.post(login_url, data, headers=headers)

### 打印session   这边可以直接存贮起来
#print(session.cookies.get_dict())

# 登录后才能访问的网页
setting_url = "https://www.jinmi.com/User/index"
rs = session.get(setting_url, headers=headers)

# 这样的方式也可以访问
#rs = requests.get(setting_url, headers=headers, cookies=session.cookies)

# 把数据存到文本里
f = open("04cook.html", "w", encoding=\'utf-8\')
f.write(rs.text)
f.close()

 

 

 

 还有很多方式 后续 我在更新 这些都是简单的 直接登录就行的 有复杂的 各种 js 加密 具体还需要自行实践

以上是关于Python 模拟登录几种常见方法的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫定时计划任务的几种常见方法

单片机ADC常见的几种滤波方法

Python中执行系统命令常见的几种方法--转载

定向爬虫 - Python模拟新浪微博登录

Laravel:如何在控制器的几种方法中重用代码片段

String类——Java中常见的类(模拟登录案例练习)