1. 程式人生 > >Python----面試題(三)

Python----面試題(三)

shutdown 兩種 模擬 lxml list move 道德 shu 通信

1、 post、get有什麽區別?

1. 根據HTTP規範,GET一般用於獲取/查詢資源信息,應該是安全的和冪等。而POST一般用於更新資源信息 2. get是在url中傳遞數據,數據放在請求頭中。 post是在請求體中傳遞數據 3. get傳送的數據量較小,只能在請求頭上發送數據。post傳送的數據量較大,一般被默認為不受限制。 5. get安全性非常低,post安全性較高。但是執行效率卻比Post方法好。 建議: 1、get方式的安全性較Post方式要差些,包含機密信息的話,建議用Post數據提交方式; 2、在做數據查詢時,建議用Get方式;而在做數據添加、修改或刪除時,建議用Post方式;
2、 http、https協議有什麽區別?
http協議是超文本傳輸協議,被用於在web瀏覽器和網站服務器之間傳遞信息。http協議工作是以明文方式發送內容,不提供任何形式的數據加密,而這也是很容易被黑客利用的地方,如果黑客截取了web瀏覽器和網站服務器之間的傳輸信息,就可以直接讀懂其中的信息,因此http協議不適合傳輸一些重要的、敏感的信息,比如信用卡密碼及支付驗證碼等。 安全套接字層https協議就是為了解決http協議的這一安全缺陷而出生的,為了數據傳輸的安全,https在http的基礎上加入了ssl協議,ssl依靠證書來驗證服務器的身份,為瀏覽器和服務器之間的通信加密,這樣的話即使黑客借去了發送過程中的信息,也無法破解讀懂它,我們網站及用戶的信息便得到了最大的安全保障。 https協議需要到ca申請證書,一般免費證書很少,需要費用。 http是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的ssl加密傳輸協議 http和https使用的是完全不同的連接方式用的端口也不一樣,前者是80,後者是443。 http的連接很簡單,是無狀態的, HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議 要比http協議安全 3、 域名和IP之間有什麽關系,如何查看某個域名對應的所有IP? 國際互聯網(Internet)上有成千百萬臺主機(host),為了區分這些主機,人們給每臺主機都分配了一個專門的“地址”作為標識,稱為IP地址 由於IP地址全是些的數字,為了便於用戶記憶,Internet上引進了域名服務系統DNS(Domain Name System)。 當您鍵入某個域名的時候,這個信息首先到達提供此域名解析的服務器上,再將此域名解析為相應網站的IP地址。完成這一任務的過程就稱為域名解析。 1.ping 2.nslookup 3.使用站長工具等
4、 http協議頭中,keep-alive字段有什麽作用?

