2018年值得收藏python爬蟲面試寶典(常見問題)
是否了解線程的同步和非同步?
線程同步:多個線程同時訪問同一資源,等待資源訪問結束,浪費時間,效率低
線程非同步:在訪問資源時在空閑等待時同時訪問其他資源,實現多線程機制
是否了解網路的同步和非同步?
同步:提交請求->等待伺服器處理->處理完畢返回 這個期間客戶端瀏覽器不能幹任何事
非同步: 請求通過事件觸發->伺服器處理(這是瀏覽器仍然可以作其他事情)->處理完畢
鏈表和順序表儲存時各自有什麼優點?
1.順序表存儲
原理:順序表存儲是將數據元素放到一塊連續的內存存儲空間,存取效率高,速度快。但是不可以動態增加長度
優點:存取速度高效,通過下標來直接存儲
缺點:1.插入和刪除比較慢,2.不可以增長長度
比如:插入或者刪除一個元素時,整個表需要遍歷移動元素來重新排一次順序
2.鏈表存儲
原理:鏈表存儲是在程序運行過程中動態的分配空間,只要存儲器還有空間,就不會發生存儲溢出問題
優點:插入和刪除速度快,保留原有的物理順序,比如:插入或者刪除一個元素時,只需要改變指針指向即可
缺點:查找速度慢,因為查找時,需要循環鏈表訪問
使用redis搭建分散式系統時如何處理網路延遲和網路異常?
由於網路異常的存在,分散式系統中請求結果存在「三態」的概念,即三種狀態:「成功」、「失敗」、「超時(未知)」
當出現「超時」時可以通過發起讀取數據的操作以驗證 RPC 是否成功(例如銀行系統的做法)
另一種簡單的做法是,設計分散式協議時將執行步驟設計為可重試的,即具有所謂的「冪等性」
數據倉庫是什麼?
數據倉庫是一個面向主題的、集成的、穩定的、反映歷史變化的、隨著時間的流逝發生變化的數據集合。它主要支持管理人員的決策分析。
數據倉庫收集了企業相關內部和外部各個業務系統數據源、歸檔文件等一系列歷史數據,最後轉化成企業需要的戰略決策信息。
特點:
面向主題:根據業務的不同而進行的內容劃分;
集成特性:因為不同的業務源數據具有不同的數據特點,當業務源數據進入到數據倉庫時,需要採用統一的編碼格式進行數據載入,從而保證數據倉庫中數據的唯一性;
非易失性:數據倉庫通過保存數據不同歷史的各種狀態,並不對數據進行任何更新操作。
歷史特性:數據保留時間戳欄位,記錄每個數據在不同時間內的各種狀態。
假設有一個爬蟲,從網路上獲取數據的頻率快,本地寫入數據的頻率慢,使用什麼數據結構好?
在線求解(o°ω°o)
你是否了解谷歌的無頭瀏覽器?
無頭瀏覽器即headless browser,是一種沒有界面的瀏覽器。既然是瀏覽器那麼瀏覽器該有的東西它都應該有,只是看不到界面而已。
Python中selenium模塊中的PhantomJS即為無界面瀏覽器(無頭瀏覽器):是基於QtWebkit的無頭瀏覽器,
你是否了解MySQL資料庫的幾種引擎?
InnoDB:
InnoDB是一個健壯的事務型存儲引擎,這種存儲引擎已經被很多互聯網公司使用,為用戶操作非常大的數據存儲提供了一個強大的解決方案。
在以下場合下,使用InnoDB是最理想的選擇:
1.更新密集的表。InnoDB存儲引擎特別適合處理多重並發的更新請求。
2.事務。InnoDB存儲引擎是支持事務的標準MySQL存儲引擎。
3.自動災難恢復。與其它存儲引擎不同,InnoDB表能夠自動從災難中恢復。
4.外鍵約束。MySQL支持外鍵的存儲引擎只有InnoDB。
5.支持自動增加列AUTO_INCREMENT屬性。
一般來說,如果需要事務支持,並且有較高的並發讀取頻率,InnoDB是不錯的選擇。
MEMORY:
使用MySQL Memory存儲引擎的出發點是速度。為得到最快的響應時間,採用的邏輯存儲介質是系統內存。
雖然在內存中存儲表數據確實會提供很高的性能,但當mysqld守護進程崩潰時,所有的Memory數據都會丟失。
獲得速度的同時也帶來了一些缺陷。
一般在以下幾種情況下使用Memory存儲引擎:
1.目標數據較小,而且被非常頻繁地訪問。在內存中存放數據,所以會造成內存的使用,可以通過參數max_heap_table_size控制Memory表的大小,設置此參數,就可以限制Memory表的最大大小。
2.如果數據是臨時的,而且要求必須立即可用,那麼就可以存放在內存表中。
3.存儲在Memory表中的數據如果突然丟失,不會對應用服務產生實質的負面影響。
redis資料庫有哪幾種數據結構?
5種數據結構
string
使用string時,redis**大多數情況下**並不會理解或者解析其含義,無論使用json、xml還是純文本在redis看來都是一樣的,只是一個字元串,只能進行strlen、append等對字元串通用的操作,無法針對其內容進一步操作。其基本操作命令有set、get、strlen、getrange、append:
使用hash時,在我看來,就是value本身就是一組key-value對,不過redis將這裡的key稱為field(但是hkeys命令為什麼不叫hfields命令呢哈哈),也就是value是一組field-value對。其基本操作命令有hset、hget、hmset、hmget、hgetall、hkeys和hdel:
list
使用list時,value就是一個string數組,操作這組string時,可以像對待棧一樣使用pop和push操作,但是這個棧兩端都能進行操作;也可以像對待數組一樣使用一個index參數來操作。list的操作命令略雜,主要分為兩類:L開頭的和R開頭的,L代表LEFT或者LIST,進行一些從列表左端進行的操作,或者一些與端無關的操作;R代表RIGHT,進行一些從列表右端進行的操作。
set
set用於存儲一組不重複的值,也可以進行一些集合的操作,就像數學上的集合,它是無序的。基本操作有sadd和sismember:
sorted set
sorted set類似set,但是sorted set里每個元素都有一個score,這個score可用於排序和排名。基本操作有zadd、zcount、zrank:
總結
以上所述是小編給大家介紹的python爬蟲面試經典(常見問題),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。
推薦閱讀:
※聊聊Python ctypes 模塊
※Python 數據分析(一):常見數據結構的使用
※pandas可視化(2)【官方文檔解讀】-- 條形圖、直方圖
※如何找到適合需求的 Python 庫?
※零基礎爬蟲學習全記錄2:今日頭條指定搜索內容下的所有圖集圖片保存——圖片採集小程序