Python面试题目
一、Python
1. python的多进程与多线程的运行机制是什么?有什么区别?分别在什么情况下用?
2. Python的装饰器的原理是什么,在什么情况会用到装饰器。请手写Python装饰器代码
3. 如何提高Python的运行效率,请说出不少于2种提高运行效率的方法。
4. 介绍下“消费者”和“生产者”模型。
https://blog.csdn.net/sanyuesan0000/article/details/52996586
https://www.cnblogs.com/alex09/p/6675664.html
二、HTTP/HTTPS,TCP/IP协议
1. 关于HTTP/HTTPS的区别,分别应该在什么场合下。
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。SSL(Secure Sockets Layer)
HTTPS和HTTP的区别主要如下:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
2.HTTPS有什么优点和缺点
HTTPS的优点:
1、SEO方面
比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。
2、安全性
(1)、使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;
(2)、HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程中不被窃取、改变,确保数据的完整性。
(3)、HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增加了中间人攻击的成本。
1、SEO方面. 使用HTTPS协议会使页面的加载时间延长近50%,增加10%到20%的耗电,此外,HTTPS协议还会影响缓存,增加数据开销和功耗,甚至已有安全措施也会受到影响也会因此而受到影响。
2、经济方面. 费用较高.
3. HTTPS是如何实现安全传输数据的。
HTTPS要使客户端与服务器端的通信过程得到安全保证,必须使用的对称加密算法,但是协商对称加密算法的过程,需要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程本身也不安全,会有中间人篡改公钥的可能性,所以客户端与服务器不直接使用公钥,而是使用数字证书签发机构颁发的证书来保证非对称加密过程本身的安全。这样通过这些机制协商出一个对称加密算法,就此双方使用该算法进行加密解密。从而解决了客户端与服务器端之间的通信安全问题。
1、客户端发起HTTPS请求
2、服务端的配置(数字证书,公钥和私钥,)
3、传送证书( 颁发机构,过期时间等)
4、客户端解析证书
5、传送加密信息
6、服务段解密信息
7、传输加密后的信息
8、客户端解密信息
参考:https://blog.csdn.net/kobejayandy/article/details/52433660
对称加密: 将信息和私钥(随机值)通过某种算法混合在一起
非对称加密的加密算法,特点是私钥加密后的密文,只要是公钥,都可以解密,但是公钥加密后的密文,只有私钥可以解密。私钥只有一个人有,而公钥可以发给所有的人。
4. HTTPS安全证书是怎么来的,如何申请,国内和国外有哪些第三方机构提供安全证书认证。
有自签和第三方公司. 上海市数字证书认证中心, 北京数字认证股份有限公司
5. get和post请求有什么区别,分别应该在什么场合下。
get请求的参数一般放在url中,但是浏览器和服务器程序对url长度还是有限制的。
post请求的参数一般放在body,你硬要放到url中也可以。
在RESTful风格中,get用于从服务器获获取数据,而post用于创建数据
6. TCP三次握手、四次挥手,请说出每次发送的状态码。
syn:同步请求,建立连接 ack: 回复,确认
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:
未连接队列
在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于SYN_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。
关闭TCP连接:改进的三次握手
(使用一个带有FIN附加标记的报文段)TCP关闭连接的步骤如下:
第一步,当客户端的应用程序通知TCP数据已经发送完毕时,TCP向服务器发送一个带有FIN附加标记的报文段(FIN表示英文finish)。
第二步,服务器收到这个FIN报文段之后,并不立即用FIN报文段回复客户端,而是先向客户端发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。
第三步,服务器的应用程序告诉TCP:我要彻底的关闭连接,TCP向客户端送一个FIN报文段。
第四步,客户端收到这个FIN报文段后,向服务器发送一个ACK表示连接彻底释放。
7. HTTP请求会有哪些信息发送到后台服务器。
三、数据库
0. MySQL的常用引擎有哪些?有什么区别?
(1)MyISAM存储引擎 不支持事务、也不支持外键,优势是访问速度快
(2)InnoDB存储引擎 提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM引擎,写的处理效率会差一些,并且会占用更多的磁盘空间以保留数据和索引。
InnoDB存储引擎的特点:支持自动增长列,支持外键约束
(3)MEMORY存储引擎 使用存在于内存中的内容来创建表, 访问非常的快, 默认使用HASH索引, 一旦服务关闭,表中的数据就会丢失掉.
(4)MERGE存储引擎 它是MyISAM表的组合,这些MyISAM表必须结构完全相同,merge表本身并没有数据,对merge类型的表可以进行查询,更新,删除操作,这些操作实际上是对内部的MyISAM表进行的。
1. redis是什么类型数据库,可以存哪些数据结构的数据。
redis是内存型的key-value型的非关系型数据库,支持数据持久化.
Redis是一个字典结构的存储服务器, 可以储存String, Hash, List, Set, zset数据.
2. redis有多少个库?
每个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(可以通过配置文件支持更多,无上限)
3. redis、MongoDB有什么区别,分别应用在什么情况下。
redis:是一个key-value存储系统(布式内缓存,高性能的key-value数据库)
MongoDB: 是一个介于关系数据库和非关系数据库之间的产品(基于分布式文件存储的数据库),是非关系数据库当中功能最丰富,最像关系数据库的。
内存管理机制:Redis数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的LRU算法删除数据。
MongoDB数据存在内存,由linux系统mmap实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。
支持的数据结构: Redis支持的数据结构丰富,包括hash、set、list等。
MongoDB数据结构比较单一,但是支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。
性能: 二者性能都比较高,应该说都不会是瓶颈。
可靠性: 二者均支持持久化。
集群: MongoDB集群技术比较成熟,Redis从3.0开始支持集群。
适用场景: reids 适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。
MongoDB 主要解决海量数据的访问效率问题。
4. MongoDB是以什么数据结构存入的。
文件存储格式为Bson,使用易于掌握和理解的Json风格语法。相对Json来说,Bson拥有更好的性能,主要表现为更快的遍历速度、操作更简易、增加了额外的数据类型
5. 如何优化MySql数据库
1.优化索引、SQL语句、分析慢查询;
2.设计表的时候严格按照数据库的设计范式来设计数据库;
3.我们还可以将我们的业务架构进行缓存,静态化和分布式;
4.如果效率还是不够好,可以采用主从方式将数据读写分离;
5.硬件优化:使用更好的一些硬盘(固态硬盘),使用一些磁盘阵列技术.
四、scrapy和scrapy-redis
1. 描述下scrapy框架运行的机制?
答:从start_urls里获取第一批url并发送请求,请求由引擎交给调度器入请求队列,获取完毕后,调度器将请求队列里的请求交给下载器去获取请求对应的响应资源,并将响应交给自己编写的解析方法做提取处理:1. 如果提取出需要的数据,则交给管道文件处理;2. 如果提取出url,则继续执行之前的步骤(发送url请求,并由引擎将请求交给调度器入队列...),直到请求队列里没有请求,程序结束。
2. scrapy和scrapy-redis有什么区别?为什么选择redis数据库?
答:
1) scrapy是一个Python爬虫框架,爬取效率极高,具有高度定制性,但是不支持分布式。而scrapy-redis一套基于redis数据库、运行在scrapy框架之上的组件,可以让scrapy支持分布式策略,Slaver端共享Master端redis数据库里的item队列、请求队列和请求指纹集合。
2) 为什么选择redis数据库,因为redis支持主从同步,而且数据都是缓存在内存中的,所以基于redis的分布式爬虫,对请求和数据的高频读取效率非常高。
3. 反爬虫的机制有哪些?
答:
1) User—Agent
2) 代理ip
3) 访问频率限制
4) 验证码处理
5) Cookie
6) 动态HTML数据加载
4. 实现模拟登录的方式有哪些?
答:
1) 使用一个具有登录状态的cookie,结合请求报头一起发送,可以直接发送get请求,访问登录后才能访问的页面。
2) 先发送登录界面的get请求,在登录页面HTML里获取登录需要的数据(如果需要的话),然后结合账户密码,再发送post请求,即可登录成功。然后根据获取的cookie信息,继续访问之后的页面。
5. get和post请求有什么区别?分别应该在什么场合下。
答:
1) get请求用于直接获取指定url的响应数据,和服务器没有交互信息。
2) post请求在获取响应数据前,会先发送form表单,服务器会根据form表单来返回响应数据。
6. Selenium、PhantomJS是什么?可以为爬虫做哪些事情?
答:
1) Selenium是一种自动测试化工具,可以导入使用指定的浏览器,在发送请求获取响应后,响应数据则会在指定的浏览器里执行完毕。而PhantomJS是一种无界面浏览器,相比传统的Chrome或Firefox浏览器等,资源消耗会更少。
2) 在Python爬虫代码里使用Selenium和PhantomJS组合,相当于真实浏览器的执行状态,可以直接获取动态HTML数据(如JavaScript、Ajax加载的数据等),并且支持模拟键盘事件、鼠标点击事件、执行JavaScript语句等。在一些反爬虫极端情况下,Selenium+PhantomJS可以作为终极解决方案。
7、简单介绍下scrapy的异步处理。
答:scrapy框架的异步机制是基于twisted异步网络框架处理的,在settings.py文件里可以设置具体的并发量数值(默认是并发量16)。