日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 爬虫面试题_Python爬虫面试题

發布時間:2025/3/20 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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爬虫面试题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。