爬虫----day01(爬虫介绍,request模块介绍,request发送get请求,request携带参数,url编码解码,携带请求头,post请求携带数据,下载图片,视频)

上节回顾

# 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

image
.
.
.

# 期终架构可以写的项目
	-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代码
-----------------------------------------------

.
.
.
.
.

今日内容

1 爬虫介绍

# 爬虫是什么
	-爬虫就是程序---》从互联网中,各个网站上,爬取数据[你能浏览的页面才能爬],做数据清洗,入库


# 爬虫的本质
	-模拟方式http请求,获取数据---》入库
    	-网站
    	-app:抓包


# 补充:百度其实就是一个大爬虫
	-百度爬虫一刻不停的在互联网中爬取各个页面---》爬取完后---》保存到自己的数据库中
    -你在百度搜索框中搜索---》百度自己的数据库查询关键字---》返回回来
    -点击某个页面----》跳转到真正的地址上
    -seo:
    -sem:充钱的


# 咱们学习的
	-模拟发送http请求
    	- requests模块
        - selenium
        -反扒:封ip:ip代理,封账号:cookie池
    -解析数据:bs4
    -入库:mysql,redis,文件中

    -爬虫框架:scrapy

.
.
.
.

2 request模块介绍

# 使用python如何发送http请求


# 模块:requests模块,封装了python内置模块urllib
	使用requests可以模拟浏览器的请求(http),比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)


# 安装
pip3 install requests

.
.
.
.
.

3 request发送get请求

import requests

# res = requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html')
# print(res.text)    # 拿相应体的内容


# 如果有的网站,发送请求,不返回数据,人家做了反扒
# 拿不到数据,学习如何反扒

# res = requests.get('https://dig.chouti.com/')
# print(res.text)

.
.
.
.
.

4 request携带参数


import requests

# 方式一:直接拼接到路径中

res = requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html?name=lqz&age=19')
print(res.text)
---------------------------------------------------

# 方式二:使用params参数
res = requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html',params={'name':"lqz",'age':19})
print(res.text)
print(res.url)   # 查看发送的请求的网址


.
.
.
.
.
.

5 url编码解码

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)
print(res.url)

https://www.cnblogs.com/liuqingzheng/p/16005866.html?name=%E5%BD%AD%E4%BA%8E%E6%99%8F&age=19
# 如果是中文,在地址栏中会做url的编码:
# 彭于晏:%E5%BD%AD%E4%BA%8E%E6%99%8F

---------------------------------------------------------

# url编码:
# res=quote('彭于晏')
# print(res)

# url解码
res=unquote('%E5%BD%AD%E4%BA%8E%E6%99%8F')
print(res)

.
.
.
.
.

6 携带请求头

# 反扒措施之一,就是请求头

# 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

# 如果没有带这个请求头,有些网址的后端就禁止
request发送请求,没有携带该参数,所以有的网站就禁止了

------------------------------------------------
------------------------------------------------

# http请求头重要的参数:
User-Agent,       cookie,        Connection

# 浏览器会将存在浏览器里面的所有cookie,在发送请求的时候,会放到请求头里面

# http协议版本间的区别
# Connection: keep-alive     # 保存连接
# http协议有版本:主流  0.9  1.1  2.x
# http 基于TCP 如果建立一个http链接---》底层创建一个tcp链接
# 1.1比之前多了keep-alive
# 2.x比1.x多了 多路复用一次tcp传输数据过程中,可能有多个http请求
-------------------------------------------------

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'
}
res = requests.get('https://dig.chouti.com/',headers=headers)
print(res.text)

.
image
image
.
.
.
.
.
.

7 发送post请求,携带数据


import requests

# 携带登录信息,请求携带cookie的第一种方式,放在请求头里
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',
    'Cookie': '把浏览器里面的Cookie字符串放这里'
}

# post请求,携带参数
data = {
    'linkId': '38063872'
}


res = requests.post('https://dig.chouti.com/link/vote', headers=headers, data=data)
print(res.text)

# 双token认证
使用账号密码登录服务器,会同时返回两个token。
access_token :【时效较短,很长就失去了意义,也是不安全的】
refresh_token:【时效较长,可以用来刷新access_token】。
如果都过期了,就需要重新登录。

