python 爬虫面试题_Python爬虫面试题
該樓層疑似違規已被系統折疊?隱藏此樓查看此樓
1、tcp和udp的區別?
TCP(Transmission Control Protocol,傳輸控制協議)是面向連接的協議,也就是說,在收發數據前,必須和對方建立可靠的連接。一個TCP連接必須要經過三次“對話”才能建立起來,其中的過程非常復雜,只簡單的描述下這三次對話的簡單過程:主機A向主機B發出連接請求數據包:“我想給你發數據,可以嗎?”,這是第一次對話;主機B向主機A發送同意連接和要求同步(同步就是兩臺主機一個在發送,一個在接收,協調工作)的數據包:“可以,你什么時候發?”,這是第二次對話;主機A再發出一個數據包確認主機B的要求同步:“我現在就發,你接著吧!”,這是第三次對話。三次“對話”的目的是使數據包的發送和接收同步,經過三次“對話”之后,主機A才向主機B正式發送數據。
TCP三次握手過程:
1 主機A通過向主機B 發送一個含有同步序列號的標志位的數據段給主機B ,向主機B 請求建立連接,通過這個數據段,主機A告訴主機B 兩件事:我想要和你通信;你可以用哪個序列號作為起始數據段來回應我.
2 主機B 收到主機A的請求后,用一個帶有確認應答(ACK)和同步序列號(SYN)標志位的數據段響應主機A,也告訴主機A兩件事:我已經收到你的請求了,你可以傳輸數據了;你要用哪佧序列號作為起始數據段來回應我
3 主機A收到這個數據段后,再發送一個確認應答,確認已收到主機B 的數據段:"我已收到回復,我現在要開始傳輸實際數據了這樣3次握手就完成了,主機A和主機B 就可以傳輸數據了.
3次握手的特點:
沒有應用層的數據
SYN這個標志位只有在TCP建產連接時才會被置1
握手完成后SYN標志位被置0
TCP建立連接要進行3次握手,而斷開連接要進行4次:
1 當主機A完成數據傳輸后,將控制位FIN置1,提出停止TCP連接的請求
2 主機B收到FIN后對其作出響應,確認這一方向上的TCP連接將關閉,將ACK置1
3 由B 端再提出反方向的關閉請求,將FIN置1
4 主機A對主機B的請求進行確認,將ACK置1,雙方向的關閉結束.
由TCP的三次握手和四次斷開可以看出,TCP使用面向連接的通信方式,大大提高了數據通信的可靠性,使發送數據端和接收端在數據正式傳輸前就有了交互,為數據正式傳輸打下了可靠的基礎。
名詞解釋:
ACK TCP報頭的控制位之一,對數據進行確認.確認由目的端發出,用它來告訴發送端這個序列號之前的數據段都收到了.比如,確認號為X,則表示前X-1個數據段都收到了,只有當ACK=1時,確認號才有效,當ACK=0時,確認號無效,這時會要求重傳數據,保證數據的完整性.
SYN 同步序列號,TCP建立連接時將這個位置1
FIN 發送端完成發送任務位,當TCP完成數據傳輸需要斷開時,提出斷開連接的一方將這位置1
TCP的包頭結構:
源端口 16位
目標端口 16位
序列號 32位
回應序號 32位
TCP頭長度 4位
reserved 6位
控制代碼 6位
窗口大小 16位
偏移量 16位
校驗和 16位
選項 32位(可選)
這樣我們得出了TCP包頭的最小長度,為20字節。
UDP(User Data Protocol,用戶數據報協議)
(1) UDP是一個非連接的協議,傳輸數據之前源端和終端不建立連接,當它想傳送時就簡單地去抓取來自應用程序的數據,并盡可能快地把它扔到網絡上。在發送端,UDP傳送數據的速度僅僅是受應用程序生成數據的速度、計算機的能力和傳輸帶寬的限制;在接收端,UDP把每個消息段放在隊列中,應用程序每次從隊列中讀一個消息段。
(2) 由于傳輸數據不建立連接,因此也就不需要維護連接狀態,包括收發狀態等,因此一臺服務機可同時向多個客戶機傳輸相同的消息。
(3) UDP信息包的標題很短,只有8個字節,相對于TCP的20個字節信息包的額外開銷很小。
(4) 吞吐量不受擁擠控制算法的調節,只受應用軟件生成數據的速率、傳輸帶寬、源端和終端主機性能的限制。
(5)UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持復雜的鏈接狀態表(這里面有許多參數)。
(6)UDP是面向報文的。發送方的UDP對應用程序交下來的報文,在添加首部后就向下交付給IP層。既不拆分,也不合并,而是保留這些報文的邊界,因此,應用程序需要選擇合適的報文大小。
我們經常使用“ping”命令來測試兩臺主機之間TCP/IP通信是否正常,其實“ping”命令的原理就是向對方主機發送UDP數據包,然后對方主機確認收到數據包,如果數據包是否到達的消息及時反饋回來,那么網絡就是通的。
UDP的包頭結構:
源端口 16位
目的端口 16位
長度 16位
校驗和 16位
小結TCP與UDP的區別:
1.基于連接與無連接;
2.對系統資源的要求(TCP較多,UDP少);
3.UDP程序結構較簡單;
4.流模式與數據報模式 ;
5.TCP保證數據正確性,UDP可能丟包,TCP保證數據順序,UDP不保證。
2、對內存中棧和堆的了解?
棧: 什么是棧,它是你的電腦內存的一個特別區域,它用來存儲被每一個function(包括mian()方法)創建的臨時變量。棧是FILO,就是先進后出原則的結構體,它密切的被CPU管理和充分利用。每次function聲明一個新的變量,它就會被“推”到棧中。然后每次一個function退出時,所有關于這個函數中定義的變量都會被釋放(換句話說就是刪除)。一旦棧中的變量釋放,這塊區域就會變成可用的,提供給其他棧中的變量。 用棧存儲變量的好處是,內存是被你管理的。你不用手動的創建內存,不用當你不在需要它的時候手動釋放內存。另外,由于CPU組織棧內存很高效。讀出和寫入棧變量是很快的。 理解棧的關鍵是理解概念,當一個function退出時,所有它的變量都會從棧中彈出,以后都會永遠消失。因此棧中的變量本質是局部的。這和我們原來理解為變量作用域或者本地或者全局變量是相關的。在C中,一個公共的bug 是從你程序中的一個function外嘗試訪問一個在棧中的這個function的變量(在該function已經退出后)。 關于棧的另一個特點我們應該記住,就是存儲在棧中的變量的大小有限制。而堆上創建變量不用考慮。 總結棧: a、棧的伸長和伸縮就是函數壓入或者推出局部變量。 b、我們不用自己去管理內存,變量創建和釋放都是自動的。 c、棧中的變量只有在函數創建運行時存在。 堆: 堆也是我們的計算機內存中的一個區域,但是他不是自動管理的。而且也不是被CPU密切的管理著。它是一片更加自由的內存區域(很大)。要想在堆上創建內存,我們必須使用malloc() 或者calloc(),他們都是C語言編譯的。一旦你在堆上分配內存,當你不在需要的時候你必須用free()去銷毀。如果你不銷毀或者銷毀失敗,你的程序就會有內存泄露。換句話說就是堆內存會一直在,其他進程無法使用。 不像棧,堆沒有變量大小的限制(除了你電腦的物理限制條件外)。堆內存讀出和寫入都比較慢,因為它必須使用指針圖訪問堆內存。 棧和堆的優缺點: 棧: a、快速訪問。 b、沒有必要明確的創建分類變量,因為它是自動管理的。 c、空間被CPU高效地管理著,內存不會變成碎片。 d、只有局部變量 e、受限于棧大小(取決于操作系統) f、變量不能調整大小。 堆: a、變量可以被全局訪問 b、沒有內存大小限制 c、(相對)訪問比較慢 d、沒有高效地使用空間,隨著塊內存的創建和銷毀,內存可能會變成碎片。 e、你必須管理內存(變量的創建和銷毀你必須要負責) f、變量大小可以用realloc( )調整 3、爬蟲框架scrapy的工作流程 a、spider解析下載器下下來的response,返回item或是links b、item或者link經過spidermiddleware的process_spider_out( )方法,交給engine c、engine將item交給item pipeline ,將links交給調度器 d、在調度器中,先將requests對象利用scrapy內置的指紋函數生成一個指紋對象 e、如果requests對象中的don't filter參數設置為False,并且該requests對象的指紋不在信息指紋的隊列中,那么就把該request對象放到優先級隊列中 f、從優先級隊列中獲取request對象,交給engine g、engine將request對象交給下載器下載,期間會通過downloadmiddleware的process_request方法 h、下載器完成下載,獲得response對象,將該對象交給engine,期間會經過downloadmiddleware的process_response( )方法 i、engine將獲得的response對象交給spider進行解析,期間會經過spidermiddleware的process_spider_input()的方法 j、從a開始循環 4、字典、列表查詢時的時間復雜度是怎樣的?
列表是序列,可以理解為數據結構中的數組,字典可以理解為數據結構中的hashmap,python中list對象的存儲結構采用的是線性表,因此其查詢復雜度為O(n),而dict對象的存儲結構采用的是散列表(hash表),其在最優情況下查詢復雜度為O(1)。dict的占用內存稍比list大,會在1.5倍左右。
5、遞歸中如果沒有終止條件會怎樣?
概念:遞歸算法是一種直接或者間接的調用自身算法的過程。在計算機編寫程序中,遞歸算法對解決一大類問題是十分有效的。
特點:
①遞歸就是在過程或者函數里調用自身。
②在使用遞歸策略時,必須有一個明確的遞歸條件,稱為遞歸出口。
③遞歸算法解題通常顯得很簡潔,但遞歸算法解題的效率較低。所以一般不倡導使用遞歸算法設計程序。
④在遞歸調用的過程當中系統的每一層的返回點、局部變量等開辟了棧來存儲。遞歸函數次數過多容易造成棧溢出等。 所以一般不倡導用遞歸算法設計程序
遞歸如果沒有終止條件會導致遞歸調用成為死循環而不能正常結束,并且會造成棧溢出
筆試
1、去除列表中的重復元素
def distinct_list(list): d_l = [] for i in list: if i not in d_l: d_l.append(i) return d_l
2、得到列表的一個子列表,該列表滿足列表中的元素在原列表中是連續的,且子列表的所有元素之和最大。例如[1, -2, 3, -1, 2] => [3, -1, 2]
總結
以上是生活随笔為你收集整理的python 爬虫面试题_Python爬虫面试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python车辆路径优化_车辆路径问题中
- 下一篇: python访问服务器注册表,如何在Py