Python模拟登陆——以登陆某研究生官网为例

版权声明:原创不易,如若转载,请注明出处! https://blog.csdn.net/MG1723054/article/details/81900983

大家经常会用Python进行网络爬虫,但是有些网站是需要登陆才能看到内容的,那怎么用Python实现模拟登陆呢?主要有三种方式。

方法一、直接使用已知的cookie访问,特点:简单,但是需要事先登陆网站,而且这个cookie具有时效性。(注意!!!)

原理:cookie保存在发起请求的客户端中,服务器利用cookie来区分不同的客户端,因为http是一种无状态的连接,当服务器一下子收到多个请求是无法判断哪些请求是同一个客户端发起的,而访问登陆后才看到的页面这一行为,恰恰需要向服务器证明是刚才登陆过的那个客户端。于是就需要cookie来标识客户端的身份以存储登陆信息,这意味着只要得到别的登陆客户端的cookie,我们能够冒充他来和服务器对话,我们用浏览器登陆,使用开发者工具看cookie,接着在程序中携带该cookie向网站发送请求就能让程序假扮成登陆的那个浏览器,得到只有登陆才能看到的状态。

具体步骤:打开浏览器登陆,再打开开发者工具,转到network选项卡。在左边的name一栏找到当前网址(一般的在DOC可以快速找到)选择右边的header卡里面查找request headers,这里包含了该网站颁发给浏览器的cookie,复制下来

实现该方法的python代码有两种,第一种是直接在headers请求头加入cookie键值对,第二个是将cookie分割,放入自身的cookie中

对于第一种实现代码:

# -*- coding: utf-8 -*-
"""
Created on Fri Jul 27 18:31:43 2018

@author: NJUer
"""
import requests
url='http://pyb.nju.edu.cn/student/studentinfo.action'
header={'Cookie': 'JSESSIONID=F8B2FADEB3AE6B6329ABF0D4ACAC6A84; amlbcookie=01; iPlanetDirectoryPro=AQIC5wM2LY4SfczWdqG87YjBJlqOfYGTxZtApasRc6%2FnZLQ%3D%40AAJTSQACMDE%3D%23',
        'User-Agent': 'Mozilla/5.0'
        
        }
infor=requests.get(url,headers=header)
print(infor.text)
####运行结果显示出我们登陆后的网站的源代码

对于第二种实现代码:

# -*- coding: utf-8 -*-
"""
Created on Fri Jul 27 18:31:43 2018

@author: NJUer
"""
import requests
url='http://pyb.nju.edu.cn/student/studentinfo.action'
header={'Cookie': 'JSESSIONID=F8B2FADEB3AE6B6329ABF0D4ACAC6A84; amlbcookie=01; iPlanetDirectoryPro=AQIC5wM2LY4SfczWdqG87YjBJlqOfYGTxZtApasRc6%2FnZLQ%3D%40AAJTSQACMDE%3D%23',
        'User-Agent': 'Mozilla/5.0'
        
        }
infor=requests.get(url,headers=header)
print(infor.text)
####运行结果显示出我们登陆后的网站的源代码

方法二:模拟登陆后利用session保持登陆状态

原理:session是会话的意思,简单理解就是,将每一个客户端和服务器的互动当做每个会话,既然在同一会话,既然在同一会话中,服务器自然知道这个客户端是否登陆过

具体步骤:1、找出表单提交到页面:利用浏览器开发者工具,转到network选项,并勾选preserve log(重要),在浏览器登陆网站,然后在左边的name一栏找到表单提交页面,首先,在general那一段,request method 应当是POST,其次最下方应该有一段叫做FormData 里面可以找到刚才我们输入的用户名和密码等,注意:提交表单的页面一般不是提交表单的页面。

2、找出要提交的数据,包括用户名和密码

代码实现:

# -*- coding: utf-8 -*-
"""
Created on Sat Jul 14 20:23:45 2018

@author: FangWei
"""
import tesserocr
import requests
from PIL import Image
url='http://cer.nju.edu.cn/amserver/verify/image.jsp'
session=requests.session()
def verification_url(url) :
    
    data=session.get(url)
    file=r'C:\Users\FangWei\Desktop\CheckCode.jpg'
    with open(file,'wb') as f :
        f.write(data.content)
    return file
def identification(file) :  ####识别验证码,该程序识别效果不好,有条件可以利用打码平台识别
    image=Image.open(file)
    image=image.convert('L')
    threshold=127
    table=[]
    for i in range (256) :
        if i< threshold:
            table.append(0)
        else :
            table.append(1)
    image=image.point(table,'1')
    image.show()
    result=tesserocr.image_to_text(image).split('\n')[0]
    print(result)
    return result
def logon(result):
    form={'encoded': 'true' ,
'goto':' aHR0cDovL3B5Yi5uanUuZWR1LmNuL2xvZ2lucmVkaXJlY3QuYWN0aW9u',
'gotoOnFail':' aHR0cDovL3B5Yi5uanUuZWR1LmNuL2xvZ2luLmFjdGlvbg==',
'IDToken0': '',
'IDButton':'Submit',
'IDToken1':'您的账号(为保护个人隐私,不贴出来)',
'IDToken2':'您的密码(为保护个人隐私,不贴出来)',
'inputCode':result,
'gx_charset': 'UTF-8'
        }
    session.post('http://cer.nju.edu.cn/amserver/UI/Login',data=form)
    infor=session.get('http://pyb.nju.edu.cn/student/studentinfo.action')
    print(infor.text)
photo_file=verification_url(url)
result=identification(photo_file)
logon(result)
###结果与第一种方法相同

第三种:使用selenium登陆,该方法相对来说简单,只需要定位到账号,密码,验证码的输入框,然后在里面对应填上相关信息即可。还是那句老话,效率不高,特别一开始利用selenium打开网页,但是能够应对很多网站。详细代码就不放进来了,网上也有很多利用selenium登陆的教程。

有人可能想试试这些代码的可能说了,这人是不是傻啊,前面设置cookie已经过期了,我们也登陆不上,利用session维持会话的不给账号密码,我们怎么实践,首先,我想说的是我们在爬虫的时候学的是思路,主要是思路,其次为了个人隐私,这是私人究生官网账号,有些东西不便于放出来,这里可能有人会问为什么不用普通的网站,我们都可以申请的账号和密码的网站,比如豆瓣,微博等等,因为豆瓣需要验证码,而上面的验证码识别程序不能够正确的识别,所以我在本节中没有使用。最后预告一下,下一节博客,我将会利用打码平台破解验证码,然后利用session实现登陆豆瓣。

猜你喜欢

转载自blog.csdn.net/MG1723054/article/details/81900983
今日推荐