token刷新机制,当活跃用户access_token快过期的时候,为了保证用户的体验度,
可以使用refresh_token刷新获取新的access_token。继续保持登录状态,
直到access_token和refresh_token都过期了,那就只能被踢下去,
重新输入账号密码登录了。

前端可以再次通过长时间的令牌refreshToken访问后端,来再签发一个短的token。

.
.
.
浏览器里面发送post请求,会将数据放在负载也就是Form Data里面
实际上就是请求体里面
image
image
.
.
.

8 自动登录,携带cookie的两种方式


# 登录功能,一般都是post,模拟登录网站

import requests

data = {
    'username': '',
    'password': '',
    '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,
# 拿着这个cookie,发请求,就是登录状态
print(res.cookies)        # RequestsCookieJar 跟字典一样

----------------------------------------------

# 访问首页,get请求,携带cookie,首页返回的数据一定会有 我的账号
# 携带cookie的两种方式
# 方式一写在headers中,方式二是字典或CookieJar对象

# 请求携带cookie的第二种方式,放到cookies参数中,实际上还是放在请求头里

res1=requests.get('http://www.aa7a.cn/',cookies=res.cookies)
print('616564099@qq.com' in res1.text)

.
.
.
.
.
.
.

9 requests.session的使用


# 每次发送请求都要带着cookies参数,代码写的嫌烦
# 但又为了保持cookie ,就封装了requests.session方法
# 自动维护cookie,每次发请求,会自动帮你放请求头里

import requests

data = {
    'username': '',
    'password': '',
    'captcha': '3456',
    'remember': 1,
    'ref': 'http://www.aa7a.cn/',
    'act': 'act_login'
}
session = requests.session()
# 得到session对象后,以后发送请求就不是用requests发了,用session发请求了


res = session.post('http://www.aa7a.cn/user.php', data=data)
print(res.text)
res1 = session.get('http://www.aa7a.cn/')
# 自动保持登录状态,自动携带cookie

print('616564099@qq.com' in res1.text)

.
.
.
.
.
.

10 补充post请求携带数据编码格式


import requests

# data对应字典,这样写,默认编码方式是urlencoded
requests.post(url='xxxxxxxx', data={'xxx': 'yyy'})


# json对应字典,这样写,编码方式是json格式
requests.post(url='xxxxxxxx', json={'xxx': 'yyy'})


# 终极方案,编码就是json格式
requests.post(url='',
              data={'': 1, },
              headers={
                  'content-type': 'application/json'
              })

# 上面的好像不对,data参数后面对应的字典好像要用json模块dumps将字典序列化成字符串才行

.
.
.
.
.
.
.

11 响应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)    # 响应状态码
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)    # 重定向前的地址

print(respone.encoding)    # 响应编码格式

.
.
.
.
.
.

12 编码问题


# 有的网站
response.text --------- 发现乱码
请求回来的响应数据原来是二进制 ----- 被转成了字符串 ----- 默认用utf8转的

# 可以试下指定编码的方式为 gbk 试试

response.encoding='gbk'

# 再 response.text     看看有没有转成正常中文

.
.
.
.
.
.

13 下载图片,视频

# 爬图片

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)

----------------------------------------------

import requests
# 爬视频
# 一般情况下,你应该以res.iter_content 的模式将文本流保存到文件

res=requests.get('https://vd3.bdstatic.com/mda-pcdcan8afhy74yuq/sc/cae_h264/1678783682675497768/mda-pcdcan8afhy74yuq.mp4',stream=True)
with open('致命诱惑.mp4','wb') as f:
    for line in res.iter_content():
        f.write(line)

# stream参数:一点一点的取,比如下载视频时,如果视频100G,
# 用res.content然后一下子写到文件中是不合理的

# 默认情况下是stream的值为false,它会立即开始下载文件并存放到内存当中,
# 倘若文件过大就会导致内存不足的情况.
# 当把get函数的stream参数设置成True时,它不会立即开始下载,
# 当你使用iter_content或iter_lines遍历内容或访问内容属性时才开始下载。
# 需要注意一点:文件没有下载之前,它也需要保持连接。

先找到该视频的链接
image
.
.
.
.
.
.

作业

1 上线
2 上课代码写写

3 找个美女图片网站,把图片都下载到本地
posted @   tengyifan  阅读(94)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示