低版本客户端连接高版本数据库报错ORA-28040、ORA-01017

测试环境:

  • 客户端:Oracle 11.2.0.1
  • 服务端:Oracle 19.16

测试过程:

  • 1.低版本客户端连接高版本数据库报错ORA-28040
  • 2.低版本客户端连接高版本数据库报错ORA-01017
  • 3.总结经验

1.低版本客户端连接高版本数据库报错ORA-28040

使用oracle 11.2.0.1 的客户端,对19c的服务端进行连接时,报错:ORA-28040: No matching authentication protocol

C:\Users\Alfred>sqlplus sys/oracle@192.168.1.4/demo as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期二 1月 17 17:52:30 2023

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

ERROR:
ORA-28040: No matching authentication protocol

这个错误其实我在给客户做经验分享类的交流时,反复讲过,解决起来也很简单,同时也有MOS文档 2296947.1 依据:

  • 12.2: ORA-28040 Followed by ORA-1017 When Client is Under Version 12. (Doc ID 2296947.1)

如果在不方便升级客户端的情况下,只能在服务端,配置sqlnet.ora文件:

[oracle@bogon admin]$ pwd
/u01/app/oracle/product/19.3.0/db_1/network/admin
[oracle@bogon admin]$ cat sqlnet.ora
SQLNET.ALLOWED_LOGON_VERSION_SERVER=10

非常简单,且不用重启任何服务,不用重载监听,即可生效;
再次连接,不再报错ORA-28040。

2.低版本客户端连接高版本数据库报错ORA-01017

不再报错ORA-28040,但开始报错:ORA-01017: invalid username/password; logon denied

C:\Users\Alfred>sqlplus sys/oracle@192.168.1.4/demo as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期二 1月 17 21:17:09 2023

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

ERROR:
ORA-01017: invalid username/password; logon denied


请输入用户名:

可是输入的密码确认是没问题的,使用高版本的客户端,同样的密码测试连接也是OK的。
那是什么问题呢?想到是密码版本问题,根据MOS 文档 2040705.1:

  • Lockout of all database authenticated users getting error ORA-01017: invalid username/password; logon denied (Doc ID 2040705.1)

When you inspect the DBA_USERS.PASSWORD_VERSIONS you only see 11G and 12C values but not 10G.

查询用户的PASSWORD_VERSIONS:

SQL> select username, password_versions from dba_users where password_versions is not null;

USERNAME		       PASSWORD_VERSIONS
------------------------------ -----------------
SYS			       11G 12C
SYSTEM			       11G 12C
CTXSYS			       11G 12C

With this solution you will also need to change the user password again so the DBA_USERS.PASSWORD_VERSIONS will get a 10G value, however the DES based verifiers are outdated and should only be used in exceptional cases when legacy client applications still need it.

alter user sys identified by oracle;

再次,尝试从11.2.0.1的客户端,对19c的服务端进行连接时,可以成功连接:

C:\Users\Alfred>sqlplus sys/oracle@192.168.1.4/demo as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期二 1月 17 21:57:33 2023

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


连接到:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

SQL> exit
从 Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production 断开

C:\Users\Alfred>

但是有个疑问,这里再次改过SYS密码后,查询PASSWORD_VERSIONS其实还是没有显示出来:

SQL> select username, password_versions from dba_users where password_versions is not null;

USERNAME		       PASSWORD_VERSIONS
------------------------------ -----------------
SYS			       11G 12C
SYSTEM			       11G 12C
CTXSYS			       11G 12C

考虑到SYS用户的特殊性,那么这里使用SYSTEM用户再次测试观察下:

sqlplus system/oracle@192.168.1.4/demo

同样,报错ORA-01017,输入的密码确认是没问题的,使用高版本的客户端,同样的密码测试连接也是OK的。

C:\Users\Alfred>sqlplus system/oracle@192.168.1.4/demo

SQL*Plus: Release 11.2.0.1.0 Production on 星期二 1月 17 22:10:02 2023

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

