前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python模拟登录的几种方法

Python模拟登录的几种方法

作者头像
菲宇
发布2019-06-13 11:56:23
3.6K0
发布2019-06-13 11:56:23
举报
文章被收录于专栏:菲宇菲宇

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

特点:

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

原理:

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

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

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

具体步骤:

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

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

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

2.写代码

  urllib库的版本:

代码语言:javascript
复制
import sys
import io
from urllib import request

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码

#登录后才能访问的网站
url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'

#浏览器登录后得到的cookie,也就是刚才复制的字符串
cookie_str = r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxx; iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxx'

#登录后才能访问的网页
url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'

req = request.Request(url)
#设置cookie
req.add_header('cookie', raw_cookies)
#设置请求头
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36')

resp = request.urlopen(req)

print(resp.read().decode('utf-8'))

  requests库的版本:

代码语言:javascript
复制
import requests
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码

#登录后才能访问的网页
url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'

#浏览器登录后得到的cookie,也就是刚才复制的字符串
cookie_str = r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxx; iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxx'

#把cookie字符串处理成字典,以便接下来使用
cookies = {}
for line in cookie_str.split(';'):
    key, value = line.split('=', 1)
    cookies[key] = value

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

原理:

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

具体步骤:

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

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

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

2.找出要提交的数据

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

3.写代码

  urllib库的版本:

代码语言:javascript
复制
import sys
import io
import urllib.request
import http.cookiejar

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码

#登录时需要POST的数据
data = {'Login.Token1':'学号', 
        'Login.Token2':'密码', 
        'goto:http':'//ssfw.xmu.edu.cn/cmstar/loginSuccess.portal', 
        'gotoOnFail:http':'//ssfw.xmu.edu.cn/cmstar/loginFailure.portal'}
post_data = urllib.parse.urlencode(data).encode('utf-8')

#设置请求头
headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}

#登录时表单提交到的地址(用开发者工具可以看到)
login_url = ' http://ssfw.xmu.edu.cn/cmstar/userPasswordValidate.portal

#构造登录请求
req = urllib.request.Request(login_url, headers = headers, data = post_data)

#构造cookie
cookie = http.cookiejar.CookieJar()

#由cookie构造opener
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie))

#发送登录请求,此后这个opener就携带了cookie,以证明自己登录过
resp = opener.open(req)

#登录后才能访问的网页
url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'

#构造访问请求
req = urllib.request.Request(url, headers = headers)

resp = opener.open(req)

print(resp.read().decode('utf-8'))

  requests库的版本:

代码语言:javascript
复制
import requests
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码

#登录后才能访问的网页
url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'

#浏览器登录后得到的cookie,也就是刚才复制的字符串
cookie_str = r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxx; iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxx'

#把cookie字符串处理成字典,以便接下来使用
cookies = {}
for line in cookie_str.split(';'):
    key, value = line.split('=', 1)
    cookies[key] = value

#设置请求头
headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}

#在发送get请求时带上请求头和cookies
resp = requests.get(url, headers = headers, cookies = cookies)
        
print(resp.content.decode('utf-8'))

  明显感觉requests库用着更方便啊~~~

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

原理:

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

具体步骤:

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

2.找出要提交的数据

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

3.写代码

  requests库的版本

代码语言:javascript
复制
import requests
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') #改变标准输出的默认编码

#登录时需要POST的数据
data = {'Login.Token1':'学号', 
        'Login.Token2':'密码', 
        'goto:http':'//ssfw.xmu.edu.cn/cmstar/loginSuccess.portal', 
        'gotoOnFail:http':'//ssfw.xmu.edu.cn/cmstar/loginFailure.portal'}

