爬虫入门操作
re模块
import re
s =
"eva jason tony yuan
jason jason
jason a"
# res = re.findall('j.*?n', s) # 返回所有满足匹配条件的结果,放在列表里
# print(res)
findall(正则,文本数据)
在匹配的时候是全局匹配不会因为匹配到一个就停止
返回的结果是一个列表 内部包含正则匹配到的所有内容
res = re.finditer('j.*?n', s)
for i in res:
print(i.group())
finditer (正则,文本数据)
返回的结果是一个迭代器(节省内存)只有我们主动去索要数据才会产生 否则只占据一块空间
res = re.search('j.*?n', s)
print(res)
search 匹配到一个符号的数据就结束
res1 = re.match('j.*?n', s)
print(res1)
match 只能从头开始匹配 头部不符合直接停止
import re
ret = re.findall('www.(oldboy).com', 'www.oldboy.com')
print(ret)
findall 分组优先展示
会优先展示括号内正则表达式匹配到的内容
ret = re.findall('www.(?:oldboy).com', 'www.oldboy.com')
print(ret)
ret = re.findall('www.(?:baidu|oldboy).com', 'www.oldboy.com')
print(ret)
取消分组优先展示 前面加上问号和冒号
爬虫模块:requests
作用
可以模拟浏览器发送网络请求以获取数据
下载
命令:pip3 install requests
切换国内仓库使其下载速度更快
pip3 install requests -i 仓库地址
导入requests模块
import requests
网络请求的方法
方法大约有8个现在我们需要掌握的有两个
get请求
向别人索要数据
类似于浏览器输入百度地址回车就是在发送get请求向百度的服务器索要百度的首页
get请求可以携带额外的数据 但是数据量有限制最多2-4kb 并且直接写在网址的后面
url?xxx=yyy&mmm=nnn
post请求
向别人提交数据
用户注册登录需要输入用户名和密码之后点击按钮发送post请求将数据提交给远程服务器
post请求也可以携带额外的数据 且数据没有大小的限制 敏感性数据都是有由post请求携带
数据放在请求体中
http协议(重要)
规定了浏览器与服务端之间的数据交互的方式
四大特性
1.基于请求响应
2.基于TCP、IP作用于应用层之上的协议
3.无状态 不保存客户端的状态 记忆口诀:纵使见她千百遍 我都待她如初见
4.无连接
数据请求格式
get请求数据格式
请求首行(请求方法 地址...)
请求头(一对k:v的键值对)
换行
请求体(get请求没有请求体但是post请求有里面是敏感数据)
post响应数据格式
响应首行(请求方法 地址...)
响应头(一堆K:V键值对)
换行
响应体(一般是浏览器展示给客户看的数据)
响应状态码
用简单的数字来表示中文的含义(类似于指定暗号)
1xx:服务端已经收到了我们的数据正在处理 可以继续提交或者等待
2xx:200 表示ok 请求成功了服务端给我们的响应
3xx:重定向(原本想访问A页面但是内部自动跳转到了B页面)(我现在要买个东西准备下单了但是直接跳转到了用户登录的界面)
4xx:403请求不符合条件 404请求的资源不存在
5xx:服务器内部错误
公司还会自己定义响应状态码(http自带的状态码太少)
参考网站:聚合数据
requests模块的基本使用方法
发送网络请求
import requests requests.get(url) 发送get请求 requests.post(url) 发送post请求
简单地get请求获取页面并报错
import requests
朝百度发送get请求获取首页数据
res = requests.get('https://www.baidu.com/')
print(res.status_code) 获取响应状态码
指定字符编码
res.encoding = 'utf8'
print(res.text) 获取网页字符串数据
print(res.content) 获取bytes类型的数据(在python中可以直接看成是二进制)
with open(r'baidu.html', 'wb') as f:
f.write(res.content)
携带参数的get请求
requests.get(url,params={})
如何携带请求头数据
requests.get(url,headers={})
防爬的措施
校验当前的请求是否是浏览器发出的
校验的核心在于请求头里面的User-Agent键值对
只要请求当中含有这个键值对就表示我是一个浏览器
没有就不是一个浏览器
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/93.0.4577.63 Safari/537.36
只要将上述的代码在请求头中加上就可以了
requests.get(url,headers={...})
可以先定义一个请求头headers