爬虫介绍、requests模块发送get请求、get请求携带参数、携带请求头、携带cookie、发送post请求、响应Response、获取二进制数据、解析json
# 期终架构 -后台管理: -统计总人数,统计近一个月新增人数 -操作记录 -监控大屏 -修改密码:不能使用之前三次用过的密码 -登录记录ip地址,如果不是常用地址ip,异步发送短信提醒,邮件,钉钉通知 -服务器性能:网卡出入情况,硬盘占用,cup核心数,cup占用率,内存占用率。。。 -前台 -验证码:滑动验证码,集成 -第三方登录:qq,微信扫码登录 -人脸识别登录:百度 -前端:vue -网上找别人,往你项目中贴 -不要在意页面的好看与否 -postman测试 -考试系统: -学生端 -签到,签退点击签到(),人脸识别签到 -签到日历 -随机考 -固定试卷考试 -月考 -日考:签到完开始考试30分钟结束,自动交卷 -选择,填空,简答(老师阅卷,自动阅卷,同学相互阅卷) -积分系统:考试成绩加分,阅卷加分,扣分, -分数到2000分,解锁新功能:简历系统,录音 -老师端 -总体签到签退情况 -老师阅卷 -查成绩,加评语 -管理员端 -所有操作 -独立完成前后端分离基于rbac的权限控制 -移动app
# 1 购买阿里云服务器 -都买阿里云(腾讯云,华为云...) -自己的服务器:私有云(机房在自己公司:恒温恒湿) -混合云 -生产机:xshell链接,ssh 22端口 # 2 部署架构图 # 3 安装git # 4 安装mysql -rpm安装 -二进制安装。。 # 5 redis:源码 make make install # 6 python3.8 -python2.7 -pyhton3.6 -pyton3.8 -/user/local/python38 没有bin加入环境变量---》软连接 # 7 uwsgi:软件(真实环境和虚拟环境都要装) pip install uwsgi # 8 配置虚拟环境 # 9 nginx -代理静态文件 -请求转发 -负载均衡 server { listen 80; server_name 127.0.0.1; charset utf-8; location / { root /home/html; index index.html; try_files $uri $uri/ /index.html; # 解决vue路由问题 } location /static { alias /home/luffy_api/luffy_api/static; } } server { listen 8080; server_name 127.0.0.1; charset utf-8; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8888; uwsgi_param UWSGI_SCRIPT luffy_api.wsgi; uwsgi_param UWSGI_CHDIR /home/luffy_api/; } } # 负载均衡配置 http { upstream lqz { server 192.168.30.128:80; server 192.168.30.135:80; } server { listen 81; server_name www.xuniji.one.com; location / { proxy_pass http://lqz; } } } # 部署前端项目 -vue----》编译成 html,css,js -xx.vue -less,sass ---》编译成css -typescript ---》js -浏览器识别不了 -编译工具集成到一起:webpack---》vue-cli -npm run build -传到服务器,解压,配置nginx代理 # 部署后端 -git 拉下来 -切换到虚拟环境中,安装依赖,uwsgi -pip freeze >req.txt -pip install -r req.txt #配置数据库:创建luffy库,创建用户luffy_api,密码 # 启动 uwsgi, manage.py 启动 # luffyapi.xml uwsgi的配置 8888 uwsgi协议启动的 # nginx:8080---》8888 # 混合项目的静态资源 -收集 -nginx代理
今日内容
1 爬虫介绍
# 爬虫:spider,网络蜘蛛 # 本质原理: -现在所有的软件原理:大部分都是基于http请求发送和获取数据的 -pc端的网页 -移动端app -模拟发送http请求,从别人的服务端获取数据 -绕过反扒:不同程序反扒措施不一样,比较复杂 # 爬虫原理 -发送http请求【requests,selenium】----》第三方服务端----》服务端响应的数据解析出想要的数据【selenium,bs4】---》入库(文件,excel,mysql,redis,mongodb。。) -scrapy:专业的爬虫框架 # 爬虫是否合法 -爬虫协议:每个网站根路径下都有robots.txt,这个文件规定了,该网站,哪些可以爬取,哪些不能爬 # 百度:大爬虫 -百度搜索框中输入搜索内容,回车,返回的数据,是百度数据库中的数据 -百度一刻不停的在互联网中爬取各个页面,链接地址--》爬完存到自己的数据库 -当你点击,跳转到真正的地址上去了 -核心:搜索,海量数据中搜索出想要的数据 -seo:免费的搜索,排名靠前 -sem:花钱买关键字
2 requests模块发送get请求
# 模拟发送http请求的模块:requests 不仅仅做爬虫用它,后期调用第三方接口,也是要用它的 # pip3 install requests -本质是封装了内置模块urlib3 import requests res=requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html') print(res.text) # http响应体的文本内容
3 get请求携带参数
# 2 发送get请求携带数据 # 2.1 地址栏中拼接 # res=requests.get('https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3') # print(res.text) # 2.2 使用params参数携带 # res=requests.get('https://www.baidu.com/s',params={ # 'wd':'美女', # 'name':'lqz' # }) # print(res.text) # https://www.baidu.com/s?wd=美女&name=lqz ## url编码和解码 # 美女被url编码后--》 # %E7%BE%8E%E5%A5%B3 # %E7%BE%8E%E5%A5%B3 from urllib import parse # res=parse.quote('美女') # print(res) res=parse.unquote('%E7%BE%8E%E5%A5%B3') print(res)
4 携带请求头
# http 请求,有请求头,有的网站,通过某些请求头来做反扒 # 3 请求头中带数据---->爬取某个网站,不能正常返回,模拟的不像 # 网站做反扒,没有携带请求头中的客户端类型 # User-Agent:客户端类型:有浏览器,手机端浏览器,爬虫类型,程序,scrapy。。一般伪造成浏览器 # referer:上次访问的地址:Referer: https://www.lagou.com/gongsi/ # 如果要登录,模拟向登录接口发请求,正常操作必须在登录页面上才能干这事,如果没有携带referer,它就认为你是恶意的,拒绝调 # 图片防盗链 # cookie: 认证后的cookie,就相当于登录了 # header={ # # 客户端类型 # 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36' # } # res=requests.get('https://dig.chouti.com/',headers=header) # print(res.text)
5 携带cookie
# 4 请求中携带cookie# ## 方式一:直接带在请求头中 #模拟点赞 # data={ # 'linkId':'36996038' # } # header={ # # 客户端类型 # 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', # #携带cookie # 'Cookie':'deviceId=web.eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiI3MzAyZDQ5Yy1mMmUwLTRkZGItOTZlZi1hZGFmZTkwMDBhMTEiLCJleHBpcmUiOiIxNjYxNjU0MjYwNDk4In0.4Y4LLlAEWzBuPRK2_z7mBqz4Tw5h1WeqibvkBG6GM3I; __snaker__id=ozS67xizRqJGq819; YD00000980905869%3AWM_TID=M%2BzgJgGYDW5FVFVAVQbFGXQ654xCRHj8; _9755xjdesxxd_=32; Hm_lvt_03b2668f8e8699e91d479d62bc7630f1=1666756750,1669172745; gdxidpyhxdE=W7WrUDABQTf1nd8a6mtt5TQ1fz0brhRweB%5CEJfQeiU61%5C1WnXIUkZH%2FrE4GnKkGDX767Jhco%2B7xUMCiiSlj4h%2BRqcaNohAkeHsmj3GCp2%2Fcj4HmXsMVPPGClgf5AbhAiztHgnbAz1Xt%5CIW9DMZ6nLg9QSBQbbeJSBiUGK1RxzomMYSU5%3A1669174630494; YD00000980905869%3AWM_NI=OP403nvDkmWQPgvYedeJvYJTN18%2FWgzQ2wM3g3aA3Xov4UKwq1bx3njEg2pVCcbCfP9dl1RnAZm5b9KL2cYY9eA0DkeJo1zfCWViwVZUm303JyNdJVAEOJ1%2FH%2BJFZxYgMVI%3D; YD00000980905869%3AWM_NIKE=9ca17ae2e6ffcda170e2e6ee92bb45a398f8d1b34ab5a88bb7c54e839b8aacc1528bb8ad89d45cb48ae1aac22af0fea7c3b92a8d90fcd1b266b69ca58ed65b94b9babae870a796babac9608eeff8d0d66dba8ffe98d039a5edafa2b254adaafcb6ca7db3efae99b266aa9ba9d3f35e81bdaea4e55cfbbca4d2d1668386a3d6e1338994fe84dc53fbbb8fd1c761a796a1d2f96e81899a8af65e9a8ba3d4b3398aa78285c95e839b81abb4258cf586a7d9749bb983b7cc37e2a3; token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJqaWQiOiJjZHVfNTMyMDcwNzg0NjAiLCJleHBpcmUiOiIxNjcxNzY1NzQ3NjczIn0.50e-ROweqV0uSd3-Og9L7eY5sAemPZOK_hRhmAzsQUk; Hm_lpvt_03b2668f8e8699e91d479d62bc7630f1=1669173865' # } # res=requests.post('https://dig.chouti.com/link/vote',data=data,headers=header) # print(res.text) ## 方式二:通过cookie参数:因为cookie很特殊,一般都需要携带,模块把cookie单独抽取成一个参数,是字典类型,以后可以通过参数传入 data={ 'linkId':'36996038' } header={ # 客户端类型 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', } res=requests.post('https://dig.chouti.com/link/vote',data=data,headers=header,cookies={'key':'value'}) print(res.text)
# 部署项目出现的可能的问题 -路径问题:ngxin,uwsgi。。。 -数据库用户名密码问题 -前端发送ajax请求问题 -浏览器中访问一下banner接口 -nginx 8080 -安全组 80 8080 3306 -转到uwsgi的8888,视图类 -虚拟环境真实环境都要装uwsgi -启动uwsgi是在虚拟环境中启动的
6 发送post请求
###6 发送post请求 # data = { # 'username': '616564099@qq.com', # 'password': 'lqz123', # 'captcha': 'cccc', # 'remember': 1, # 'ref': 'http://www.aa7a.cn/', # 'act': 'act_login' # } # res = requests.post('http://www.aa7a.cn/user.php', data=data) # print(res.text) # print(res.cookies) # 响应头中得cookie,如果正常登录,这个cookie 就是登录后的cookie RequestsCookieJar:当成字典 # # # 访问首页,携带cookie, # # res2 = requests.get('http://www.aa7a.cn/', cookies=res.cookies) # res2 = requests.get('http://www.aa7a.cn/') # print('616564099@qq.com' in res2.text) ## 6.2 post请求携带数据 data={} ,json={} drf后端,打印 request.data # data=字典是使用默认编码格式:urlencoded # json=字典是使用json 编码格式 # res = requests.post('http://www.aa7a.cn/user.php', json={}) ## 6.4 request.session的使用:当request使用,但是它能自动维护cookie # session=requests.session() # data = { # 'username': '616564099@qq.com', # 'password': 'lqz123', # 'captcha': 'cccc', # 'remember': 1, # 'ref': 'http://www.aa7a.cn/', # 'act': 'act_login' # } # res = session.post('http://www.aa7a.cn/user.php', data=data) # res2 = session.get('http://www.aa7a.cn/') # print('616564099@qq.com' in res2.text)
7 响应Response
# Response对象,有很多属性和方法 -text -cookies
import requests header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', } respone = requests.get('https://www.jianshu.com', params={'name': 'lqz', 'age': 19},headers=header) # respone属性 print(respone.text) # 响应体的文本内容 print(respone.content) # 响应体的二进制内容 print(respone.status_code) # 响应状态码 print(respone.headers) # 响应头 print(respone.cookies) # 响应cookie print(respone.cookies.get_dict()) # cookieJar对象,获得到真正的字段 print(respone.cookies.items()) # 获得cookie的所有key和value值 print(respone.url) # 请求地址 print(respone.history) # 访问这个地址,可能会重定向,放了它冲定向的地址 print(respone.encoding) # 页面编码
8 获取二进制数据
###8 获取二进制数据 :图片,视频 # # res = requests.get( # 'https://upload.jianshu.io/admin_banners/web_images/5067/5c739c1fd87cbe1352a16f575d2df32a43bea438.jpg') # with open('美女.jpg', 'wb') as f: # f.write(res.content) # 一段一段写 res=requests.get('https://vd3.bdstatic.com/mda-mk21ctb1n2ke6m6m/sc/cae_h264/1635901956459502309/mda-mk21ctb1n2ke6m6m.mp4') with open('美女.mp4', 'wb') as f: for line in res.iter_content(): f.write(line)
9 解析json
# 前后分离后,后端给的数据,都是json格式, # 解析json格式 res = requests.get( 'https://api.map.baidu.com/place/v2/search?ak=6E823f587c95f0148c19993539b99295®ion=%E4%B8%8A%E6%B5%B7&query=%E8%82%AF%E5%BE%B7%E5%9F%BA&output=json') print(res.text) print(type(res.text)) print(res.json()['results'][0]['name']) print(type(res.json()))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下