内容概要
- 上节回顾
- 爬虫介绍
- request模块介绍
- request发送get请求
- request携带参数
- url编码解码parse
- 携带请求头
- 发送post请求,携带数据
- 自动登录,携带cookie的两种方式
- requests.session的使用
- 补充post请求携带数据编码格式
- 响应Response对象
- 编码问题
- 下载图片,视频
内容详细
上节回顾
# 1 上线架构图
# 2 购买云服务器
# 3 远程链接云服务器
-xshell
-fianlshell
# 4 安装mysql
-下载rpm包
-安装
-修改root用户密码
# 5 redis 源码
-在不同平台编译
-make make install
-做软连接:
# 6 python3.8
-安装前置软件
-下载源码包
-解压
# 7 安装uwsgi
# 8 安装虚拟环境
# 9 安装Nginx
1)启动
>: nginx
2)关闭nginx
>: nginx -s stop
3)重启nginx
>: nginx -s reload
4)查看端口,强行关闭
>: ps -aux|grep nginx
>: kill <pid:进程编号>
# 10 上线前端
编译vue:npm run build---》dist文件夹下
传到服务器:lrzsz
解压zip :unzip
copy到 /home/html
修改nginx配置文件,让它能够代理前端静态文件
# 11 后端上线
-修改后的代码,提交到git上
-云服务器:git clone下来
-logs文件必须要有
-安装所有依赖:先装能装的
-uwsgi上线:虚拟环境也要装
-uwsgi配置文件
-nginx 增加一个新增的server
# 12 数据库配置
-创建数据库
-新增用户
-录入数据
# 13 处理前端静态资源
STATIC_ROOT = ''
python manage_prod.py collectstatic
nginx代理
# 14 域名解析
# 开源项目赏析
https://gitee.com/huap/projects
# 期终架构可以写的项目
-1 考试系统
-学生端:
签到签退功能:人脸识别签到,迟到,忘记签到
-补签:老师审批
-日历
考试功能:
-每天早上:考试 10分钟 考昨天学过的内容
-选择题,填空题,简单题---》选择和填空自动阅卷
-简单版 简单题老师打分
-高级版:提交后,同学匿名互相阅卷---》1
-自动阅卷:网上有自动阅卷的方法
-考试分数高有积分功能
-错题本
刷题功能:
-面向对象,网络编程,生成一套试卷,刷题
积分功能
-考试成绩高
-积分兑换功能:学长简历,学长面试录音,学长笔试题带答案
-老师端
-每个班同学签到情况:echars画图
-阅卷
-修改分数
-超级管理员端
-老师和学生管理
-excel导入
-2 有过其他工作经历
-之前使用过的系统,想一下实现
-需求:仓储管理系统---》下午发给你们
-海运管理系统
-医院的管理系统
-会籍管理,客户管理 ,游泳馆:crm 客户关系管理
-3 开心幼儿园:app,幼儿园管理的app
-4 小程序商城,商城app
-二手汽车商城
-二手交易
-5 自动化运维的
-psutils
-paramiko:https://www.cnblogs.com/liuqingzheng/p/13642948.html
-6 自动化测试
-7 觉得哪个项目不错,仿写
-二次元 视频播放
-看漫画app
-小说网站
-8 rbac权限管理系统
-使用别人前端
-自己写后端
-9 数字藏品
-10 微信点单 奈雪的茶 小程序
-不要拿着别人的前端用,不要拿着被人代码读
-看到哪个页面比较好,把页面样式和html copy过去,自己写js代码
![image]()
爬虫介绍
# 爬虫是什么
-爬虫就是程序---》从互联网中,各个网站上,爬取数据[你能浏览的页面才能爬],做数据清洗,入库
# 爬虫的本质
-模拟方式http请求,获取数据---》入库
-网站
-app:抓包
# 补充:百度其实就是一个大爬虫
-百度爬虫一刻不停的在互联网中爬取各个页面---》爬取完后---》保存到自己的数据库中
-你在百度搜索框中搜索---》百度自己的数据库查询关键字---》返回回来
-点击某个页面----》跳转到真正的地址上
-seo:
-sem:充钱的
# 咱们学习的
-模拟发送http请求
- requests模块
- selenium
-反扒:封ip:ip代理,封账号:cookie池
-解析数据:bs4
-入库:mysql,redis,文件中
-爬虫框架:scrapy
request模块介绍
# 使用python如何发送http请求
# 模块:requests模块,封装了python内置模块urllib
使用requests可以模拟浏览器的请求(http),比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)
# 安装
pip3 install requests
request发送get请求
import requests
res = requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html')
print(res.text)
'''res是一个对象 我们需要响应体的内容(html内容):text'''
如果有的网站,发送请求,不返回数据,人家做了反扒---》拿不到数据,学习如何反扒
res = requests.get('https://dig.chouti.com/')
print(res.text)
request携带参数
import requests
方式一:直接拼接到路径中
# res = requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html?name=lqz&age=19')
方式二:使用params参数
res = requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html',params={'name':"lqz",'age':19}) # 字典形式
# print(res.text)
print(res.url) # https://www.4399.com/?name=jdj&age=9
'''打印url 携带的参数会拼接在路径里'''
url编码解码parse
import requests
from urllib.parse import quote,unquote
res = requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html',params={'name':"彭于晏",'age':19})
print(res.text)
如果是中文,在地址栏中会做url的编码:彭于晏:%E5%BD%AD%E4%BA%8E%E6%99%8F
print(res.url)
'https://www.baidu.com/s?wd=%E5%B8%85%E5%93%A5'
编码:
res=quote('彭于晏')
print(res)
解码:
res=unquote('%E5%BD%AD%E4%BA%8E%E6%99%8F')
print(res)
携带请求头
反扒措施之一,就是请求头
http请求中,请求头中有一个很重要的参数 User-Agent
-表明了客户端类型是什么:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
-如果没有带这个请求头,后端就禁止
'''django中间件:request.META.User-Agent 如果为None禁止访问
有值可以进一步增加条件筛选
'''
-request发送请求,没有携带该参数,所以有的网站就禁止了
'''以后访问被禁止优先请求头加入User-Agent,然后再看正常访问需要带哪些 比如cookies等'''
http请求头重要参数
:User-Agent,cookie,Connection
http协议版本间的区别:
Connection: keep-alive保持连接
http协议有版本:主流1.1 0.9 2.x
'''http(应用层) 基于TCP(传输层) 如果建立一个http链接---》底层创建一个tcp链接(三次握手 响应回数据,四次挥手,结束)
老版本(0.9)发一次http请求开一次tcp三次握手四次挥手,浪费资源'''
1.1比之前多了keep-alive # 不断开与TCP的连接 短时间内共用TCP连接
2.x比1.x多了 多路复用 # 1.x虽然共用一个TCP连接,但是需要排队,2.x不需要排队
3.x 底层基于UDP
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36'
}
res = requests.get('https://dig.chouti.com/',headers=headers)
print(res.text)
发送post请求,携带数据
import requests
# 携带登录信息User-Agent,携带cookie
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',
'Cookie': ''
}
# post请求,携带参数
data = {
'linkId': '38063872'
}
res = requests.post('https://dig.chouti.com/link/vote', headers=headers, data=data)
print(res.text)
双token认证:
'''我们携带的token放在请求头里,我们把token拿出来放到cookies也相当于是已登录状态(因为cokkies不能重复使用,token可以)
所以我们为了安全尽量减短token过期时间,但是用处不大
大招:双token认证
'''
自动登录,携带cookie的两种方式
登录功能,一般都是post:
'''华华手机'''
import requests
data = {
'username': '616564099@qq.com',
'password': 'lqz123',
'captcha': '3456', # 验证码
'remember': 1, # 记住密码
'ref': 'http://www.aa7a.cn/', # 重定向到上次访问地址
'act': 'act_login'
}
res = requests.post('http://www.aa7a.cn/user.php',data=data)
print(res.text)
# 响应中会有登录成功的的cookie,
print(res.cookies) # RequestsCookieJar 跟字典一样
# 拿着这个cookie,发请求,就是登录状态
# 访问首页,get请求,携带cookie,首页返回的数据一定会有 我的账号(右上角显示 表示登录成功)
携带cookie的两种方式
方式一:放到headers中》》是字符串
方式二:放到cookie参数中》》是字典或CookieJar对象
res1=requests.get('http://www.aa7a.cn/',cookies=res.cookies)
print('616564099@qq.com' in res1.text) # true
requests.session的使用
为了保持cookie ,以后不需要携带cookie,放在session
'''这个session不是我们所认为的session
就像支付宝的token不是jwt的token'''
import requests
data = {
'username': '616564099@qq.com',
'password': 'lqz123',
'captcha': '3456',
'remember': 1,
'ref': 'http://www.aa7a.cn/',
'act': 'act_login'
}
session = requests.session() # 得到一个session对象
res = session.post('http://www.aa7a.cn/user.php', data=data) # 用session对象发送请求
print(res.text)
res1 = session.get('http://www.aa7a.cn/') # 自动保持登录状态,自动携带cookie
print('616564099@qq.com' in res1.text) # true 往后用户session发送请求 不用携带cookies
补充post请求携带数据编码格式
import requests
1.data={}
data对应字典,这样写,编码方式是urlencoded
requests.post(url='xxxxxxxx',data={'xxx':'yyy'})
2.json={}
json对应字典,这样写,编码方式是json格式
requests.post(url='xxxxxxxx',json={'xxx':'yyy'})
3.终极方案,编码就是json格式
requests.post(url='',
data={'':1,},
headers={
'content-type':'application/json'
})
'''虽然数据放在请求头里,但还是可以通过终极方案指定数据格式
这个方案可以解决编码格式错乱问题:
比如用postman测试没有问题,写单元测试出了问题
如果我们后端用json格式返回数据没有问题,如果用data就会有问题
'''
响应Response对象
Response相应对象的属性和方法:
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
}
respone=requests.get('http://www.jianshu.com',headers=headers)
# respone属性
print(respone.text) # 响应体转成了字符串
print(respone.content) # 响应体的二进制内容 图片视频等
print(respone.status_code) # 响应状态码 http
print(respone.headers) # 响应头
print(respone.cookies) # cookie是在响应头,cookie很重要,它单独做成了一个属性
print(respone.cookies.get_dict()) # cookieJar对象---》转成字段
print(respone.cookies.items()) # cookie的键值对
print(respone.url) # 请求地址
print(respone.history) # 不用关注 历史地址 需要有重定向 才会有历史
'''.url只显示最新地址 。history可以看到重定向前的地址'''
print(respone.encoding) # 响应编码格式
编码问题
# 有的网站,打印
res.text --->发现乱码---》请求回来的二进制---》转成了字符串---》默认用utf8转---》
修改:response.encoding='gbk'
再打印res.text它就用gbk转码
下载图片,视频
import requests
# res=requests.get('http://pic.imeitou.com/uploads/allimg/230224/7-230224151210-50.jpg')
# # print(res.content)
# with open('美女.jpg','wb') as f:
# f.write(res.content)
#
res=requests.get('https://vd3.bdstatic.com/mda-pcdcan8afhy74yuq/sc/cae_h264/1678783682675497768/mda-pcdcan8afhy74yuq.mp4')
with open('致命诱惑.mp4','wb') as f:
for line in res.iter_content():
f.write(line)