什么?登录?还模拟登录?
登录一个网页对于我们再熟悉不过了。无论是生活当中登录网页获取MM图片,或者是工作当中登录公司网站(如WIKI,jira等)。球都嘛得。。虽然我每天都登录,但是我可以储存自己的账号和密码啊?为什么要模拟登录?
举个李子,拿额们公司需求为例,之前每次发版,都要从我们公司的wiki里面手动拷贝需求列表,然后发送质量报告邮件。这样繁琐重复的工作我们当然不能忍啦,就想着可以通过脚本实现自动化(毕竟我们勤奋的目的就是将来让我们变得更懒,😁)。
呐,有了这个构思,我们就开始实战吧!
这里我选用python完成这一工作,毕竟在爬虫领域无出其右者。你可以选择urllib来实现,这里我用requests来实现。
requests库实现模拟登录获取数据其实大概分三部曲:
get请求登录url->post请求进行登录操作->对相应的url进行数据获取
第一、get请求登录url
为什么要这样做?这里可能会有些疑惑,我们直接携带我们的登录账号和密码,post请求不就登录上去来么?这一步的意义是什么?
是这样的,我们的登录操作看似只是填写来用户名和密码,但是有些网站它会携带用户不可见的token作为参数进行传递。我们可以看下图:
有些网站都会将这些token也作为参数进行传递,让服务器端进行校验。
那。。我们写死,也传这个token,value直接传这个content的值,不可以么?
遗憾的是,大部分网站的登录token通过每次的get请求都是不同的,可能这次你请求的是这个token,下次就完全变了样了。。
这个时候,requests.session就给我们极大的便利咯。平常情况下,我们都是直接requests.get或者requests.post进行网络数据请求。而你每进行一次这种操作都可以理解为你重新打开了一个新的网页,而session的好处是它可以保证我们操作的是同一个页面。这次我们先初始化一个session:
mySession = requests.session()
然后我们用session去请求login_url:
response = mySession.get(login_url, verify=False).text
现在我们就得到登录的各种数据了,怎么拿到这个token呢?因为这里我们只拿token,所以可以略使小技,用一个写死的正则表达式来获取:
strToken = r'''<meta id="atlassian-token" name="atlassian-token" content=(.*?)>'''
userToken = re.findall(strToken, response)[0]
到这一步,我们就完成第一步咯!
第二、post请求进行登录操作
其实这一步就很简单了,也不一定用post进行登录,根据不同的网站用不同请求。先把我们刚刚获取的token放入参数dict:
loginPayload = {'atlassian-token':userToken, 'login':你的用户名,'password':你的密码}
这里仍然用刚刚初始化的那个session:
loginResult = mySession.post(login_url, data=loginPayload)
这样,我们就完成了登录操作。
第三、对相应的url进行数据获取
这一步就更加简单了,直接对需要获取数据的url进行爬取就可以了
queryResponse = mySession.get(queryUrl, verify=False)
其中queryUrl就是你要爬取数据的链接,后续可以手动进行传入。
获取到queryResponse之后,剩下的就是对数据进行解析的操作了。你可以利用高大上的beautifulsoup,也可以用python的htmlpaser,或者xpath等等,相信后续操作大家都知道怎么办啦!