ERROR:
ORA-01017: invalid username/password; logon denied


请输入用户名:
C:\Users\Alfred>

修改system密码:

SQL> select username, PASSWORD_VERSIONS, PASSWORD_CHANGE_DATE from dba_users where PASSWORD_VERSIONS is not null;

USERNAME		       PASSWORD_VERSIONS PASSWORD_
------------------------------ ----------------- ---------
SYS			       11G 12C		 04-JAN-23
SYSTEM			       11G 12C		 04-JAN-23
CTXSYS			       11G 12C		 04-JAN-23

SQL> alter user system identified by oracle;

User altered.

SQL> select username, PASSWORD_VERSIONS, PASSWORD_CHANGE_DATE from dba_users where PASSWORD_VERSIONS is not null;

USERNAME		       PASSWORD_VERSIONS PASSWORD_
------------------------------ ----------------- ---------
SYS			       11G 12C		 04-JAN-23
SYSTEM			       10G 11G 12C	 17-JAN-23
CTXSYS			       11G 12C		 04-JAN-23

SQL>

看来,SYSTEM用户是比较正常显示的,改过密码后,PASSWORD_VERSIONS多了10G的显示,符合我们预期。
此时,再尝试从11.2.0.1的客户端,对19c的服务端进行连接时,确认system用户也可以成功连接了:

C:\Users\Alfred>sqlplus system/oracle@192.168.1.4/demo

SQL*Plus: Release 11.2.0.1.0 Production on 星期二 1月 17 22:15:23 2023

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


连接到:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

SQL>

其他业务用户,推断应该都和system用户的表现一致,这样也符合逻辑。

这里还观察到一个细节:

修改密码前,查询SYS和SYSTEM用户在user$中的password和spare4字段:

select name, password, spare4 from user$ where name in ('SYS','SYSTEM')
SQL> /

NAME		PASSWORD	SPARE4
--------------- --------------- --------------------------------------------------------------------------------
SYS				S:88EB5B08A9EC6EBAE68148FB711CF9416C26077B3512B6A5BF8A1F44C610;T:4EDCFBAD9376CD1
				ACEBA5567ECA2877B386ED292DD993B57CEEC07261A0137141A5C43941265FC7FD7A540D9D3EED87
				1B6EB1733EEBC2AED5A63CF02F69AFEBC89F026B2D4430CE35D6CCCD5C5DA7123

SYSTEM				S:9CFB5871B12A3CF7E01D864BFE348D521B15B78DEF75B8C95C0EC661792B;T:52418514B24923B
				6C1CC3A609B293A413C5B71C5B2A270A97A71F5E2A2857CFCAE98ECE47B17A1149BAAFF268654082
				469B1078901B0B55CFD377987E2C5AFC598045FFCE551D42CBDE2D38418BDFBE6

修改密码后,再次查询:

SQL> select name, password, spare4 from user$ where name in ('SYS','SYSTEM') ;

NAME		PASSWORD	SPARE4
--------------- --------------- --------------------------------------------------------------------------------
SYS				S:88EB5B08A9EC6EBAE68148FB711CF9416C26077B3512B6A5BF8A1F44C610;T:4EDCFBAD9376CD1
				ACEBA5567ECA2877B386ED292DD993B57CEEC07261A0137141A5C43941265FC7FD7A540D9D3EED87
				1B6EB1733EEBC2AED5A63CF02F69AFEBC89F026B2D4430CE35D6CCCD5C5DA7123

SYSTEM		2D594E86F93B17A S:CAA7AFAE43C3D06D50F6272A837ACDF4C3A2D092821AD7076534CCEEE6F7;T:B8FCFE4B975D3D9
		1		86C1CD27A21FB6F78397BD97889B017FE2F6B949981E85E5F1208C42A143367C3EA70AF7B39B6193
				C38D171CEEF893EAF6FB87A5C095F864B6517CEA65522ACCDE592D9A645FEDC3A

