Python面試題目
1、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.htmlhtml
2、HTTP/HTTPS,TCP/IP協議
1. 關於HTTP/HTTPS的區別,分別應該在什麼場合下。python
超文本傳輸協議HTTP協議被用於在Web瀏覽器和網站服務器之間傳遞信息,HTTP協議以明文方式發送內容,不提供任何方式的數據加密,若是攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就能夠直接讀懂其中的信息,所以,HTTP協議不適合傳輸一些敏感信息,好比:信用卡號、密碼等支付信息。linux
爲了解決HTTP協議的這一缺陷,須要使用另外一種協議:安全套接字層超文本傳輸協議HTTPS,爲了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議,SSL依靠證書來驗證服務器的身份,併爲瀏覽器和服務器之間的通訊加密。SSL(Secure Sockets Layer)面試
HTTPS和HTTP的區別主要以下:redis
一、https協議須要到ca申請證書,通常免費證書較少,於是須要必定費用。算法
二、http是超文本傳輸協議,信息是明文傳輸,https則是具備安全性的ssl加密傳輸協議。數據庫
三、http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443。瀏覽器
四、http的鏈接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。緩存
2.HTTPS有什麼優勢和缺點安全
HTTPS的優勢:
一、SEO方面
比起同等HTTP網站,採用HTTPS加密的網站在搜索結果中的排名將會更高」。
二、安全性
(1)、使用HTTPS協議可認證用戶和服務器,確保數據發送到正確的客戶機和服務器;
(2)、HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,要比http協議安全,可防止數據在傳輸過程當中不被竊取、改變,確保數據的完整性。
(3)、HTTPS是現行架構下最安全的解決方案,雖然不是絕對安全,但它大幅增長了中間人攻擊的成本。
一、SEO方面. 使用HTTPS協議會使頁面的加載時間延長近50%,增長10%到20%的耗電,此外,HTTPS協議還會影響緩存,增長數據開銷和功耗,甚至已有安全措施也會受到影響也會所以而受到影響。
二、經濟方面. 費用較高.
3. HTTPS是如何實現安全傳輸數據的。
HTTPS要使客戶端與服務器端的通訊過程獲得安全保證,必須使用的對稱加密算法,可是協商對稱加密算法的過程,須要使用非對稱加密算法來保證安全,然而直接使用非對稱加密的過程自己也不安全,會有中間人篡改公鑰的可能性,因此客戶端與服務器不直接使用公鑰,而是使用數字證書籤發機構頒發的證書來保證非對稱加密過程自己的安全。這樣經過這些機制協商出一個對稱加密算法,就此雙方使用該算法進行加密解密。從而解決了客戶端與服務器端之間的通訊安全問題。
一、客戶端發起HTTPS請求
二、服務端的配置(數字證書,公鑰和私鑰,)
三、傳送證書( 頒發機構,過時時間等)
四、客戶端解析證書
五、傳送加密信息
六、服務段解密信息
七、傳輸加密後的信息
八、客戶端解密信息
參考: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請求會有哪些信息發送到後臺服務器。
3、數據庫
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.硬件優化:使用更好的一些硬盤(固態硬盤),使用一些磁盤陣列技術.
4、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能夠做爲終極解決方案。
七、簡單介紹下scrapy的異步處理。答:scrapy框架的異步機制是基於twisted異步網絡框架處理的,在settings.py文件裏能夠設置具體的併發量數值(默認是併發量16)。