#设置请求头
headers = {'User-agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}

#登录时表单提交到的地址(用开发者工具可以看到)
login_url = 'http://ssfw.xmu.edu.cn/cmstar/userPasswordValidate.portal'

#构造Session
session = requests.Session()

#在session中发送登录请求,此后这个session里就存储了cookie
#可以用print(session.cookies.get_dict())查看
resp = session.post(login_url, data)

#登录后才能访问的网页
url = 'http://ssfw.xmu.edu.cn/cmstar/index.portal'

#发送访问请求
resp = session.get(url)

print(resp.content.decode('utf-8'))

方法四:使用无头浏览器访问

特点:

  功能强大,几乎可以对付任何网页,但会导致代码效率低

原理:

  如果能在程序里调用一个浏览器来访问网站,那么像登录这样的操作就轻而易举了。在Python中可以使用Selenium库来调用浏览器,写在代码里的操作(打开网页、点击……)会变成浏览器忠实地执行。这个被控制的浏览器可以是Firefox,Chrome等,但最常用的还是PhantomJS这个无头(没有界面)浏览器。也就是说,只要把填写用户名密码、点击“登录”按钮、打开另一个网页等操作写到程序中,PhamtomJS就能确确实实地让你登录上去,并把响应返回给你。

具体步骤:

1.安装selenium库、PhantomJS浏览器

2.在源代码中找到登录时的输入文本框、按钮这些元素

  因为要在无头浏览器中进行操作,所以就要先找到输入框,才能输入信息。找到登录按钮,才能点击它。

  在浏览器中打开填写用户名密码的页面,将光标移动到输入用户名的文本框,右键,选择“审查元素”,就可以在右边的网页源代码中看到文本框是哪个元素。同理,可以在源代码中找到输入密码的文本框、登录按钮。

3.考虑如何在程序中找到上述元素

  Selenium库提供了find_element(s)_by_xxx的方法来找到网页中的输入框、按钮等元素。其中xxx可以是id、name、tag_name(标签名)、class_name(class),也可以是xpath(xpath表达式)等等。当然还是要具体分析网页源代码。

4.写代码

代码语言:javascript
复制
import requests
import sys
import io
from selenium import webdriver

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8') #改变标准输出的默认编码

#建立Phantomjs浏览器对象,括号里是phantomjs.exe在你的电脑上的路径
browser = webdriver.PhantomJS('d:/tool/07-net/phantomjs-windows/phantomjs-2.1.1-windows/bin/phantomjs.exe')

#登录页面
url = r'http://ssfw.xmu.edu.cn/cmstar/index.portal'

# 访问登录页面
browser.get(url)

# 等待一定时间,让js脚本加载完毕
browser.implicitly_wait(3)

#输入用户名
username = browser.find_element_by_name('user')
username.send_keys('学号')

#输入密码
password = browser.find_element_by_name('pwd')
password.send_keys('密码')

#选择“学生”单选按钮
student = browser.find_element_by_xpath('//input[@value="student"]')
student.click()

#点击“登录”按钮
login_button = browser.find_element_by_name('btn')
login_button.submit()

#网页截图
browser.save_screenshot('picture1.png')
#打印网页源代码
print(browser.page_source.encode('utf-8').decode())

browser.quit()

方法五:urllib2模拟自动登录网站

不登录打开网页:

  1. import urllib2
  2. request = urllib2.Request('http://www.baidu.com')
  3. response = urllib2.urlopen(request).read()
  4. print response

保存网页图片(https://www.baidu.com/img/bd_logo1.png):

  1. picurl = 'https://www.baidu.com/img/bd_logo1.png' #定义图片的url地址
  2. req = urllib2.Request(picurl)
  3. data = urllib2.urlopen(req).read()
  4. file=open('d:\\zaa.jpg','wb') #将图片保存为名为zaa.jpg的图片
  5. file.write(data)
  6. file.flush()
  7. file.close()

模拟自动登录zabbix:

  1. import urllib2,cookielib,urllib
  2. #定义登录地址
  3. login_url = 'http://10.16.2.4/zabbix/index.php'
  4. #定义登录所需要用的信息,如用户名、密码等,详见下图,使用urllib进行编码
  5. login_data = urllib.urlencode({
  6. "name": 'admin',
  7. "password": 'password',
  8. "autologin": 1,
  9. "enter": "Sign in"})
  10. #设置一个cookie处理器,它负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie
  11. cj = cookielib.CookieJar() #获取Cookiejar对象(存在本机的cookie消息)
  12. opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) #自定义opener,并将opener跟CookieJar对象绑定
  13. urllib2.install_opener(opener) #安装opener,此后调用urlopen()时都会使用安装过的opener对象
  14. response=opener.open(login_url,login_data).read() #访问登录页,自动带着cookie信息
  15. print response #返回登陆后的页面源代码

zabbix登录页面内容:

有的页面登录时会post到其他页面,查看登录页面的form中的action地址,可能需要构造header头信息:

代码语言:javascript
复制
  1. #发送头信息
  2. headers = {
  3. 'Referer':'http://10.16.2.4/zabbix/index.php',
  4. 'Host':'10.16.2.4', #可以不要,一般两项就可以
  5. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko'
  6. }
  7. #定义登录地址
  8. login_url = 'http://10.16.2.4/zabbix/index.php'
  9. #定义登录所需要用的信息,如用户名、密码等,使用urllib进行编码
  10. login_data = urllib.urlencode({
  11. "name": 'admin',
  12. "password": 'password',
  13. "autologin": 1,
  14. "enter": "Sign in"})
  15. #设置一个cookie处理器,它负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie
  16. cj = cookielib.CookieJar() #获取Cookiejar对象(存在本机的cookie消息)
  17. opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) #自定义opener,并将opener跟CookieJar对象绑定
  18. urllib2.install_opener(opener) #安装opener,此后调用urlopen()时都会使用安装过的opener对象
  19. urllib2.urlopen(login_url)#打开登录主页面(他的目的是从页面下载cookie,这样我们在再送post数据时就有cookie了,否则发送不成功)
  20. #通过urllib2提供的request方法来向指定Url发送我们构造的数据,并完成登录过程
  21. req=urllib2.Request(post_url,login_data,headers) #post_url需要在请求过程中自己得出
  22. response=urllib2.urlopen(req)
  23. print response.read()
  24. response.close()

