Python模拟登录的多种方法(四种)

这篇文章主要介绍了Python模拟登录的多种方法,大概给大家提供了四种方法,每种方法给大家介绍的都很详细,感兴趣的朋友跟随脚本之家小编一起看看吧

目录

  • 方法一:直接使用已知的cookie访问
  • 方法二:模拟登录后再携带得到的cookie4 9 , t访问
  • 方法三:模拟登录后用session保持登录T ? |状态
  • 方法D ` F ~ c ] g四:使0 V e i ( * 4用无头浏览器访问

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

特点:

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

原理:

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

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

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

具体步骤:

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

先使用浏览器登录。再打开开发者工具,转到network选项7 & ~ 0 / l { - M卡。在左T n e ~ 5边的Name一栏找到当前的网址,选择右边的HeadeZ / x ( ; jrs选项卡,查看Request Headers,这里包含了该网站颁发给浏览器的cookie。对,就是后面的字符串。把它复制下来,一会儿代码里要用到。

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

Python模拟登录的多种方法(四种)

2.写代码

urllib库的版本:

import sys

import io

f( = 6 [ O t R -rF , ( ` H | p d 7om urllib import request

sys.stdoutn + B = io.Tee g : h 5xtIOWrapper(sys.stdout.buffer,encoding=\'utf8\') #改变标准输出的默认编码

#登录后才能访问的网站

url = \'http:/H ! - = * ` x 2/ssfw.xmu.edu.cn/cmstar/inden p M z V / 9 :x.portal\'

#浏览器登录后得到的cookie,也就是刚才复制的字符串

cookie_str = r\'JSESSIONID=xxxxxxx{ I X 2 = S * g Exxxxxxxx= V { Cxxxxxxx; iPlanetDirectoryPro=xxxxxxxxxxxxxxxxm 8 , s I # Yxx\'

#登录后才能访问的网页

url = \'http://ssfw.xmu.edY _ 9 Q m | h i `u.cn/cmstar/index.portal\'

req = request.Request(url)

#设置cookie

req.add_header(\'cookie\', raw_cookies)

#设置请求头

r` { 4 ` [ K b * Keq.add_header(\'User-Agent\', \'Mozilla/5.0 (Win/ I 6 A * # J ,dows 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(\'uS Y . H & t O ?tf-8, : 3 ] ! + } M\'))

requests库的版本:

import requests

importD X _ @ p T p w sys

import io

sys.stdout = io.TextIOWrapper(sysk p R ) * E ] 2.stdouth ? b [ I O G.buffer,enco8 ! g Hding=\'utf8\') #改变标准输出的默认编码

#登录后才能访问的网页

url =1 e 1 l D w W \'http://ssfw.xmu.edu.cn/cmstar/index[ / R S H - { o.portal\w D @ O J q'

#浏览器登录后得到的cookie,也就是刚才复制的字符串

cookie_str = r\'JSESSIONIC f ,D=xxxxxxxxxxxxxxxxxxxxxx; iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxx\'

#把cookie字符串处理成字典,以便接下来使用

cookies = {}

for line in cookie_str.split( n u\';\'):

key, value = line.splir V B [t(\'=\', 1)

cookies[key] = value

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

原理:

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

具体步骤:

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

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

Python模拟登录的多种方法(四种)

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

2.找出要提交的数据

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

Python模拟登录的多种方法(四种)

3.写代码

urllib库的版本:

impoF a = ) +rt sys

import io

import urllib.request

impJ q r qort http.cookiejar

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

#登录时需要POST的数据

data = {\'Login.Token1\':\'学号\',

\'Login.TokK w A . Q p Uen2\':\'密码\',

\'` f x b t w 7 ( Sgoto:http\':\'//ssfw.xmu.edu.cn/cmstar/loginSuccess.portal\',

\'gotoOnFail:http\':\% N F F p - 2 i 5'//ssfw.xmu.edu.cn/cmstar/loginFailure.portal\'}

post_data = urllib.parse.urlencode(dak t 9 ]ta).encode(\'utf-8\')

#设置请求头

header: 2 X o m ( s = {\'User-agent\':\= 4 ='Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Ge= i * wcko) Chrome/Q j B - C ; #60.0.3112.113 Safari/537.36\'}

#登录时表单提交到的地址(用开发者工具可以看到)

login_url = \' http://ssfw.xmu.edu.cn/cmstar/userPasswordValidate.portal

#构造登录请求

req = urllib.request.Request(loI ! 5gin_url, headers = headers, data = post_data)

#构造cookie

cookie = http.coX $ o d n y v j xokiejar.C d @ S =CO ! T ! W !ookieJar()

#由cookie构造opener

op; ] O r F . a ] Tener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie))

#发送登录请求,此后这个opener就携带了cookie,以证明自己登录过

reM l N y #sp = opener.open(req)

#登录后才能访问的网页

url = \'http://ssfw.xmu.edu.cn/cm; . v 2 rstar/index.poO = & s brtal\'

#构造访问请求

req = urllib.request.Request(url, headers = headers)

resp = opener.` 5 { l * k aopen(req)

print(resp.reaY , M P b N & D Md().decode(\'utf-8\'7 - o e |))

requests库的版本:

import requests

import sys

import io

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

#登录后才能访问的网页

url = \'http://ssfw.xm3 d t z : mu.edu.cn/cw X { a ! / a 4 :mstar/index.portal\'

#浏览器登录后得到的cookie,也就是刚才复制的字符串

cookie_str = r\'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxx; iPlanetDirect& h (oryPro=xxx7 @ ( [ n = N sxxxxxxxxxxxxxxx\'

#把cookie字符串处理成字典,以便接下来使用

cookies = {}

for line in cookie_str.spl. u R !it(\';\'):O Z `

key, value = line.split(\'=\', 1)

cookies t ] [ O E ss[key] = value

#设置请求头

headers = {\'User-agent\':\'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, likev Z W Gecko) Chrome/60.0.3112.1 P ; Z X R % D13 Safari/537.36\'}

#在发送get请求时带上请求$ x H w & ; @ ]头和cookies

resp = requests.get(url, headers = headers, cookies = cookies)

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

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

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

原理:

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

具体步骤:

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

2.找出要提交的数据

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

3.写代码

requests库的版本

impP H f w S ^ Q 2ort requests

import sys

import io

sys.stdout = io.TextIOWrap; ) ~ 3 Tper(sys.stdout.buffer,enQ d $ r X S B }coding=\'utf8\') #改变标准输出的默认编码

#登录时需要POST的数据

data = {\'Login.A k L 2 P E T :Token1\':\'学号\',

\'Login.Token2\':\'密码\',

\'goto:http\':\'//ssfw.xmu.edu.cn/cmstar/loginSuccess.portal\', R % V r X j G I

\'got[ D x t { A ,oOnFail:http\':\'//ssfw.xmu.edu.v ] t j M T d /cn/cmstar/loginFailure.portal\'}

#设置请求头

headers = {\'User-agent\':\'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebM W | # 5 |Kit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36\'}

#登录时表单提交到的地址(用开发者工具可以看到)

login_url = \'http://ssfw.xmu.edu.cn/cmstar/us2 r C %erPasswordValidate.portal\'

#构造Sesw ^ *sion

session = reqn | ) ( [ #uests.Session()

#在seI K = ws} G A 6sion中发送登录请求,此后这个session里就存储了cookie

#可以用print(session.cookies.get_did . L -ct())查看

resp = session.post(logi6 { { =n_url, data)

#登录后才能访问的网页

url = \'h: C - # bttp://ssfw.xmu.edu.cn/cmstar/index.portal\'

#发送访问请求

resp = session.get(url)

print(resp.content.decode(\'utf-8\')} v M H g E j #)

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

特点:

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

原理c * j p . ) L }

如果能在程序里调用一个浏览器来访问网站,那么像登z G / l录这样的操作就轻而易举了。在Python中可以使用Selenium库来调用浏览器,写在代码里的操作(打开网页、点击……)会变成浏览器忠实地执行。这个被控制的浏览| p E器可以是Firefo8 w ~x,ChroR 2 7 Hme等,但最常用的还是PhanG D X 8 F QtomJS这个无头(没有界面)浏览器。也就是说,只要把填写用户名密码、点击“登录”按钮、打开另一个网页等操作写到程序中,PhamtomJS就能确确实实地让/ ` J g你登录上去,并把响应返回给你。

具体步骤:

1.安装selenium库、PhantomJS浏览器

2.在源k P Z R代码中找到登录时的输入文本框A 4 S 4 - - P O、按钮这些元素

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

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

Python模拟登录的多种方法(四种)

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

Selenium库提供了find_element(s)_byi U 1 i S_xx7 g ? r Sx的方法来找到网页中的输入框、按钮等G i , @ h S , X元素。其中xxx可s T U z p 7以是id# + * ? Y n 2 G、name、tag_5 y 1 V _ z Lname(标签名)、class_name(class),也可以是xpath(xpC k f [ K l Z rath表达式)等等。当然还是要具体分析网页源代码。

4.写代码

import requests

import sys

import io

from selenium import we` J - = bbdriver

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

#建立Phantomjs浏览器对象,括号里是phantj f w 7 6 Somjs.exe在你的电脑上的路径

browser = we} * 7 Rbdriver.PhantomJS(\'d:/: m R l U P Etool/07-net/phantomjs-windows/pb + O u / - 6hantomjs-2.1.1-windows/bin/phantomjs.exe\')

#登录页面

url = r\'http://ss` w F e [ ` k Nfw.xmu.edu.cn/cmstar/index.portal\'

# 访问s [ A # T d ~登录页面

browser.get(url)

# 等待一定时间,让js脚本加载完毕T y W

browser.implicitly_wait(3)

#输入用户名

us! B - ! F P 6 fernam5 M Ue = browser.find_element_by_name(\'user\( H w z X d')

username.send_keys(\'学号\')

#输入密码

password = bro4 P 6 l d !wser.find_element_by_name(\'pwd\')

password.send_k j ^ k 0 t yeys(\'密码\')

#Y p = ; & ? ; _选择- O 3 V w“学生”单选按钮

student = browser.find_element_b+ p @y_xpath(\'//input[@value=\"student\"]\')

student.clickl K d v P ! a()

#点击“登录”按钮

login_button = browser.$ m 7 ( ( y * (fU D 9 b l b E Rind_element_by_name(\'btn\')

login_button.s} V N Hubmit()

#网页截图

browser.save_screenshot(\'picture1.png\')

#打印网页源代码

print(browser.page_source.encode(\'ut] % Jf-8\').decode())

browsB u K / T ( | 3 uer.quit()

总结

以上所述是小编给大家介绍的Python模拟登录的多种方法,希望对大家有所帮助,喜欢小编文章的可以6 P 3关注并转发哦~~~谢谢

上一篇

《专家人才故事汇》杜根:饮水思源的电商追梦人

下一篇

完善功能设施配套 促进“城”与“产”互融

你也可能喜欢

  • 暂无相关文章!

发表评论

您的电子邮件地址不会被公开。 必填项已用 * 标注

提示:点击验证后方可评论!

插入图片
返回顶部