Python处理表单登陆与cookie(1)

1.处理登入表单

处理登入表单可分为两步:

  1. 研究网站登入表单,构建POST请求的参数字典
  2. 提交POST请求进行登入

(1) 研究网站登入表单

以网站http://www.santostang.com/wp-login.php为例(账号:test,密码:a12345)

python gui表单编辑 python 填写表单_php


通过检测元素发现

python gui表单编辑 python 填写表单_php_02


用户名输入框的name属性的值为log这将会是字典的key,value为用户输入

python gui表单编辑 python 填写表单_表单_03


密码框的name属性的值为pwd

python gui表单编辑 python 填写表单_隐藏域_04


key值是name属性的值remember,value则是里面的forever

python gui表单编辑 python 填写表单_表单_05


在登入表单中有些key值在浏览器中设置了hidden值,是不会显示出来的,我们可以在审查元素中找出

作用:

1 隐藏域在页面中对于用户是不可见的,在表单中插入隐藏域的目的在于收集或发送信息,以利于被处理表单的程序所使用。浏览者单击发送按钮发送表单的时候,隐藏域的信息也被一起发送到服务器。

2 有些时候我们要给用户一信息,让他在提交表单时提交上来以确定用户身份,如sessionkey,等等.当然这些东西也能用cookie实现,但使用隐藏域就简单的多了.而且不会有浏览器不支持,用户禁用cookie的烦恼。

3 有些时候一个form里有多个提交按钮,怎样使程序能够分清楚到底用户是按那一个按钮提交上来的呢?我们就可以写一个隐藏域,然后在每一个按钮处加上οnclick="document.form.command.value=“xx”"然后我们接到数据后先检查command的值就会知道用户是按的那个按钮提交上来的。

4 有时候一个网页中有多个form,我们知道多个form是不能同时提交的,但有时这些form确实相互作用,我们就可以在form中添加隐藏域来使它们联系起来。

5 JavaScript不支持全局变量,但有时我们必须用全局变量,我们就可以把值先存在隐藏域里,它的值就不会丢失了。

6 还有个例子,比如按一个按钮弹出四个小窗口,当点击其中的一个小窗口时其他三个自动关闭.可是IE不支持小窗口相互调用,所以只有在父窗口写个隐藏域,当小窗口看到那个隐藏域的值是close时就自己关掉。
(2)构建POST请求的参数字典
由第一步分析可以构建POST请求的参数字典dict,代码如下:

postdata = {
	'pwd' : 'a12345',
	'log' : 'test',
	'remember' : 'forever',
	'redirect_to' : 'http://www.santostang.com/wp-admin',
	'testcookie' : 1,
}

(3)提交POST请求
首先需要导入requests库,创建一个session对象:

import requests
session = requests.session()

session是网站开发中一个重要的概念,通俗的说就是浏览器在运行到关闭的这段过程,session对象会储存特定的用户会话所需要的属性和配置信息。
代码如下:

import requests
session = requests.session()

post_url = 'http://www.santostang.com/wp-login.php' 
agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
headers = {
	'Host' : 'www.santostang.com',
	'Origin' : 'http://www.santostang.com',
	'Referer' : 'http://www.santostang.com/wp-login.php',
	'User-Agent' : agent
}
postdata = {
	'pwd' : 'a12345',
	'log' : 'test',
	'remember' : 'forever',
	'redirect_to' : 'http://www.santostang.com/wp-admin',
	'testcookie' : 1,
}
login_page = session.post(post_url,data=postdata,headers=headers)
print(login_page.status_code)