当前位置: 首页 > 后端技术 > Python

Python模拟登录的四种方法

时间:2023-03-26 19:14:08 Python

方法一:直接使用已知的cookies访问特性:简单,但需要在浏览器中登录原理:简单来说,cookies保存在发起请求的客户端,服务端使用cookie以区分不同的客户端。因为http是无状态连接,当服务端同时收到多个请求时,无法判断哪些请求是同一个客户端发起的。而“访问登录后才能看到的页面”的行为需要客户端向服务器证明:“我是刚才登录的客户端”。所以需要cookies来识别客户端的身份来存储它的信息(比如登录状态)。当然,这也意味着只要我们从另一个客户端得到一个cookie,我们就可以假装是它来和服务器对话。这就给我们的节目带来了契机。我们先用浏览器登录,然后用开发者工具查看cookies。然后在程序中携带cookie向网站发送请求,这样你的程序就可以伪装成刚才登录的浏览器,得到登录后才能看到的页面。具体步骤:1.用浏览器登录获取浏览器中的cookie字符串,先用浏览器登录。然后打开开发人员工具并转到网络选项卡。在左侧的Name栏中找到当前的URL,选择右侧的Headers选项卡,查看RequestHeaders,其中包含了网站发给浏览器的cookies。是的,就是下面的字符串。将其复制下来,稍后在代码中使用。请注意,最好在运行程序之前登录。如果您过早登录,或关闭浏览器,复制的cookie很可能会过期而失效。2.写urllib库的版本:importsysimportiofromurllibimportrequestsys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')#更改标准输出的默认编码#只能访问的网站urlbeaccessedafterlogin='http://ssfw.xmu.edu.cn/cmstar/index.portal'#浏览器登录后获取的cookie,即字符串cookie_str=r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxxxx;iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxxxx'#登录后只能访问网页url='http://ssfw.xmu.edu.cn/cmstar/index.portal'req=request.Request(url)#setcookiereq.add_header('cookie',raw_cookies)#setrequestheaderreq.add_header('User-Agent','Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/60.0.3112.113Safari/537.36')resp=request.urlopen(req)print(resp.read().decode('utf-8'))版本的请求库:importrequestsimportsysimportiosys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')#更改标准输出的默认编码#登录后才能访问的网页url='http://ssfw.xmu.edu.cn/cmstar/index.portal'#浏览器登录后获取的cookie,也就是刚刚复制的字符串cookie_str=r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxxxx;iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxxxx'#将cookie字符串处理成字典,这样就可以使用cookies={}forlineincookie_str.split(';'):key,value=line.split('=',1)cookies[key]=value方法二:模拟登录后携带cookie访问原理:我们先在程序中向网站发送登录请求,即提交包含登录信息(用户名、密码等)的表单,从响应中获取cookie。以后访问其他页面时,把这个cookie也带上,你会得到只有登录后才能看到的页面。具体步骤:1.找到提交表单的页面,您仍然需要使用浏览器的开发人员工具。转到网络选项卡并选中保留日志(重要!)。在浏览器中登录网站。然后在左侧的名称栏中找到提交表单的页面。如何找到它?向右看并转到标题选项卡。首先,在General部分,RequestMethod应该是POST。其次,在底部应该有一个叫做FormData的部分,在里面可以看到刚才输入的用户名和密码。您还可以查看左侧的名称。如果它包含单词login,它可能是提交表单的页面(不一定!)。这里需要强调的是,“提交表单的页面”通常不是你填写用户名和密码的页面!所以使用工具来寻找它。2、找出要提交的数据虽然你在浏览器登录时只是填写了用户名和密码,但是表单中包含的数据可不止这些。从FormData中可以看到所有需要提交的数据。3.写urllib库的版本:importsysimportioimporturllib.requestimporthttp.cookiejarsys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')#更改标准输出的默认编码#POST是登录时必填Datadata={'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(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/60.0.3112.113Safari/537.36'}#登录时提交表单的地址in(使用开发者工具查看)login_url='http://ssfw.xmu.edu.cn/cmstar/userPasswordValidate.portal#构造登录请求req=urllib.request.Request(login_url,headers=headers,data=post_data)#constructcookiecookie=http.cookiejar.CookieJar()#由cookie构造openeropener=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库版本:importrequestsimportsysimportiosys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')#更改标准输出的默认编码#登录后才能访问的网页url='http://ssfw。xmu.edu.cn/cmstar/index.portal'#浏览器登录后获取的cookie,即刚才复制的字符串cookie_str=r'JSESSIONID=xxxxxxxxxxxxxxxxxxxxxxx;iPlanetDirectoryPro=xxxxxxxxxxxxxxxxxxxx'#将cookie字符串处理成字典,这样Nextusecookies={}forlineincookie_str.split(';'):key,value=line.split('=',1)cookies[key]=value#Setrequestheadersheaders={'User-agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/60.0.3112.113Safari/537.36'}#Bringrequestheader还有发送get请求时的cookiesresp=requests.get(url,headers=headers,cookies=cookies)print(resp.content.decode('utf-8'))很明显requests库用起来更方便~方法三:使用session来保持模拟登录后的登录状态原理:session就是一个session意思和cookies类似,也是让服务器“认识”客户端。简单的理解就是把客户端和服务端的每一次交互都看成一个“会话”。既然是在同一个“会话”中,服务器自然可以知道客户端是否登录了。具体步骤:1.找出提交表单的页面2.找出要提交的数据。这两步与方法二中的前两步相同。3.编写代码requestslibraryversionimportrequestsimportsysimportiosys.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'}#Setrequestheadersheaders={'User-agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/60.0.3112.113Safari/537.36'}#登录时,表单提交到Address(用开发者工具可以看到)在session中,这个cookie保存在session中#可以使用print(session.cookies.get_dict())查看resp=session.post(login_url,data)#login=后才能访问的网页url'http://ssfw.xmu.edu.cn/cmstar/index.portal'#发送访问请求resp=session.get(url)print(resp.content.decode('utf-8'))方法四:使用无头浏览器访问特点:功能强大,几乎可以处理任何网页,但会导致代码效率低下原理:如果能在程序中调用浏览器访问网站,那么登录等操作就轻而易举了。在Python中,可以使用Selenium库来调用浏览器,代码中编写的操作(打开网页,点击……)都会被浏览器忠实执行。被控制的浏览器可以是Firefox、Chrome等,但最常用的是PhantomJS,一种headless(无界面)浏览器。也就是说,只要你在程序中写入填写用户名和密码,点击“登录”按钮,打开另一个网页等操作,PhamtomJS其实就可以让你登录并返回response给你.具体步骤:1、安装selenium库和PhantomJS浏览器2、在源码中找到登录时的输入文本框和按钮。因为这些元素需要在无头浏览器中进行操作,所以你必须先找到输入框,然后才能输入信息。找到登录按钮并单击它。在浏览器中打开填写用户名和密码的页面,将光标移动到输入用户名的文本框,右击,选择“InspectElement”,可以看到文本框是哪个元素在右侧网页的源代码中。同样,你可以在源代码中找到输入密码的文本框和登录按钮。3.考虑如何在程序中找到上述元素。Selenium库提供了find_element(s)_by_xxx方法来查找网页中的输入框、按钮等元素。其中xxx可以是id,name,tag_name(标签名),class_name(类),或者xpath(xpath表达式)等,当然还是要具体分析网页的源码。4.写代码importrequestsimportsysimportiofromseleniumimportwebdriversys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')#更改标准输出的默认编码#创建一个Phantomjs浏览器对象,括号中为phantomjs.exe你电脑浏览器的路径=webdriver.PhantomJS('d:/tool/07-net/phantomjs-windows/phantomjs-2.1.1-windows/bin/phantomjs.exe')#loginpageurl=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('studentnumber')#输入密码password=browser.find_element_by_name('pwd')password.send_keys('password')#选择“学生”单选按钮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()文源网,学习用仅供参考,如有侵权,请联系删除。我的公众号【Python圈】汇集了优质的技术文章和经验总结。学习Python的路上肯定会遇到困难,不要慌张,我这里有一套学习资料,包括40+电子书,600+教学视频,涉及Python基础、爬虫、框架、数据分析、机学习等等,别怕学不会!还有学习交流群,一起学习进步~