1.实现原理
刚好最近学了http协议,就当是复习了。简单概括就是,通过网址找到登录界面,然后发送post请求,把登录信息提交给服务器,从而完成登录。图片来源于朋友博客的,他的更详细介绍了http协议,感兴趣可以看看。
1.1认识 URL
我们所说的网址,其实就是统一资源定位符(uniform resource locator简称URL),通过这个唯一的地址,可以找到对应的服务。它的标准格式如下:
协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志
这个只是标准的格式,有些信息是可以省略的,比如登录信息等,还有服务器地址可以用域名地址,也可以用ip地址。带层次的文件路径其实就是你要访问的服务器资源,问号?后面是get请求的参数。http协议有多种请求方法,post和get只是其中的两种。
1.get方法主要是获取服务器的资源信息,请求的参数一般放在url?后面。
2.post方法主要是把数据提交给服务器,在报文的正文部分进行提交。
http协议本质是获得某种“资源”(视频、音频、网页、图片……),而传输则是其功能。实际上,上网的大部分行为,都在进行着进程间通信,既然是通信,就需要获取信息和发送信息,所以对应到我们生活中,大部分的上网行为无非两种:
1.把服务器上面的资源拿到本地(下载短视频、网络小说……)
2.把本地的服务器推送到服务器(搜索、登录、下单……)
1.2 http请求报文格式
首行: [方法] + [url] + [版本]
Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个 Content-Length属性来标识Body的长度;
1.3 http响应报头格式
首行: [版本号] + [状态码] + [状态码解释]
Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个 Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在 body中。
HTTP常见Header:
Content-Type: 数据类型(text/html等) Content-Length: Body的长度
Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上; User-Agent: 声明用户的操作系统和浏览器版本信息;
referer: 当前页面是从哪个页面跳转过来的;
location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;
2.具体实现
import requestsimport socket# 获取ip地址def get_host_ip():
"""
查询本机ip地址
:return: ip
"""
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('10.255.255.255', 1))
ip = s.getsockname()[0]
finally:
s.close()
return ip
user_ip = get_host_ip()# 校园网地址,最好不要用浏览器里的url,还是建议抓包获取post_addr = "http://10.10.244.11:801/eportal/"#下面两个大括号里面都是复制自己学校校园网登录网站中的,冒号两边都要加上双引号post_header = { #报头信息,通过抓包,获取}
post_data = {
#正文数据,通过抓包获取}
#提交http请求报文z = requests.post(post_addr, data=post_data, headers=post_header)print("