发现SYS用户在基表user$中也是没有变化,但是SYSTEM用户就比较正常了,而且会发现,SYSTEM用户在PASSWORD字段也有对应值了,这是因为PASSWORD_VERSIONS=10G版本时,是存在这个字段的。

3.总结经验

最后总结一下:

  • 1.低版本客户端连接高版本数据库,需要在服务端配置sqlnet.ora文件;
  • 2.高版本数据库的密码需要重新设置(可以和之前密码相同),确保PASSWORD_VERSIONS有低版本;
  • 3.不同PASSWORD_VERSIONS,在基表user$中存储密码的列也不一样;
  • 4.测试做实验强烈建议不要使用SYS这种特殊用户,因为现象很可能不一致;建议使用SYSTEM或者最好自己新建测试用户为佳。
AlfredZhao©版权所有「从Oracle起航,领略精彩的IT技术。」
本文转载于网络 如有侵权请联系删除

相关文章

  • 一天一个 Linux 命令(29):lsblk 命令

    本文为joshua317原创文章,转载请注明:转载自joshua317博客https://www.joshua317.com/article/169一、简介Linux下的lsblk(英文全称是"listblock")命令的,即用于列出所有可用块设备的信息,而且还能显示他们之间的依赖关系,但是它不会列出RAM盘的信息。块设备有硬盘,闪存盘,cd-ROM等等。lsblk命令包含在util-linux-ng包中,现在该包改名为util-linux。若没有安装lsblk,可以通过sudoyuminstallutil-linux-ng来安装该包。二、格式说明lsblk[options][<device>...] lsblk[参数][设备] Usage: lsblk[options][<device>...] Options: -a,--allprintalldevices -b,--bytesprintSIZEinbytesratherthaninhumanreadableformat -d,--nodepsdon'tprintslave

  • C# ±180的值转成0-360

    一、将正负180的值转成0-360///<summary> ///正负180,0--->360 ///</summary> ///<paramname="p"></param> ///<returns></returns> publicstaticdoubleConv_k(doublep) { while(p>180) { p=p-360; } while(p<-180) { p=p+360; } if(p<=90) { return90-p; } if(p>90) { return360+(90-p); } return0; }复制

  • 供暖器

    供暖器冬季已经来临。你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。 在加热器的加热半径范围内的每个房屋都可以获得供暖。 现在,给出位于一条水平线上的房屋houses和供暖器heaters的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。 说明:所有供暖器都遵循你的半径标准,加热的半径也一样。示例输入:houses=[1,2,3],heaters=[2] 输出:1 解释:仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。复制输入:houses=[1,2,3,4],heaters=[1,4] 输出:1 解释:在位置1,4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖。复制输入:houses=[1,5],heaters=[2] 输出:3复制题解/** *@param{number[]}houses *@param{number[]}heaters *@return{number} */ varfindRadius=function(houses,heaters){ houses.sort((a,b)=>a-b); hea

  • 不用找了,基于 Redis 的分布式锁实战来了!

    作者:菜蚜my.oschina.net/wnjustdoit/blog/1606215前言:在分布式环境中,我们经常使用锁来进行并发控制,锁可分为乐观锁和悲观锁,基于数据库版本戳的实现是乐观锁,基于redis或zookeeper的实现可认为是悲观锁了。乐观锁和悲观锁最根本的区别在于线程之间是否相互阻塞。那么,本文主要来讨论基于redis的分布式锁算法问题。从2.6.12版本开始,redis为SET命令增加了一系列选项(set[key]NX/XXEX/PX[expiration]):EXseconds–设置键key的过期时间,单位时秒PXmilliseconds–设置键key的过期时间,单位时毫秒NX–只有键key不存在的时候才会设置key的值XX–只有键key存在的时候才会设置key的值原文地址:https://redis.io/commands/set 中文地址:http://redis.cn/commands/set.html注意:由于SET命令加上选项已经可以完全取代SETNX,SETEX,PSETEX的功能,所以在将来的版本中,redis可能会不推荐使用并且最终抛弃这几个命令。

  • LFFD:轻量级人脸检测器,不止是快

    来源:公众号我爱计算机视觉授权转载上面的gif图展示的是LFFD人脸检测算法,在NvidiaGPU上对1080P的图像可以跑到16ms左右。该算法出自论文: LFFD:ALightandFastFaceDetectorforEdgeDeviceshttps://arxiv.org/abs/1904.10633代码开源地址:https://github.com/YonghaoHe/A-Light-and-Fast-Face-Detector-for-Edge-DevicesLFFD在人脸检测领域并不是精度最高的,但作为近来轻量级人脸检测模型的代表,却是极具实用价值的。请看LFFD与其他state-of-the-art算法的精度比较。在WIDERFACE验证集上的精度比较:在WIDERFACE测试集上的精度比较:在FDDB数据集上的精度比较:虽然精度并不是最高水平的,但其模型大小仅9M,推断速度更是其亮点。 在NVIDIAGTXTITANXp(MXNet+CUDA9.0+CUDNN7.1)配置下的推断速度:在NVIDIATX2(MXNet+CUDA9.0+CUDNN7.1)配置下的推断速度

  • 目标检测算法中检测框合并策略技术综述

    陈泰红研究方向:机器学习、图像处理物体检测(ObjectDetection)的任务是找出图像或视频中的感兴趣目标,同时实现输出检测目标的位置和类别,是机器视觉领域的核心问题之一,学术界已有将近二十年的研究历史。随着深度学习技术的火热发展,目标检测算法也从基于手工特征的传统算法转向了基于深度神经网络的检测技术。从最初2013年提出的R-CNN、OverFeat,到后面的Fast/FasterR-CNN、SSD、YOLO系列,以及MaskR-CNN、RefineDet、RFBNet等(图1,完整论文列表参见[1])。短短不到五年时间,基于深度学习的目标检测技术,在网络结构上,从twostage到onestage,从bottom-uponly到Top-Down,从singlescalenetwork到featurepyramidnetwork,从面向PC端到面向移动端,都涌现出许多好的算法技术,这些算法在开放目标检测数据集上的检测效果和性能都很出色。图1目标检测领域重要论文物体检测过程中有很多不确定因素,如图像中物体数量不确定,物体有不同的外观、形状、姿态,加之物体成像时会有光照、遮挡等因

  • Nature:摩尔定律时代落幕(深度解析)

    编者按:芯片业喊“狼来了”已经有将近20年了,但摩尔定律似乎每一次都能化险为夷,维持存在。但是这次不一样了,随着产业在技术、经济层面摸到的天花板越来越多,自1960年代以来为信息革命提供动力的字面意义上的摩尔定律可能下个月就要正式终结了。不过,从摩尔定律所反映的价值来看,摩尔定律并没有死,只是换了一个化身而已。来自自然杂志的这篇文章回顾了摩尔定律的光辉历史,并总结了让摩尔定律重生的未来路线。对于正在致力打造半导体超级大国的中国来说,这篇文章值得好好思考一下我们的努力方向。半导体业很快就会放弃追求摩尔定律的努力,不过现在事情可以变得更加有趣。下个月,全球半导体业将正式承认一个对于牵涉其中所有人来说已经变得越来越明显的事实:自1960年代以来为信息革命提供动力的摩尔定律已接近终结。作为统治计算的一个概测法则,摩尔定律指出,微处理器芯片上的晶体管数量大概每两年左右就会翻番—通常这意味着芯片的性能也会有相应提升。该定律描述的指数式改进将1970年代第一代做工粗糙的家庭计算机变成了1980年代和1990年代的精致机器,高速互联网、智能手机以及联网汽车、冰箱和恒温器也因此崛起并变成今日的无所不在。

  • 机器学习算法之逻辑回归(一)

    标题:分类问题二元分类Sigmoid函数算法导出梯度上升我们曾经介绍过,机器学习中最常见的问题有两大类,一类是回归问题,一类是分类问题。回归问题我们在前面关于线性回归的讨论中想必已经初步了解了,这一次我们就来看一看在监督学习中更为常见的分类问题。分类问题分类问题其实和回归问题很相似,但是它的输出值y值(也即是说我们打算预测的值)只是少量的一些离散值,像是如果我们只是想要机器通过“观察”某个西瓜的一些特征从而来告诉我们这个西瓜是好是坏,那么我们就可以设输出值y为0表示坏瓜,1表示好瓜,那么判断这个西瓜好坏的过程其实就是一个分类问题,它的输出值就是离散的(仅为0或者1)。二元分类而分类问题中最简单的是二元分类,顾名思义,就是输出值只有两个,就像上面那个例子,结果只有好瓜和坏瓜,不会输出“不好不坏的”这种莫名其妙的瓜。在二元分类中,我们常常用0和1来限定y值,继续套用上面那个分瓜的例子,我们假设x(i)表示西瓜的特征,那么y就被称作西瓜的标签(也就是类别),y的0值往往被称作西瓜的“负类”,1值便称作西瓜的“正类”。有时候我们还会用“+”和“-”来代替1和0,像是在图上的时候,这样会表现的更

  • 课后作业-阅读任务-阅读提问-3

      1:软件的需求分析中要有客户对产品的需求,并且需求在实现之前,我们将产品做多头该怎么办? 2:软件工程虽然说已经有很久的历史了;但是软件工程的主体一直是人类,所以说软件还是需要人来完成,做个项目用上了必胜所学,但是还往往都不能成功,那么怎么办?   3:PM也就是我们俗称的项目经理,他们应该怎样说服聪明的同事? 虽然我认为的是晓之以理动之以情,但是很多人都不买账,该怎么办?  

  • .Net Core WebAPI 基于Task的同步&amp;异步编程快速入门

    .NetCoreWebAPI基于Task的同步&异步编程快速入门 Task.Result async&await 总结 并行任务(Task)以及基于Task的异步编程(asynchronously)在.NETFramework早已使用多年,而在微软新推出的.NETCore平台下也有相同功能的实现,本文将通过.NETCoreWebAPI,介绍使用Task.result的同步编程以及使用await的异步编程模型。 Task.Result Result方法可以返回Task执行后的结果,如下代码: [HttpGet] publicstaticasyncTask<JObject>GetJsonAsync(Uriuri) { using(varclient=newHttpClient()) { varjsonString=awaitclient.GetStringAsync(uri); returnJObject.Parse(jsonString); } } publicclassMyController:ApiController { publicstr

  • 数学建模竞赛“爱你不容易,爱你不后悔”

    2011年6月份高中毕业,就读本科,2013年暑假8月份,参加学校为期一个月的数学建模培训,然后9月份的第二个周末在东南大学参加为期三天的全国大学生数学建模竞赛,“意外”获得全国大学生数学建模竞赛二等奖;2015年6月份本科毕业,攻读硕士研究生,2016年暑假,因实习没有参加学校组织的数学建模培训,9月份的第三个周末在南京邮电大学参加为期4.5天的全国研究生数学建模竞赛,“如愿”获得全国研究生数学建模竞赛一等奖,随后在重庆大学参加“华为杯”第十三届研究生数学建模竞赛颁奖大会,并作为一等奖代表上台领奖。一次是“意外”的二等奖,一次是“如愿”的一等奖,体现了数学建模的魅力所在,和自己的稍许成熟,外加上自己身上带着的一丝运气。 数学建模“爱你不容易”。太多的光环笼罩着数学建模竞赛,上海落户加分、世界上规模最大、教育部学位与研究生教育发展中心、清华大学、东南大学、高教社、华为等等主办方、承办方、组委会、赞助方,每个拿出来都是业界名气大名鼎鼎的。有幸,在大二懵懂中参加数学建模的培训,炎热的暑假,别人在家潇洒乘凉,自己在学校看着天书题目,还要解答,学习matlab、Spass甚至最简单的Excel

  • 进制转换

    资源限制 时间限制:1.0s内存限制:512.0MB 复制 十六进制转八进制 1.问题描述 给定n个十六进制正整数,输出它们对应的八进制数。 2.输入格式 输入的第一行为一个正整数n(1<=n<=10)。 接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。 3.输出格式 输出n行,每行为输入对应的八进制正整数。1. 【注意】输入的十六进制数不会有前导0,比如012A。输出的八进制数也不能有前导0。 4.样例【提示】先将十六进制数转换成某进制数,再由某进制数转换成八进制。 输入 2 39 123ABC 输出 71 4435274 复制 十六进制转十进制 1.问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。 注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 2.样例 输入 FFFF 输出 65535 复制 十进制转十六进制 1.问题描述 十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,

  • 微信小程序开发练习

    微信小程序开发工具git管理 https://blog.csdn.net/qq_36672905/article/details/82887102 这个开发工具的界面和交互真的是熟悉又友好,吹爆他

  • iOS 或者Android调用vue.js 里面的方法

    1、原生调用vue.js某个vue组件下的方法。 比如**.vue里面有个这样的方法: 如果这样的话,在iOS或者Android里面是调用不了这个ajax方法的。 需要在**.vue (我的版本是vue1.0)。 在iOS里面调用js方法: 。  

  • Rider 还不能完全取代 Visual Studio 的理由之一

    WhyisRider'sWindowsFormdesignercrippledwithbugs? 确实。在Rider做winform设计太痛苦了。我现在用的版本是2021.2.1.

  • byte bit转换

    packaget2; publicclassByteBitDemo{ publicstaticvoidmain(String[]args){ Stringa="科"; //根据编码的格式不一样,字节也不一样 //在中文情况下,如果使用的utf-8,一个中文一般对应三个字节, //如果是gbk,一个中文两个字节 byte[]bytes=a.getBytes(); for(byteaByte:bytes){ System.out.println(aByte); Strings=Integer.toBinaryString(aByte); System.out.println(s); } } } 输出: -25-2511111111111111111111111111100111-8911111111111111111111111110100111-11111111111111111111111111110010001 11111111111111111111111111100111-8911111111111111111111111110100111-1111

  • 一文看懂机器人与自动驾驶与机器人的“眼睛”[即时定位与地图重建SLAM]到底是什么?有哪几个关键环节?他们之间的联系是什么?

    即时定位与地图重建(SLAM)到底是什么?为什么需要它?在哪需要它?如何使用它? SLAM技术是什么?它就是通过摄像头和雷达等传感器来对周围环境进行实时地图重建并且还能计算出传感器位于所重建的地图的哪个地方。 SLAM技术有什么用?在哪需要它?如何使用它?自动驾驶需用用SLAM技术来建图和定位自己在哪。通过建图后才能决策到底前面有没有车,以及前面是否有路口,到底改怎么转。机器人需要对周围环境进行建图才知道如何规划执行任务的行动路线。SLAM技术就像人的眼睛,没了眼睛哪都去不了。还有一个很广泛的应用就是增强现实技术(AR),我们用淘宝的天猫精灵AR可以看到那个精灵能够很逼真的站在地面,这就是因为淘宝通过摄像头对周围环境进行重建,然后把三维模型按照合适的角度恰当的放在了地面。由于月球和火星离地球非常远无法实时发送电磁波控制月球车,因此它也需要用SLAM技术实现自主探索。大家进商场会发现高德地图没法用,这是因为GPS压根就在室内没信号而且精度完全没法满足室内导航。如果我们用SLAM技术结合手机摄像头那就能让手机根据周围环境来指引我们去想去的店铺。 最简单的SLAM技术是通过提取周围环境

  • python爬虫(1)——urllib包

      人生苦短,我用python! 一、关于爬虫   鉴于我的windos环境使用命令行感觉非常不便,也懒得折腾虚拟机,于是我选择了一个折中的办法——Cmder。它的下载地址是:cmder.net Cmder是一个增强型命令行工具,不仅可以使用windows下的所有命令,更爽的是可以使用linux的命令,shell命令。下载下来后,解压即可使用。稍加设置(具体的设置可以百度),你就会发现它比windos的cmd要好用的多。   爬虫分为通用爬虫和聚焦爬虫,我们所研究的就是聚焦爬虫——抓取网页时筛选,尽量只抓与需求相关的网页信息。而网络爬虫的抓取过程我们可以理解为模拟浏览器操作的过程,这个过程基于Http(超文本传输协议)和Https(安全版的Http)的。当我们向浏览器中输入https://www.baidu.com/时,它就会根据这个地址来获取网页信息。我们所输入的网址就是URL——统一资源定位符,它是用于完整地描述Internet上网页和其它资源的地址的一种标识方式。   二、Python的urllib包   在Python3中,我们可以使用urlib这个组件抓取网页,ur

  • css样式

    字体属性:(font) 大小{font-size:x-large;}(特大)xx-small;(极小)一般中文用不到,只要用数值就可以,单位:PX、PD 样式{font-style:oblique;}(偏斜体)italic;(斜体)normal;(正常) 行高{line-height:normal;}(正常)单位:PX、PD、EM 粗细{font-weight:bold;}(粗体)lighter;(细体)normal;(正常) 变体{font-variant:small-caps;}(小型大写字母)normal;(正常) 大小写{text-transform:capitalize;}(首字母大写)uppercase;(大写)lowercase;(小写)none;(无) 修饰{text-decoration:underline;}(下划线)overline;(上划线)line-through;(删除线)blink;(闪烁) 常用字体:(font-family) "CourierNew",Courier,monospace,"TimesNewRoman",Times,serif,Arial

  • java第十一周上机练习

    1、(1)定义一个汽车类Vehicle,要求如下:(知识点:类的继承 方法的覆盖)(a)属性包括:汽车品牌brand(String类型)、颜色color(String类型)和速度speed(double类型)。(b)至少提供一个有参的构造方法(要求品牌和颜色可以初始化为任意值,但速度的初始值必须为0)。(c)为属性提供访问器方法。注意:汽车品牌一旦初始化之后不能修改。(d)定义一个一般方法run(),用打印语句描述汽车奔跑的功能定义测试类VehicleTest,在其main方法中创建一个品牌为“benz”、颜色为“black”的汽车。(2)定义一个Vehicle类的子类轿车类Car,要求如下:(a)轿车有自己的属性载人数loader(int 类型)。(b)提供该类初始化属性的构造方法。(c)重新定义run(),用打印语句描述轿车奔跑的功能。(d)定义测试类Test,在其main方法中创建一个品牌为“Honda”、颜色为“red”,载人数为2人的轿车。 (1) packagework11; publicclassVehicle{ publicStringbran

  • MySQL唯一键死锁总结分析

    目录1、没有锁CASE2、唯一键死锁CASE13、唯一键死锁CASE24、唯一键死锁CASE3 1、没有锁CASE #8.0.18 #RC CREATETABLE`t3`( `id`int(11)NOTNULLAUTO_INCREMENT, `name`varchar(10)COLLATEutf8mb4_binDEFAULTNULL, `age`int(11)NOTNULLDEFAULT'1', PRIMARYKEY(`id`) )ENGINE=InnoDB 复制 2、唯一键死锁CASE1 #8.0.18 #RC CREATETABLE`t2`( `id`int(11)NOTNULLAUTO_INCREMENT, `name`varchar(10)COLLATEutf8mb4_binDEFAULTNULL, `age`int(11)NOTNULLDEFAULT'1', PRIMARYKEY(`id`), UNIQUEKEY`udx_name`(`name`), KEY`idx_name`(`name`) )ENGINE=InnoDB 复制 死锁产生的原因是:

相关推荐

推荐阅读