爬虫模拟登陆网站

前言

在爬取很多需要先登陆的网站的时候,第一步是需要模拟浏览器登陆过程,向目标网页(url) post一个含有账户密码以及额外信息的表单,成功登陆操作后,就获取到目标网页的内容。

分析登陆过程

这里以我本科学校的图书管座位预约系统为例,F12打开浏览器开发者模式的网络界面,可以查看浏览器与服务器之间数据的交互过程。

首先打开目标网页,即向目标服务器发送一个get请求后,返回登陆界面的网页内容。
在这里插入图片描述接着输入账号密码,点击登陆成功后,观察,浏览器其实向目标服务器又发送一个post请求,是一个包含五个参数的表单:SYNCHRONIZER_TOKEN,SYNCHRONIZER_URI,username,password,authid
我们多登陆几次,就发现规律。其中usernamepassword很清楚就是登陆的账号密码,authid默认为-1,SYNCHRONIZER_URI默认为/
在这里插入图片描述SYNCHRONIZER_TOKEN每次都会变化,说明它一定是首次访问登陆页面服务器给动态返还的,而登陆页面返回的response header里没有它身影,我们就思考它可能隐藏在其他的地方或是计算出来的。我们再从网页的源码探寻,搜索相关字段,发现网页源代码里隐藏着此信息,它是一个隐藏式表单元素,如图所示:

在这里插入图片描述
现在就已经获取所有需要post的信息来源,接下来代码实现模拟登陆过程。

代码

这里最重要的一个变量就是request库的Session,它可以帮助我们维持一个会话,而且可以自动处理
Cookies,即登陆成功后,可以一直保留登录状态,爬取登陆后的页面。

接下来就是需要在首次访问登录页面时候提取出SYNCHRONIZER_TOKEN字段的内容,实现在token()函数里。

最后注意,这个网站登陆成功后浏览器会自动跳转另一个地址,所以我们真正需要爬取的内容在self.logined_url里。

class Book_seat():
    def __init__(self):
        self.headers = {
            'Referer':'http://seat1.lib.hlju.edu.cn/login?username=21814242',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0',
            'Host':'seat1.lib.hlju.edu.cn'
        }
        self.login_url = 'http://seat1.lib.hlju.edu.cn/login?targetUri=%2F'
        self.post_url = 'http://seat1.lib.hlju.edu.cn/auth/signIn'
        self.logined_url = 'http://seat1.lib.hlju.edu.cn/'
        self.session = requests.Session()

    def token(self, url):
        respone = self.session.get(url, headers = self.headers)
        soup = BeautifulSoup(respone.text , 'lxml')
        token  = soup.select('#SYNCHRONIZER_TOKEN')[0]['value']
        return token

    def login(self, username = '2181424', pwd = '090613'):

        post_data = {
            'SYNCHRONIZER_TOKEN': self.token(url = self.login_url),
            'SYNCHRONIZER_URI': '/login',
            'username': username,
            'password': pwd,
            'authid': '-1',
        }
        
        response = self.session.post(self.post_url, headers= self.headers, data=post_data)
        print('Open login url status(200 is normal):',response.status_code)

        response = self.session.get(self.logined_url, headers=self.headers)
        print('Open book seat url status(200 is normal)',response.status_code)
        soup = BeautifulSoup(response.text, 'lxml')
        #print(soup.prettify())
        print('Login Successfully!')

总结

爬虫模拟登陆网站实际就是模拟浏览器向目标url发送表单的过程,最重要分析浏览器发送了什么,怎么获得的。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值