产生的原因:
由于http是一个无状态的协议每次请求需要之前请求的一些信息,此时必须重新发送之前的请求。为了解决这种问题,产生了一种记录状态的技术,就是cookie和session。
cookie是在客户端记录状态。session是在服务端记录状态。
在做爬虫的时候,如果要实现登录,只需要将浏览器中登录后的cookie信息封装到请求头中就可以实现登录了
对于session会话,其本来的含义是指有始有终的一系列动作/消息。而在web中,会话对象用来存储特定用户会话所需的属性及配置信息
cookie指某些网站为了辨别用户身份、进行会话跟踪而存储在用户本地终端上的数据
cookie和session一般是配合使用的。当cookie被用户禁用,session怎么使用?
cookie的组成:
会话cookie和持久cookie
会话cookie:指存储在浏览器内存中的cookie,当浏览器关闭,会话cookie失效。
持久cookie:保存在硬盘上的cookie
这两种cookie的分配标准主要是通过maxAge或者expires这个cookie的字段来定义,负数–cookie
在爬虫中登录的实现方法有两种:
代理:代理服务器,proxy server
1、结构化数据
数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。常见的关系型数据库中以表存储的数据就是结构化的数据
2、半结构化数据
结构化数据的一种形式,并不符合关系型数据库或其他数据表的形式关联起来的数据模型结构,但包含相关标记,用来分隔语义元素以及对记录和字段进行分层。因此也被称为自描述的结构。
常见的半结构化数据有:xml、html、json
3、非结构化数据
没有固定的结构,常见的非结构化数据有:文档、图片、视频等。
对于非结构数据,一般通过整体存储二进制格式
json是js对象的字符串表达式,使用文本形式表示一个js对象的信息。
js的对象相当于python中的字典
js的数组相当于python中的列表
因为json用来存储js的对象或者数组,所以在python中可以将json转化为list或者dict
解析json的包json:
>=0
>=1
默认从头开始匹配,只匹配一次,返回一个match对象
pattern.match(
'要匹配的字符串',#必须指定
start,#匹配的开始位置
end,#匹配的结束位置
)
import re
pattern = re.compile(r'\d+')
content = 'sjdhgr12356dsitn45656'
m1 = pattern.match(content)
m2 = pattern.match(content,6)
m3 = pattern.match(content,6,8)
print(m1)
print(m2)
print(m3)
print(m2.group())
print(m3.group(0))
print(m2.span())
print(m2.start())
print(m2.end())
从任意位置匹配,只匹配一次,返回一个match对象
pattern.serach('要匹配的字符串',start,end,)
import re
content = 'asd123qwe456zxc789'
pattern = re.compile(r'\d+')
s1 = pattern.search(content)
s2 = pattern.search(content,6,15)
print(s1)
print(s1.group())
print(s2.group())
全文匹配,将匹配到的结果放到一个list中返回,多次匹配
pattern.findall('要匹配的字符串',start,end,)
import re
pattern = re.compile(r'\d+')
content = 'qwe12345axs789 160'
fa = pattern.findall(content)
print(fa)
全文匹配,多次匹配,返回一个包含匹配结果的迭代器
pattern.finditer('要匹配的字符串',start,end,)
import re
pattern = re.compile(r'\d+')
content = 'qwe123456qwe789 034'
fd = pattern.finditer(content)
for i in fd:
print(i.group())
切分字符串,按照整个表达式所指定的内容切分
str.split(',')#以,进行切分
pattern.split('要切分的字符串',切分次数)#不指定就是默认,默认全部切割
import re
pattern = re.compile(r'[\s,;]+')
content = 'a,b,,; c;d'
s = pattern.split(content)
print(s)
用指定的字符串,替换正则表达式匹配到的目标字符串的内容
pattern.sub(
repl,#替换成什么
content,#替换哪个
count,#替换次数,默认替换所有
)
import re
content = 'hello 123123,hello 456456'
pattern = re.compile(r'\d+')
res = pattern.sub('hi',content)
print(res)
content = 'age:"20"'
def add(match):
return (str(int(match.group())+2))
res = pattern.sub(add,content)
print(res)
分组时通过 ( ) 来表示的,一个括号就表示一个分组
分组的作用:
筛选特定内容
取分组内容可以通过match对象的group方法
match.group(1) # 表示取正则表达式中第一个括号的内容,以此类推
import re
content = '{name:"zhangsan",age:"10",hobby:["basktball","football","read"]}'
pattern = re.compile(r'{name:"(\w+)",age:"(\d+)".+')
match = pattern.search(content)
print(match.group(1))#zhangsan
print(match.group(2))#10
可以在同一个表达式的后面引用前面的分组表达式
import re
s = "正则表达式
"
pattern = re.compile(r'<(html)><(h1)>(.*)\2>\1>')
match = pattern.search(s)
print(match.group()) # 正则表达式
pattern = re.compile(
'正则表达式',
'正则表达式的模式'
)
正则表达式的模式有以下几种:
模式 说明
re.I 使匹配对大小写不敏感
re.M 多行匹配,影响^和$
re.S 使 . 匹配包括换行在内的所有字符
. * ? 配合re.S
import re
content = '{name:"zhangsan",age:"10",hobby:["basktball","football","read"]}'
pattern = re.compile(r'.*?"(.*?)".*?"(.*?)".*?')
match = pattern.search(content)
print(match.group())
print(match.group(1))
print(match.group(2))