在ie中手动登录后,可以看到相应的header头信息,如下:

模拟登录piao.x.com(先使用chrome抓包,输入一个错误的账号密码)

  1. import urllib,urllib2,cookielib
  2. username='name'
  3. password='pass'
  4. loginurl='http://piao.x.com/loginHandler.ashx' #此为在登录过程中post到的页面
  5. cj = cookielib.CookieJar()
  6. opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
  7. headers={
  8. 'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.8.1000 Chrome/30.0.1599.101 Safari/537.36',
  9. 'Referer':'http://piao.x.com/login/login',
  10. 'Content-Type':'text/html'
  11. }
  12. for key in headers: #增加多个header
  13. opener.addheaders.append((key,headers[key]))
  14. data = urllib.urlencode({"username":username,"password":password}) #使用google可以看到此处的用户密码为明文发送,格式为username=username&password=password,如下图所示。
  15. opener.open(loginurl,data)
  16. print opener.open('http://piao.x.com/#dGlja2V0').read() #登录成功后可以打开其他页面。

Form Data部分为需要Post到Server的参数,piao登录需要Post的参数是2个,zabbix登录需要Post的参数是4个 。

piao login:

zabbix login:

如上图所示,查看Respons Headers部分,可以看到其中的Set-Cookie,该cookie可以在后面的站内访问使用,使用urllib2也可以看到该部分内容:

代码语言:javascript
复制
  1. import cookielib,urllib,urllib2
  2. zabbix_url="http://10.16.2.4/zabbix/index.php"
  3. zabbix_header = {"Content-Type":"application/json"}
  4. zabbix_user = "admin"
  5. zabbix_pass = "password"
  6. cj = cookielib.CookieJar()
  7. opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
  8. data = urllib.urlencode({"name":zabbix_user,"password":zabbix_pass,'form_refresh':1,'enter':'Sign in'})
  9. response = opener.open(zabbix_url,data)
  10. print response.headers #打印Server 的response header头部分内容:
  11. 返回:
  12. Date: Wed, 25 May 2016 08:07:17 GMT
  13. Server: Apache/2.4.6 (CentOS) PHP/5.4.16
  14. X-Powered-By: PHP/5.4.16
  15. Set-Cookie: zbx_sessionid=bbc97766e8c132a56f2d016a6963219a
  16. Set-Cookie: PHPSESSID=v8sno86fnc19iqgltipae0l2d2; path=/zabbix/
  17. Expires: Thu, 19 Nov 1981 08:52:00 GMT
  18. Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
  19. Pragma: no-cache
  20. Set-Cookie: PHPSESSID=v8sno86fnc19iqgltipae0l2d2; path=/zabbix/
  21. Set-Cookie: PHPSESSID=v8sno86fnc19iqgltipae0l2d2; path=/zabbix/
  22. Set-Cookie: PHPSESSID=v8sno86fnc19iqgltipae0l2d2; path=/zabbix/
  23. Connection: close
  24. Transfer-Encoding: chunked
  25. Content-Type: text/html; charset=UTF-8

在urllib2中不再使用用户名密码,直接使用上面得到的cookie访问站内页面:

代码语言:javascript
复制
  1. import cookielib,urllib,urllib2
  2. zabbix_url="http://10.16.2.4/zabbix/index.php"
  3. zabbix_header = {"Content-Type":"application/json"}
  4. cj = cookielib.CookieJar()
  5. opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
  6. zabbix_header = {'cookie':'zbx_sessionid=bbc97766e8c132a56f2d016a6963219a'} #使用前面得到的cookie
  7. for key in zabbix_header: #增加多个header,把cookie放到header中,访问server时使用该cookie
  8. opener.addheaders.append((key,zabbix_header[key]))
  9. print opener.open('http://10.16.2.4/zabbix/tr_status.php?fullscreen=0&groupid=0&hostid=0&show_triggers=1&ack_status=1&show_events=1&show_severity=0&txt_select=&application=&inventory%5B0%5D%5Bfield%5D=type&inventory%5B0%5D%5Bvalue%5D=&filter_set=Filter').read() #该页面可以直接访问,不再需要使用用户名密码等信息。

参考:http://www.cnblogs.com/sysu-blackbear/p/3629770.html 保存cookie到本地文件

   http://www.2cto.com/kf/201401/275152.html 详细,带有http具体访问过程

   http://www.jb51.net/article/63759.htm 简明

   http://www.blogjava.net/hongqiang/archive/2012/08/01/384552.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年05月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方法一:直接使用已知的cookie访问
  • 特点:
  • 原理:
  • 具体步骤:
  • 方法二:模拟登录后再携带得到的cookie访问
    • 原理:
      • 具体步骤:
      • 方法三:模拟登录后用session保持登录状态
        • 原理:
          • 具体步骤:
          • 方法四:使用无头浏览器访问
            • 特点:
              • 原理:
                • 具体步骤:
                • 方法五:urllib2模拟自动登录网站
                相关产品与服务
                云开发 CLI 工具
                云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档