一、cookie和session
1、什么是cookie和session?
cookie是网站用来辨别用户身份,进行会话跟踪,存储在本地终端上的数据。
session(会话)起来本含义是指有始有终的一系列动作和消息。在web中,session主要用来在服务器端存储特定用户对象会话所需要的信息。
2、cookie和session产生的原因:
http协议是一个无状态协议,在特定操作的时候,需要保存信息,进而产生了cookie和session。
3、cookie原理:
由服务器来产生,浏览器第一次请求,服务器发送给客户端进而保存。
浏览器继续访问时,就会在请求头的cookie字段上附带cookie信息,这样服务器就可以识别是谁在访问了。
但是cookie存在缺陷:
1、不安全--本地保存,容易被篡改。
2、大小受限,本身最大4kb。
cookie虽然在一定程度上解决了‘保持状态’的需求,但是我们希望有一种新的技术可以克服cookie缺陷,这种技术就是session。
4、session原理:
session在服务器保存。----解决安全问题。
问题来了:服务器上的session,但是客户端请求发送过来,服务器如何知道session_a,session_b,到底和那个请求对应。
所以为了解决这个问题:cookie就作为这个桥梁。在cookie有一个sessionid字段,可以用来表示这个请求对应服务器中的哪一个session。
禁用cookie,一般情况下,session也无法使用。特殊情况下可以使用url重写技术来使用session。
url重写技术:将sessionid拼接到url里面。
session的生命周期:服务器创建开始,有效期结束(一般网站设定都是大约30分钟左右),就删除。
5、常见误区:打开浏览器中的一个网页,浏览器关闭,这个网页的session会不会失效?
不会,服务器到底删除不删除session,由session的生命周期。有效期结束,就会被删除。
6、cookie的字段
(1)Name : 该的名称。一旦创建, 该名称便不可更改。
(2)value : 该cookie 的值。如果值为Unicode 字符, 需要为字符编码。如果值为二进制数据, 则需要使用BASE64 编码。
(3)Domain : 可以访问该cookle 的域名。例如, 如果设置为.zhihu.com , 则所有以zhihu.com 结尾的域名都可以访问该cookie。
(4)MaxAge : 该cookie 失效的时间, 单位为秒, 也常和Expires一起使用, 通过它可以计算出其有效时间。Max Age 如果为正数, 则该cookie 在Max Age 秒之后失效。如果为负数, 则关闭浏览器时cookie 即失效, 也不会以任何形式保存该cookie 。
(5)Path : 该cookie 的使用路径。如果设置为/path/ , 则只有路径为/ path / 的页面可以访问该cookie 。如果设置为/ , 则本域名下的所有页面都可以访问该cookieo
(6)Size 字段: 此Cookie 的大小。
(8)HTTP 字段: cookie 的httponly 属性。若此属性为true , 则只有在HTTP 头中会带有此Cookie 的信息, 而不能通过document.cookie 来访问此Cookie。
(9)Secure : 该cookie 是否仅被使用安全协议传输。安全协议有H TTP s 和SSL 等, 在网络上传输数据之前先将数据加密。默认为false。
7、会话cookie和持久cookie
会话cookie:Max Age 为负数,则关闭浏览器时cookie 即失效,保存在内存中的cookie。
持久cookie:Max Age 如果为正数, 则该cookie 在Max Age 秒之后失效。保存在硬盘上的cookie
持久化:将内存中数据持久化到硬盘上。其实就是数据保存到文件或者数据库中。
内存主要的作用就是由于速度快速度快,启动应用软件或者程序的时候,就会分配一定内存空间作为该程序运行内存。
内存一旦断点,就会被清空。
序列化:将对象持久化到硬盘中。
8、用requests登录页面。
(1)将登录后的cookie封装到请求头字典中,这样就可以了。
案例:人人网登录
二、代理
1、代理作用
192.168.0.101
(1)突破自身IP 访问限制, 访问一些平时不能访问的站点。
(2)访问一些单位或团体内部资源: 比如使用教育网内地址段免费代理服务器, 就可以用于对教育网开放的各类FTP 下载上传, 以及各类资料查询共享等服务。
(3)提高访问速度:通常代理服务器都设置一个较大的硬盘缓冲区, 当有外界的信息通过时, 同时也将其保存到缓冲区中, 当其他用户再访问相同的信息时, 则直接由缓冲区中取屮信息传给用户, 以提高访问速度。
(4)隐藏真实IP : 上网者也可以通过这种方法隐藏自己的IP , 免受攻击。对于爬虫来说, 我们用代理就是为了隐藏自身IP , 防止自身的被封锁。
2、代理的分类
(1)根据协议区分
根据代理的协议, 代理可以分为如下类别。
FTP 代理服务器:主要用于访问FTP 服务器, 一般有上传、下载以及缓存功能, 端口一般为21 、2121 等。
HTTP 代理服务器:主要用于访问网页, 一般有内容过滤和缓存功能, 端口一般为80 、8080 、3128 等。
SSL/TLS 代理:主要用于访问加密网站, 一般有SSL 或TLS加密功能( 最高支持128 位加密强度) , 端口一般为443 。
RTSP 代理:主要用于访问Real 流媒体服务器, 一般有缓存功能, 端口一般为554 。
Telnet 代理:主要用于telnet 远程控制( 黑客人侵计算机时常用于隐藏身份),端口一般为23 。
POP3/SMTP 代理:主要用于POP3/SMTP 方式收发邮件, 一般有缓存功能, 端口一般为110 / 25 。
SOCKS 代理:只是单纯传递数据包, 不关心具体协议和用法, 所以速度快很多, 一般有缓存功能, 端口一般为1080 。SOCKS 代理协议又分为SOCKS4 和SOCKS5 , 前者只支持TCP ,而后者支持TCP 和UDP , 还支持各种身份验证机制、服务器端域名解析等。简单来说,SOCKS4 能做到的SOCKS5 都可以做到, 但SOCKS5 能做到的SOCKS4 不一定能做到。
(2)根据匿名程度区分
根据代理的匿名程度, 代理可以分为如下类别。
高度匿名代理: 会将数据包原封不动地转发, 在服务端看来就好像真的是一个普通客户端在访问, 而记录的IP 是代理服务器的IPO
普通匿名代理: 会在数据包上做一些改动, 服务端上有可能发现这是个代理服务器, 也有一定几率追查到客户端的真实伊代理服务器通常会加人的HITP 头有HTTP_VIA 和HTTP_X_FORWARDED FOR 。
透明代理:不但改动了数据包, 还会告诉服务器客户端的真实IPO 这种代理除了能用缓存技术提高浏览速度, 能用内容过滤提高安全性之外, 并无其他显著作用, 最常见的例子是内网中的硬件防火墙。
间谍代理:指组织或个人创建的用于记录用户传输的数据, 然后进行研究、监控等目的的代理服务器。
3、代理的设置
proxies = {
'http':'http://114.99.11.179:9999',#http和https都可以用http作为key
}
response = requests.get/post(proxies = proxies)
三、正则表达式
(一)元字符
1、匹配边界
^ ---行首
$---行尾
2、表示重复次数
? ---0或者1
* ---->=0
+ --- >=1
{n,}--->=n
{n,m}---》n,《m
{n}---n次
3、匹配文字
[]----表示匹配单字符
[abc]--匹配a或者b或者c中的其中一个
[a-zA-Z0-9]---匹配所有小写,大写和数字中的一个
\b---单词的边界
\d---表示数字
\w--数字、字母、下划线
\s---空白字符(空格,换行,制表)
.---除换行以外的任意字符
(二)re模块
1、re模块使用步骤
#(1)导包
import re
#(2)将正则表达式编译成一个pattern对象
pattern = re.compile(
r'正则表达式',
'匹配模式',#可以不指定,默认就按正则表达式本来的含义进行匹配。
)
正则匹配模式:
re.S----.可以匹配换行符
re.I---忽略大小写
#(3)pattern对象的方法(match,search、findall)匹配字符串。
match对象的属性:
match.group()等价于match.group(0)----返回匹配结果内容
match.span()--匹配范围
match.start()
match.end()
2、pattern对象的方法
(1)match方法:默认从头开始匹配,只匹配一次,返回一个match对象
Match对象 = pattern.match(
string,#要匹配的目标字符串
start,#要匹配目标字符串的起始位置(可选)
end#结束位置(可选)
)
(2)search 方法:全文匹配,只匹配一次,返回一个match对象
Match = pattern.search(
string,#要匹配的目标字符串
start,#要匹配目标字符串的起始位置(可选)
end#结束位置(可选)
)
(3)findall方法:全文匹配,匹配多次,返回一个list
list= pattern.findall(
string,#要匹配的目标字符串
start,#要匹配目标字符串的起始位置(可选)
end#结束位置(可选)
)
(4)finditer方法:全文匹配,匹配多次,返回一个迭代器,迭代器里面存储的是match对象
迭代器= pattern.findall(
string,#要匹配的目标字符串
start,#要匹配目标字符串的起始位置(可选)
end#结束位置(可选)
)
什么是迭代器?
当有一种数据或者内容比较多的时候,可以将其分装迭代器。---通过for循环来使用这个迭代器就可以获取其中的每一个数据。
有__next__和__iter__。
可迭代对象?有__iter__方法对象。
str
bytes
list
dict
tuple
文件流
需求:打印输入文件内容,同时输出行号。
(5)split:安正则方法表示内容进行分割字符串,返回分割后子串list
Pattern.split(
String,
Maxsplit#指定最大分隔次数,默认全部分隔,可选
)
http://www.baidu.com:8080/index.html
(6)sub:按照正则表示的内容替换字符串(重要的)
Pattern.sub(
repl, #替换成什么
String,#替换什么
Count#替换次数,可选,默认全部替换
)--->替换后的字符串
(1)repl字符串
import re
p = re.compile(r'(\w+) (\w+)')
s = 'hello 123,hello 456'
#提前用p去匹配目标串,找到能匹配出来的内容,就是替换找出来的这个内容的。
print(p.sub(r'hello world',s))#使用‘hello world'替换'hello 123'和'hello 456'
print(p.sub(r'\2 \1',s))#引用分组
(2)当repl是一个函数的时候,这个函数是有要求的:
a、必须带一个参数,这个参数其实就是提前用p去匹配目标串,得到match对象。
b、这个函数必须有返回值,返回值是一个字符串,这个字符串将来就作为替换的内容。
3、分组
分组在正则表达式中就是用()来表示的。一个括号就是一个分组。分组的作用主要有以下两个:
(1)筛选特定内容
(2)引用分组
4、贪婪非贪婪模式
(1)贪婪是用*来控制,python默认是贪婪模式,所以默认所有的数量控制符都是取所能匹配的最大值。
(2)非贪婪是用?来控制的,?放在数量控制符后面,表示数量控制符匹配最小的次数。
5、.*?大法