django

快速搞页面,前端不是负担

bootstrap 模板 快速搭建

框架

把原生底层的都给你写好  直接调用就行了

Django基础

学了Django  不用socket了  封装好(更好)了
互联网沟通的是资源  互联的是共享各个本地资源

HTTP协议

定义和概述
定义
        超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信	    息系统的应用层协议。HTTP是万维网的数据通信的基础。
        版本:HTTP 1.1  (还有HTTP/2这版本)
概述
		HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)
		通过网络爬虫、浏览器或者其他工具,客户端发起一个http请求到服务器上指定端口(默认端口80),称之为用户代理程序(user agent)。 
		应答服务器上存储着一些资源,比如html , css, js,称他为源服务器。在用户代理和原服务器中间可能存在多个‘中间层’,比如代理服务器、网关或者隧道
		TCP比较可靠,所以使用tcp,任何可靠的都可以为其进行通信()
		http客户端发起一个请求,创建一个到服务器指定端口(默认80端口)的tcp连接。http服务器监听请求,接收到,返回状态,比如‘HTTP/1.1 200 OK’ , 以及返回的内容,如请求的文件、错误信息或者其他信息。
		
工作原理
请求和响应模型
客户端向服务器发送一个请求报文,
请求报文包含请求的方法、url、协议版本、请求头部和请求数据。服务器以一个状态行作为呼应,
响应的内容包括             协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
http请求/响应的步骤:
1 客户端连接到web 服务器  (上网通过域名  或者ip不好区分,难记自己可以I)
2 发送http请求		通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,有请求行、头部、空行和数据组成
3 服务器接收请求并返回http响应	web 服务器解析请求,定位请求资源。服务器将资源副本写到TCP套接字,由客户端读取。响应由状态行、响应头部、空行和数据4个组成
4 释放连接TC连接  若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;
			   若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接受请求
5 客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看声明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。
例如:在浏览器地址栏键入URL,按下回车之后会经历:
1 浏览器 向DNS 服务器 请求解析该URL中的域名所对应的IP地址
2 解析出IP地址后,根据该IP地址和默认端口80 , 和服务器建立TCP连接
3 浏览器发出读取文件(URL中域名后面部分对应的文件)的http请求,该请求报文作为TCP三次握手和四次挥手数据发送给服务器
4 服务器对浏览器请求作出相应,并把对应的html文本发送给浏览器
5 释放tcp连接
6 浏览器将该html文本并显示内容
请求格式  请求方法(get) 空格  URL  空格  协议版本   回车符 (/r) 换行符/n()
					//请求 判断是  然后就找本地把本地的数据给他显示  也可不判断
请求头   (键值对) 渲染的细节  可以不规定 默认的效果
空行      /r /n 
请求体(数据) 	
http请求协议

响应  行    协议版本(http/1.1)  空格   状态码200  空格   状态码描述(ok)   回车符  换行符
响应头部    可以不用写   细节的规定
空行    /r/n 
响应正文
http响应协议

http请求/响应
http协议是基于TCP/IP 协议之上的应用层协议
基于请求-响应的模式
    http协议规定,请求从客户端发出,最后服务器端响应该请求并返回。换句话说,肯定是先从客户端开始建立通信	服务器端在没有接受到请求之前不会发送响应。
无状态保存
	一次性的
    HTTP是一种不保存状态,。自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送     过的请求或者响应不做持久化处理   。
    有新请求,就新响应。协议本身不保存之前,以便处理大量事务。
  随着发展,需要一直保存在登录状态,所以有了cookie,再用http协议通信,就可以管理状态了。
无连接  
    无连接的含义是限制每次连接只处理一个请求。处理完请求,收到客户应答后,即断开连接。节时,提高并发。
    两种方式:
    1 请求响应之后,直接断开
    2 现在的http协议1.1 版本不直接断开,等几秒,如果有新的请求,还是通过之前的连接通道收发。
    	没有则断开。提高效率,减少短时间内建立连接的次数。因为连接是耗时的
    	默认是3秒钟好像。但是可以通过后端的二代吗来调整的,自己网站根据自己网站用户行为分析统计最优时间。
    虽然是tcp(数据安全,不能丢10030块钱) 的  但是发了一次信息就断开连接   不再让用户占用着资源
    保证高并发
	等几秒钟,减少短时间内建立连接 的次数, 建立连接是费时的    点了京东  又去点了别的(购物车)
												       点了京东  又去聊天了   (断开)
请求方法
运行network  
resquest  请求
方法
get 	百度一个东西,请求数据拼接到了url里面  (没有请求数据) 拼接url有长度限制
head 
post	把请求放到 数据里面了   url里面没有 相对安全 没有绝对安全  放在了请求体里  没有长度限制
put 
delete
trace
options
get 和 post
post 保密性稍高与 post

<form action="http://127.0.0.1:8001" method="get">
        用户名 <input type="text" name="username">
<!--        <input type="submit">-->
        <button>提交</button>
</form>
http状态码

headers(general)()

1xx(消息)   接受了 还没处理完
2xx(成功)   接受理解处理完
3xx(重定向)  访问了一会又去访问了别的(更新的) 
			 老网站大用户量,重新推广开新域名 跳转:localtion.href='网址' 跳过去了