HTTP協議采用“請求-應答”模式,當使用普通模式,即非KeepAlive模式時,每個請求/應答客戶和服務器都要新建一個連接,完成 之後立即斷開連接(HTTP協議為無連接的協議); 當使用Keep-Alive模式(又稱持久連接、連接重用)時,Keep-Alive功能使客戶端到服 務器端的連接持續有效,當出現對服務器的後繼請求時,Keep-Alive功能避免了建立或者重新建立連接。 通過使用keep-alive機制,可以減少tcp連接建立次數,也意味著可以減少TIME_WAIT狀態連接,以此提高性能和提高httpd服務器的吞吐率(更少的tcp連接意味著更少的系統內核調用,socket的accept()和close()調用)。
5、 robots協議是什麽? Robots協議(也稱為爬蟲協議、爬蟲規則、機器人協議等)也就是robots.txt,網站通過robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。 Robots協議是網站國際互聯網界通行的道德規範,其目的是保護網站數據和敏感信息、確保用戶個人信息和隱私不被侵犯。因其不是命令,故需要搜索引擎自覺遵守。
6、 列出幾種常見的關系型數據庫和非關系型數據庫?(每種至少兩個)
Oracle、Mysql、SQLServer、DB2 Redis MongoDB Cassandra
7、 內存泄露是什麽?如何避免? 指由於疏忽或錯誤造成程序未能釋放已經不再使用的內存的情況。 內存泄漏並非指內存在物理上的消失,而是應用程序分配某段內存後,由於設計錯誤,失去了對該段內存的控制,因而造成了內存的浪費。 導致程序運行速度減慢甚至系統崩潰等嚴重後果。 有 __del__() 函數的對象間的循環引用是導致內存泄漏的主兇。 不使用一個對象時使用:del object 來刪除一個對象的引用計數就可以有效防止內存泄漏問題. 通過 Python 擴展模塊 gc 來查看不能回收的對象的詳細信息 可以通過 sys.getrefcount(obj) 來獲取對象的引用計數,並根據返回值是否為 0 來判斷是否內存泄漏 Python的內存管理機制 1.引用計數:通過引用計數來保持對內存中的變量跟蹤,Python內部記錄中所有在使用對象各有多少個引用。 Python中有個內部跟蹤變量叫做引用計數器,每個變量有多少個引用,簡稱引用計數。當對象被創建時就創建了一個引用計數。 當某個對象的引用計數為0時,對象就不在需要,就列入了垃圾回收隊列。 引用計數增加:1.對象被創建:x=4;2.另外的別人被創建:y=x;3.被作為參數傳遞給函數:foo(x);4.作為容器對象的一個元素:a=[1,x,‘33‘]; 引用計數減少時:1.一個本地引用離開了它的作用域。比如上面的foo(x)函數結束時,x指向的對象引用減1; 2.對象的別名被顯式的銷毀:del x ;或者del y; 3.對象的一個別名被賦值給其他對象:x=789 4.對象從一個窗口對象中移除:myList.remove(x) 5.窗口對象本身被銷毀:del myList,或者窗口對象本身離開了作用域。 2.垃圾回收 1.引用計數: 每個對象中都有ob-refcnt來做引用計數。當一個對象...,ob-refcnt就會增加,當引用的對象刪除,那麽ob-refcnt就會減少當ob-refcnt為零,就會釋放該對象的內存空間 2.標記清除: 解決循環引用的問題。先按需分配,等到沒有空閑內存的時候,從寄存器和程序棧上的引用出發,遍歷所有對象和引用把所有能訪問的打標記,最後將沒有標記的對象釋放掉 3.分代技術: 提高效率,提高垃圾回收的效率,按照存活時間,分成不同的集合。將內存塊按照其存活時間劃分為不同的集合。每個集合就稱為一個“代”,垃圾回收的頻率隨代的存活時間增大而減小。。Python默認定義分代對象集合,引用數越大,對象的存活時間越長 3.內存池機制 在Python中,大多數申請的都是小塊的內存,會執行大量的malloc和free操作。Python引入了一個內存池機制,用於管理對小塊內存的申請和釋放,即Pymalloc機制。 它將不用的內存放到內存池而不是返回給操作系統。 1. 當申請的內存小於256字節時,PyObject_Malloc會在內存池中申請內存;當申請的內存大於256字節時,PyObject_Malloc的行為將蛻化為malloc的行為。當然,通過修改Python源代碼,我們可以改變這個默認值,從而改變Python的默認內存管理行為。 2. 對於Python對象,如整數,浮點數和List,都有其獨立的私有內存池,對象間不共享他們的內存池。也就是說如果你分配又釋放了大量的整數,用於緩存這些整數的內存就不能再分配給浮點數。 8、 列舉幾個常用的dom解析項目、插件 xml、libxml2 、lxml 、xpath
9、 常見的反爬蟲機制有哪些? 通過headers反爬蟲:解決策略,偽造headers 基於用戶行為反爬蟲:動態變化去爬取數據,模擬普通用戶的行為 基於動態頁面的反爬蟲:跟蹤服務器發送的ajax請求,模擬ajax請求
10、如何提高爬取效率? 1. 爬取方面,利用異步io。 2.處理方面,利用消息隊列做生產者消費者模型 1、樓梯問題   1.1、給一個樓梯,從最下面往上走,每次可以走1到n步,求總共有多少種走法?   1.2、給一個樓梯,從最下面往上走,每次可以走1步或2步,求總共有多少種走法?   1.3、給一個樓梯,從最下面往上走,每次可以走1步或2步或3步,求總共有多少種走法? # 1、 給一個樓梯,從最下面往上走,每次可以走1或2步,求總共有多少種走法? # 假設只有一個臺階,那麽只有一種跳法,那就是一次跳一級,f(1)=1;如果有兩個臺階,那麽有兩種跳法,第一種跳法是一次跳一級,第二種跳法是一次跳兩級,f(2)=2。 # 如果有大於2級的n級臺階,那麽假如第一次跳一級臺階,剩下還有n-1級臺階,有f(n-1)種跳法,假如第一次條2級臺階,剩下n-2級臺階,有f(n-2)種跳法。這就表示f(n)=f(n-1)+f(n-2)。 def walk_stairs(stairs): if stairs == 1: return 1 if stairs == 2: return 2 else: return walk_stairs(stairs-1) + walk_stairs(stairs-2) # 2、給一個樓梯,從最下面往上走,每次可以走1到n步,求總共有多少種走法? # 上1個臺階 1 # 上2個臺階 2 # 上3個臺階 4 # 上4個臺階 8 # 上n個臺階 2^(n-1) # 3、給一個樓梯,從最下面往上走,每次可以走1步或2步或3步,求總共有多少種走法? # 上1個臺階 2^(1-1) # 上2個臺階 2^(2-1) # 上3個臺階 2^(3-1) # f(n) = f(n-1) + f(n-2) + f(n-3)
2、 給一個字符數組,字符包含a-z、1-9,比如:a b c 4 b 2 a c 1 1 3,求只出現一次的第一次出現的字符 str_list = [‘a‘, ‘b‘, ‘c‘, 4, ‘b‘, 2, ‘a‘, ‘c‘, 1, 1, 3] def find_only_one(alist): for string in alist: count = alist.count(string) if count == 1: return string return None
3、 有一個html文本字符串,讓我取出<a href="提示我這個鏈接地址">sflkj</a>這個a標簽裏面的href的鏈接地址? from bs4 import BeautifulSoup text = "<a href=‘提示我這個鏈接地址‘>sflkj</a>" the_html = BeautifulSoup(text,features=‘lxml‘) print(the_html.find(‘a‘).attrs[‘href‘])
4、 下面是一個單線程的代碼,請改寫成多線程的: start = "http://google.com" queue = [start] visited = {start} while queue: url = queue.pop(0) print(url) for next_url in extract_url(url): if next_url not in visited: queue.append(next_url) visited.add(next_url)
答案: from concurrent.futures import ThreadPoolExecutor start = "http://google.com" queue = [start] visited = {start} pool = ThreadPoolExecutor(10) def func(url): for next_url in extract_url(url): if next_url not in visited: queue.append(next_url) visited.add(next_url) while queue: url = queue.pop(0) pool.submit(func,url) pool.shutdown(wait=True)

  

Python----面試題(三)