基础知识
什么是程序?
指令集合 + 算法
程序之间的通信?
同台PC机器上 两台PC机器上 多台PC机器上
计算机网络的一些关键字
IP地址 IPV4, IPV6 子网掩码 默认网关 DNS MAC
交换机通信形式:
单播 组播
广播
路由器
用来连接不同的网段网段
一个局域网内的IP的范围网关
局域网的出入口
OSI 开放系统互连 七层协议
应用层 表示层 会话层 传输层 网络层 数据链路层 物理层
OSI 简化为五层协议
应用层: http/https/ftp/... 传输层: tcp/udp/... 四层交换机, 四层路由器 网络层: ip/icmp/... 路由器, 交换机 数据链路层: arp/... 以太网交换机, 网卡, 网桥 物理层: 传输电信号, 网线, 光纤, 中继器, 集线器
OSI 简化为四层协议
应用层 传输层 网络层 物理网络层
网络中大概的传输过程
a, 由应用层的发送端发送出数据, 注册添加首部信息, [层层处理之后], 最终走到物理层向外发送数据 b, 发送出的数据经过多个节点(交换机, 路由器)传输, 每个节点解析物理地址信息和网络信息, 并且添加到新的网络物理信息, 最终到达主机 c, 主机接收数据, 接收数据之后从物理层开始进行解析, 最终呈现到客户端的应用层.
网络主机
标识一台主机所在的网络的位置. 也就是其地址(URL)全球有13服务器, 构成了全球互联网
1台跟服务器
12台主服务器IP地址
一台主机在网络中的位置端口号
是网络地址中的一部分, 用于区分主机上不同应用程序.
可以理解为程序在主机上的唯一ID
在一个系统中, 所有的端口号都是唯一的.
端口号的数据值在0–65535之间域名:
127.0.0.1 localhost
14.215.177.38 www.baidu.comURL地址
http://www.baidu.com:80/com.cn/index.html
协议://域名:端口号/URI[GET参数]基于TCP协议的传输层
a, TCP传输的特征: 提供了可靠的数据传输, 在此过程中: 无丢失, 无失序, 无差错, 无重复 b, 传输的前提: 在传输之间建立好连接 c, 建立三次握手: 1, 客户端向服务器端发送SYN消息报文请求连接 2, 服务器接收请求之后, 回复ACK报文确定可以连接 3, 客户端接收消息回复, 发送ACK报文建立连接 SYN=1, seq=x SYN=1, ACK=x+1, seq=y SYN=1, ACK=y+1, seq=x+1
d, 断开连接的四次挥手
1, 主动方发送断开请求 2, 被动方接收到请求, 立即回复, 并且准备断开 3, 被动方准备就绪之后, 再次方法报文消息给主动方, 可以进行断开 4, 主动方发送最终确认报文, 断开连接 FIN + ACK + seq
SYN : 位数值1, 表示建立TCP连接
ACK : 表示验证字段
FIN : 位数值1, 表示断开TCP连接重点: 在整个过程中有 11 种状态.
和upd的比较
粘包问题的处理HTTP协议: 超文本传输协议
主要用在网页种的数据传输
属于OSI种的应用层协议
基于传输层的TCP协议
无状态, 不记录任何内容重点: HTTP1.0 和 HTTP1.1 和 HTTP2.0 版本之间的区别
客户端向服务器端发送数据就是请求
服务器端向客户端发送数据就是响应请求模块
a, 请求行: 包括具体的请求类别和请求内容 1, 请求格式 GET(POST)/HTTP1.1 请求类别 请求内容 版本信3息 2, 请求类型 GET: 获取网络资源 POST: 提交一定的信息, 并且得到反馈 HEAD: 只用于获取网络资源的响应头信息 PUT: 用于更新服务器资源 DELETE: 用户删除服务器资源 TRACE: 用来做测试 OPTIONS:用于获取服务器性能的信息 CONNECT:
3, 请求内容
表示要获取的具体的信息内容b, 请求头:
对于请求的进一步解释阐述
c, 空行
d, 请求体
可以理解为在请求的基础上, 对请求的更加细致的表达描述
响应模块
a, 响应行: 最基本的响应信息内容 1, 响应格式: HTTP1.1 200 OK 版本信息 响应状态码 附加信息
2, 响应状态码: 三位数的表示
1xx : 提示信息, 表示请求被接收
2xx : 响应成功
3xx : 重定向, 响应需要被进一步处理
4xx : 客户端发生错误
5xx : 服务器内部发生错误 b, 响应头:
Content-Type: text/html c, 空行
d, 响应体
响应的主体信息内容
python-多人聊天室
由服务端和客户端组成
service.py
''' |
client.py
''' 客户端 ''' |
知识点:python多线程、守护进程和join方法
守护线程与非守护线程:当一个进程启动时,会默认产生一个主线程。当设置多线程时,主线程会创建多个子线程,在python中,默认是非守护线程(setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到任务结束,程序结束。当我们使用setDaemon(True)时,设置子线程为守护线程,主线程一旦执行结束,则所有守护线程都被终止执行,程序结束。
join方法的作用就是线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束,主线程在执行。
举例:
python多线程默认情况
import threading
import time
def run():
time.sleep(2)
print('当前线程的名字是: ', threading.current_thread().name)
time.sleep(2)
if __name__ == '__main__':
start_time = time.time()
print('这是主线程:', threading.current_thread().name)
thread_list = []
for i in range(5):
t = threading.Thread(target=run)
thread_list.append(t)
for t in thread_list:
t.start()
print('主线程结束!' , threading.current_thread().name)
print('一共用时:', time.time()-start_time)
关键点:
* 主线程结束,打印出主线程的用时
* 主线程结束之后,子线程执行,子线程执行完毕,程序结束
设置守护线程
import threading
import time
def run():
time.sleep(2)
print('当前线程的名字是: ', threading.current_thread().name)
time.sleep(2)
if __name__ == '__main__':
start_time = time.time()
print('这是主线程:', threading.current_thread().name)
thread_list = []
for i in range(5):
t = threading.Thread(target=run)
thread_list.append(t)
for t in thread_list:
t.setDaemon(True)
t.start()
print('主线程结束了!' , threading.current_thread().name)
print('一共用时:', time.time()-start_time)
关键点:
- 子线程设置为守护线程,主线程结束以后,终止所有守护线程,程序直接结束
join方法
import threading
import time
def run():
time.sleep(2)
print('当前线程的名字是: ', threading.current_thread().name)
time.sleep(2)
if __name__ == '__main__':
start_time = time.time()
print('这是主线程:', threading.current_thread().name)
thread_list = []
for i in range(5):
t = threading.Thread(target=run)
thread_list.append(t)
for t in thread_list:
t.setDaemon(True)
t.start()
for t in thread_list:
t.join()
print('主线程结束了!' , threading.current_thread().name)
print('一共用时:', time.time()-start_time)

关键点:
- 每个线程都使用了join方法,主线程要等待join容器里面的所有线程执行完毕了才能继续执行
聊天室问题
##错误代码: |
因为两个子线程都设置为守护线程,且子线程是无限循环,所有当第一个子线程执行join方法时,第一个子线程一直在执行,第二个子执行和主线程一直在等待,程序无法正确执行。
##正确代码
for t in threads:
t.setDaemon(True)
t.start()
t.join()
两个子线程设置为守护线程,如果不使用join方法,则主线程执行结束,会终止两个子线程,所以在第二个子线程使用join方法,这时第一个子线程和第二个子线程都是执行,主线程等待,程序正确执行
```
```
Django开发
在web开发中, 都是需要以HTTP/TCP协议作为基本支撑的
只要是客户端向服务器端发送的都叫做<请求>
只要是服务器端向客户端发送的都叫做<响应>
Django 采用了MVT的软件设计模式,
M: Model(模型)
V: View(视图)
T: Template(模板)
首先, 需要了解Django, 然后准备好开发环境.
还需要了解, 目前开发的几大架构方式
C/S架构: Client/Server
B/S架构: Browser/Server
RIA架构: Rich Internet Applicationss 富客户端网络应用
Django中的核心功能:
无需sql语句即可以快速实现数据库操作.
url映射匹配处理
模板系统
表单处理
http处理
站点处理
强大的后台管理
等等
Django中的核心组件
Templates:
用来存放web应用中所需要的所有html静态页面
Urls:
路由表, 用于解析浏览器发送的url地址, 并且把该地址交给特定的程序处理
Views:
视图控制器, 用于具体显示接收浏览器发送的请求数据, 并且进行处理和响应
Model:
实现了程序与数据库的对应(ORM)
安装Django的方式:
pip install django
或者
pip install django -i https://pypi.douban.com/simple
检测Django是否安装成功
在cmd输入 python -m django –version
使用命令创建项目
django-admin startproject empSystem
django-admin 是命令
startproject 是指令
empSystem 是项目名称, 可以随意修改
在创建完工程之后, 会出现几个非常重要的文件
manage.py 管理(处理)整个项目
在项目的文件夹中:
settings.py 项目中的全局配置文件
urls.py web站点的根目录, 用于设定url的响应程序的路由
wsgi.py 用户该项目与WSGI兼容的web服务器入口
备注: wsgi: 网关服务器接口
在这里可以进行简单的测试, 测试manage.py是否可用
首先进入到项目中:
cd empSystem;
然后:
python manage.py –version
可以启动服务器, 用来检测整个Django的开发环境是否成功
python manage.py runserver 8000
然后进入到浏览器访问: loacalhost:8000, 查看是否能够看到”小火箭”
注意: 启动程序的端口号不要被占用了
关闭服务器的方式:
CTRL + C 或者 CTRL + BREAK
开始开发项目, 创建出需要的子模块
python manage.py startapp app
startapp 创建子模块的指令
app 是创建的子模块的名称, 可以修改.
在创建的子模块中会出现几个非常重要的py文件
admin.py 用于定义本模块的自定义管理页面
apps.py 本模块的属性文件
models.py 本模块对应的数据库中表的映射关系(ORM)
tests.py 单元测试的文件
views.py 本模块中的视图调度模块
创建好子模块之后, 马上把该子模块加入到settings.py的全局配置中.
INSTALLED_APPS中
然后在子模块中创建出templates文件夹, 用于存储所有的html文件
然后再子模块中创建出static文件夹,用于存储所有的静态资源
在static文件夹中可以创建
css 用于存储css文件
scripts 用于存储JavaScript脚本文件
images 用于存储图片资源
Django中默认使用的数据库为SQLite3
在子模块的models.py中写实体对象与数据库中的表的对应关系
每一个实体对象(类), 都必须要继承models.Model
Anacodna安装Scrapy 爬虫项目
爬取网络数据:
1, 获取到整个网站信息
2, 对网站进行结构化分析
3, 获取到需要得数据
4, 把数据进行存储
5, 分析数据
…
Scrapy是适用于Python的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
scrapy得核心组件
Scrapy Engine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。
Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
Downloader Middlewares(下载中间件):一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件):一个可以自定扩展和操作引擎和Spider中间通信的功能组件。
制作 Scrapy 爬虫 一共需要四步:
1, 新建项目 :新建一个新的爬虫项目
2, 明确目标 (编写items.py):明确你想要抓取的目标
3, 制作爬虫 (spiders/xxspider.py):制作爬虫开始爬取网页
4, 存储内容 (pipelines.py):设计管道存储爬取内容
安装scrapy模块, 准备爬虫环境
首先, 需要下载安装Twisted模块库, 如果没有该模块, 那么在安装scrapy得时候, 很可能会报错.
然后, 安装scrapy
强烈建议使用豆瓣镜像安装
创建项目
通过命令创建项目
scrapy startproject douban
scrapy 是命令
startproject 是创建项目得指令
douban 是项目得名称, 可以随意修改
这里要特别注意, 在写完一条命令之后, 不要习惯性得加分号!!!
可以使用tree /f 命令查看项目工程结构目录
创建核心爬虫脚本程序
首先, 需要进入到项目
cd douban
然后, 使用命令:
scrapy genspider 爬虫脚本名称 访问网站得域名
scrapy genspider moviespider douban.com
检测程序与网站之间得连接
scrapy shell 网站的url地址
scrapy shell http://www.douban.com
如果我们在测试的时候得到"200"状态码, 表示连接网站正常.
有可能在测试的时候, 得到服务器的响应状态码为"403", 这就是由于网站中设置了"反爬机制".
我们可以去网上多多了解网站的"反爬机制".
解决一般"反爬"方式, 设置user-agent 用户代理信息的列表,
随机以不同的"用户头"访问, 模拟不同的用户访问.
在项目中创建rotate_useragent.py文件.
文件中设置各种的user-agent值
还要把写好的rotate_useragent.py文件配置到settings.py中
DOWNLOADER_MIDDLEWARES = {
'douban.middlewares.DoubanDownloaderMiddleware': 543,
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware':None,
'douban.rotate_useragent.RotateUserAgentMiddleware':400
}
接下来就可以对网站进行分析, 编写爬虫程序.
也需要大家对xpath技术有所了解
我们可以把获取到的数据放入到mysql数据库, 放入到CVS文件, 放入到xls文件, 放入到json文件, 放入到文本文件, 等等
比如存入到mysql数据库, 就需要mysql的支持模块
比如放入到CVS文件, 就需要CVS文件的支持模块
比如放入到xls文件, 就需要xls文件的支持模块
通过: scrapy crawl 爬虫文件名, 运行项目
人工智能
刚才项目中用到的技术:
numpy
matplotlib
pandas
Echarts
神经网络
K-Means 做大数据方面 客户价值分析等
比如: 航空大数据客户价值分析, 通过LRFMC数据模型的建立, 数据抽取, 数据清洗, 数据规约, 数据变化以及模型训练对客户价值进行分析,并得出精准营销办法.
在后期的知识储备中需要有:
numpy, pandas, matplotlib, scipy, scikit-learn, …
推荐一个工具:
jupyter notebook
人工智能学科体系结构:
人工智能基础:
扎实的数学基础: 线性代数, 高数, 概率论, 统计学, 运筹学…
常用的相关开发语言: Python, R 等
Python中用户科学计算的各种模块库, 封装了大量的API实现矢量运算
机器学习:
人工智能的入门学习: 监督学习和非监督学习
核心学习算法的应用模型: 逻辑斯蒂回归, 随机梯度下降, SVC支持向量机, 贝叶斯, K近邻等等
Scikit-learn, 这是python中专门用于机器学习的核心及经典模块库, 实现了各种学习模型的算法
注意: SVM, SVC, SVR的区别!!!
深度学习:
推荐常用的框架Tensorflow
回归算法的实现: 最小二乘法, 数据拟合残差值, 自我实现sklearn中的算法, 等等
科学计算与数据分析
可以说是一个人工智能方向的分支, 也可以说是人工智能的基础
需要使用到数据学相关专业知识.
最主要的两方面内容:
1, 研究数据本身
2, 为自然科学和社会科学研究提供一种新方法, 主要用到多维矩阵和矢量运算.
机器学习:
是人工智能的主要领域, 也是人工智能算法的基础
机器学习中涵盖了很多相关交叉学科: 概率论, 统计学, 逼近论, 凸分析, 算法复杂度理论, 等等.
专门用来研究计算机怎样模拟或者实现人类的学习行为, 以获取新的知识点或者技能, 重新组织已有知识结构, 使之段改善自身的性能.
监督学习:
分类学习 和 回归预测
数据特征及任务:
二分类问题, 多分类问题
算法:
LogisticRegression, SGDClassifier, LinearSVC, MultimormialNB, KNeighborsClassifier, …
非监督学习:
数据聚类 和 特征降维
数据聚类: K-means聚类分析
特征降维: 将众多的特征值进行精简和筛选, 得出最能区别数据之间差异的维度选项
核心模块库介绍:
scipy
在科学计算中是一个典型的依赖工具库, 全面支持numpy 和 pandas的模块使用, 我们也可以单独使用.
该模块库是统计学各种统计算法和基础理论的实现库.
numpy
为pytho语言提供了全新的数组类型, 可以快速实现 多维矩阵 以及 常用矢量计算.
该模块库是 高等数学 和 线性代数 等 数学原理的实现库.
pandas
科学计算数据分析的核心模块库.
在numpy和scipy的支撑下, 快速完成对两个基础模块进行二次封装, 提供更加简洁的API函数完成数据的处理和统计分析,
同时添加其特有的数据类型和数据处理的API
matplotlib
数据可视化的基础模块库, 实现数据的可视化呈现, 以各种直观的图标形式, 快速展现数据特征和变化趋势
深度学习
人工智能的应用技术领域
深度学习的概念源于人工神经网络得研究, 含多层的多层感知器, 就是一种深度学习的结构.
深度学习通过组合低层3形成更加抽象的高层表示属性类别或特征, 以发现数据的分布式特征表示.
掌握的知识点:
数据拟合
回归计算
最小二乘积的实现
残差均方值的计算
拓展:
CNN, RNN (LSTM) 等常用的神经网络 以及 常用的学习模型 和 具体实现方法