4xx(请求错误)  请求不和发
5xx (服务器错误)  服务器在处理某个正确请求是发生错误

img  css  js 文件 必须给浏览器 静态文件 否则无法渲染,   浏览器要一点内存缓存  刷到硬盘上断了,还可以查看
最终目的: 起飞版  框架  厉害
URL
http 的统一资源定位符将从因特网获取信息的五个基本元素包括在一个见得的地址中:
。 传送协议
。 层级URL标记符合(为[//],固定不变)
。 访问资源需要的凭证信息(可忽略)
。 服务器(通常为域名, 有事为IP地址)
。 端口号(以数字方式标识,若为HTTP的默认值‘:80’可忽略)
。 路径(以‘/’ 字符区别路径中的每个目录名称)
。 查询(GET 模式的窗体参数,以‘?’字符为起点,每个参数以“&”隔开,再以‘=’分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
。 片段 以‘#’字符为起点

以http://www.luffycity.com:80/news/index.html?id=250&page=1 为例, 其中:
http,是协议;
www.luffycity.com,是服务器;
80,是服务器上的默认网络端口号,默认不显示;
/news/index.html,是路径(URI:直接定位到对应的资源);
?id=250&page=1,是查询。
大多数网页浏览器不要求用户输入网页中“http://”的部分,因为绝大多数网页内容是超文本传输协议文件。同样,“80”是超文本传输协议文件的常用端口号,因此一般也不必写明。一般来说用户只要键入统一资源定位符的一部分(www.luffycity.com:80/news/index.html?id=250&page=1)就可以了。
由于超文本传输协议允许服务器将浏览器重定向到另一个网页地址,因此许多服务器允许用户省略网页地址中的部分,比如 www。从技术上来说这样省略后的网页地址实际上是一个不同的网页地址,浏览器本身无法决定这个新地址是否通,服务器必须完成重定向的任务。
1.1 简单的web响应代码
import socket
from threading import Thread
server = socket.socket()
server.bind(('0.0.0.0',8001))
server.listen()
def communication(conn):
    #接受请求数据  要写
    client_msg = conn.recv(1024).decode('utf-8')
    #组合响应协议的消息格式,然后发送响应信息
    conn.send(b'HTTP/1.1 200 ok \r\nk1:v1\r\n\r\n')
    # conn.send(b'who are you?')
    #打开index.html文件,返回给前端
    with open('01 index.html', 'rb') as f:  #没有引入文件形式的html页面
    # with open('01 index2.html', 'rb') as f:   #引入了文件形式的html页面
        data = f.read()
    conn.send(data)
    conn.close()
while 1:
    #接受连接
    conn, add = server.accept()
    #开启线性并发
    t = Thread(target=communication,args=(conn,))
    t.start()


输出请求信息:  
GET / HTTP/1.1
Host: 127.0.0.1:8001
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
1.2 上传文文件代码
import socket
from threading import Thread
server = socket.socket()
server.bind(('0.0.0.0',8001))
server.listen()
def communication(conn):
    client_msg = conn.recv(1024).decode('utf-8')
    # print(client_msg)
    path = client_msg.split('\r\n')[0].split(' ')[1]
    print(path)
    #针对不同的请求路径,返回不同的文件
    if path =='/':
        conn.send(b'HTTP/1.1 200 ok \r\nk1:v1\r\n\r\n')
        # conn.send(b'who are you?')
        with open('01 index2.html', 'rb') as f:
            data = f.read()
        conn.send(data)
        conn.close()
    elif path =='/index.css':
        conn.send(b'HTTP/1.1 200 ok \r\nk1:v1\r\n\r\n')
        # conn.send(b'who are you?')
        with open('index.css', 'rb') as f:
            data = f.read()
        conn.send(data)
        conn.close()
    elif path =='/index.js':
        conn.send(b'HTTP/1.1 200 ok \r\nk1:v1\r\n\r\n')
        # conn.send(b'who are you?')
        with open('index.js', 'rb') as f:
            data = f.read()
        conn.send(data)
        conn.close()
    elif path =='/favicon.ico':
        conn.send(b'HTTP/1.1 200 ok \r\nk1:v1\r\n\r\n')
        # conn.send(b'who are you?')
        with open('favicon.ico', 'rb') as f:
            data = f.read()
        conn.send(data)
        conn.close()

    elif path =='/1.jpg':
        conn.send(b'HTTP/1.1 200 ok \r\nk1:v1\r\n\r\n')
        # conn.send(b'who are you?')
        with open('1.jpg', 'rb') as f:
            data = f.read()
        conn.send(data)
        conn.close()


while 1:
    conn, add = server.accept()
    t = Thread(target=communication,args=(conn,))
    t.start()
简单爬虫
键值对
User-Agent  使用,筛选判断是不是浏览器代理  不是不合法


import requests
# ret = requests.get('https://www.jd.com/')
# print(ret.content.decode('utf-8'))


反爬
ret = requests.get('https://kyfw.12306.cn/otn/leftTicket/init',headers={'User-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.108 Safari/537.36'})
print(ret.content.decode('utf-8'))

posted @ 2019-05-15 13:30  learnacode  阅读(142)  评论(0编辑  收藏  举报