今天继续给大家介绍Python爬虫相关知识,本文主要内容是Python爬虫登录后token处理。
一、网页token及token作用
在上文Python爬虫登录后cookie处理中,我们介绍过使用使用Python爬虫解决cookie及网页登录访问问题。
然而,有的网站,例如DVWA,为了防止CSRF等攻击(CSRF漏洞是常见的安全漏洞之一,关于CSRF可以参考文章:CSRF漏洞简介),会设置token字段。
我们可以使用浏览器开发者工具检查登录页面HTML源代码如下所示:
从上图中可以看出,在页面中有一个隐藏的input标签,因为该标签属性设置位了hidden,因此该标签不会显示在浏览器中,不会影响页面整体效果。但是该input标签是存在name和value的,因此当我们点击浏览器中的Login按钮时,该input标签中的name和value也会被当作POST提交数据的一部分进行提交。最麻烦的是,该字段的值会随着我们对页面的刷新而变化,这意味着我们无法从浏览器复制该值后粘贴到Python代码中!
二、Python爬虫token问题解决
为了解决这一问题,我们就必须先访问站点的登录页面,获取token值,在获取token值之后,将其作为登录数据包的POST提交数据的一部分,与用户名和密码一起提交。这样就解决了token的验证问题。
针对DVWA网站,我们实现的简单登录后爬取主页数据Python爬虫代码如下所示:
import requests
from lxml import etree
url1="http://192.168.136.1/dvwa/login.php"
url2="http://192.168.136.1/dvwa/index.php"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"}
session=requests.session()
response1=session.get(url=url1,headers=headers)
page_text1=response1.text
tree=etree.HTML(page_text1)
token=tree.xpath('//*[@id="content"]/form/input/@value')[0]
print(token)
data={
"username":"admin",
"password":"password",
"Login":"login",
"user_token":token
}
response2=session.post(url=url1,headers=headers,data=data)
response3=session.get(url=url2,headers=headers)
page_text=response3.text
fp=open("./dvwa.html",'w')
fp.write(page_text)
fp.close()
在上述代码中,我们一共发起了3次session请求,第一次请求是为了获取token,第二次请求是为了成功登录,并获取登录后的cookie,第三次请求是为了拿到登录后的主页数据。上述代码执行后,我们成功下载到了登录后的源码数据,结果如下所示:
从上图可以看出,我们使用Python爬虫处理token成功!
原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200