Python-爬蟲工程師-面試總結

Ovin發表於2019-02-16

注:答案一般在網上都能夠找到。
1.對if __name__ == `main`的理解陳述
2.python是如何進行記憶體管理的?
3.請寫出一段Python程式碼實現刪除一個list裡面的重複元素
4.Python裡面如何拷貝一個物件?(賦值,淺拷貝,深拷貝的區別)
5.介紹一下except的用法和作用?
6.Python中__new__與__init__方法的區別
7.常用的網路資料爬取方法
8.遇到過得反爬蟲策略以及解決方法
9.urllib 和 urllib2 的區別
10.設計一個基於session登入驗證的爬蟲方案
11.列舉網路爬蟲所用到的網路資料包,解析包
12.熟悉的爬蟲框架
13.Python在伺服器的部署流程,以及環境隔離
14.Django 和 Flask 的相同點與不同點,如何進行選擇?
15.寫一個Python中的單例模式
16.Linux部署服務指令碼命令(包括啟動和停止的shell指令碼)
17.你用過多執行緒和非同步嘛?除此之外你還用過什麼方法來提高爬蟲效率?
18.POST 與 GET的區別

  1. if __name__ == `main`的理解陳述
    __name__是當前模組名,當模組被直接執行時模組名為__main__,也就是當前的模組,當模組被匯入時,模組名就不是__main__,即程式碼將不會執行。
  2. python是如何進行記憶體管理的?
    a、物件的引用計數機制
    python內部使用引用計數,來保持追蹤記憶體中的物件,Python內部記錄了物件有多少個引用,即引用計數,當物件被建立時就建立了一個引用計數,當物件不再需要時,這個物件的引用計數為0時,它被垃圾回收。
    b、垃圾回收
    1>當一個物件的引用計數歸零時,它將被垃圾收集機制處理掉。
    2>當兩個物件a和b相互引用時,del語句可以減少a和b的引用計數,並銷燬用於引用底層物件 的名稱。然而由於每個物件都包含一個對其他物件的應用,因此引用計數不會歸零,物件也不會銷燬。(從而導致記憶體洩露)。為解決這一問題,直譯器會定期執行一個迴圈檢測器,搜尋不可訪問物件的迴圈並刪除它們。
    c、記憶體池機制
    Python提供了對記憶體的垃圾收集機制,但是它將不用的記憶體放到記憶體池而不是返回給作業系統。
    1>Pymalloc機制。為了加速Python的執行效率,Python引入了一個記憶體池機制,用於管理 對小塊記憶體的申請和釋放。
    2>Python中所有小於256個位元組的物件都使用pymalloc實現的分配器,而大的物件則使用 系統的malloc。
    3>對於Python物件,如整數,浮點數和List,都有其獨立的私有記憶體池,物件間不共享他們的記憶體池。也就是說如果你分配又釋放了大量的整數,用於快取這些整數的記憶體就不能再分配給浮點數。
  3. 請寫出一段Python程式碼實現刪除一個list裡面的重複元素

    # 1.使用set函式
    list = [1, 3, 4, 5, 51, 2, 3]
    set(list)
    # 2.使用字典函式,
    >>> a = [1, 2, 4, 2, 4, 5, 6, 5, 7, 8, 9, 0]
    >>> b = {}
    >>> b = b.fromkeys(a)
    >>> c = list(b.keys())
    >>> c
  4. Python裡面如何拷貝一個物件?(賦值,淺拷貝,深拷貝的區別)
    賦值(=),就是建立了物件的一個新的引用,修改其中任意一個變數都會影響到另一個。
    淺拷貝:建立一個新的物件,但它包含的是對原始物件中包含項的引用(如果用引用的方式修改其中一個物件,另外一個也會修改改變){1,完全切片方法;2,工廠函式,如list();3,copy模組的copy()函式}
    深拷貝:建立一個新的物件,並且遞迴的複製它所包含的物件(修改其中一個,另外一個不會改變){copy模組的deep.deepcopy()函式}
  5. 介紹一下except的用法和作用?
    try…except…except…else…
    執行try下的語句,如果引發異常,則執行過程會跳到except語句。對每個except分支順序嘗試執行,如果引發的異常與except中的異常組匹配,執行相應的語句。如果所有的except都不匹配,則異常會傳遞到下一個呼叫本程式碼的最高層try程式碼中。
    try下的語句正常執行,則執行else塊程式碼。如果發生異常,就不會執行如果存在finally語句,最後總是會執行。
  6. Python中__new____init__方法的區別
    __new__:它是建立物件時呼叫,會返回當前物件的一個例項,可以用__new__來實現單例
    __init__:它是建立物件後呼叫,對當前物件的一些例項初始化,無返回值
  7. 常用的網路資料爬取方法

    • 正規表示式
    • Beautiful Soup
    • Lxml
  8. 遇到過得反爬蟲策略以及解決方法
    1.通過headers反爬蟲
    2.基於使用者行為的發爬蟲:(同一IP短時間內訪問的頻率)
    3.動態網頁反爬蟲(通過ajax請求資料,或者通過JavaScript生成)
    4.對部分資料進行加密處理的(資料是亂碼)
    解決方法:
    對於基本網頁的抓取可以自定義headers,新增headers的資料
    使用多個代理ip進行抓取或者設定抓取的頻率降低一些,
    動態網頁的可以使用selenium + phantomjs 進行抓取
    對部分資料進行加密的,可以使用selenium進行截圖,使用python自帶的pytesseract庫進行識別,但是比較慢最直接的方法是找到加密的方法進行逆向推理。
  9. urlliburllib2 的區別
    urlliburllib2都是接受URL請求的相關模組,但是urllib2可以接受一個Request類的例項來設定URL請求的headersurllib僅可以接受URL。urllib不可以偽裝你的User-Agent字串。
    urllib提供urlencode()方法用來GET查詢字串的產生,而urllib2沒有。這是為何urllib常和urllib2一起使用的原因。
  10. 設計一個基於session登入驗證的爬蟲方案
  11. 列舉網路爬蟲所用到的網路資料包,解析包

    • 網路資料包 urllib、urllib2、requests
    • 解析包 re、xpath、beautiful soup、lxml
  12. 熟悉的爬蟲框架
    Scrapy框架 根據自己的實際情況回答
  13. Python在伺服器的部署流程,以及環境隔離
  14. Django 和 Flask 的相同點與不同點,如何進行選擇?
  15. 寫一個Python中的單例模式

    class Singleton(object):
        _instance = None
        def __new__(cls, *args, **kw):
            if not cls._instance:
                cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)  
            return cls._instance  
    
    class MyClass(Singleton):  
        a = 1
        
    one = MyClass()
    two = MyClass()
    
    id(one) = id(two)
    >>> True
    
  16. Linux部署服務指令碼命令(包括啟動和停止的shell指令碼)
  17. 你用過多執行緒和非同步嘛?除此之外你還用過什麼方法來提高爬蟲效率?

    • scrapy-redis 分散式爬取
    • 對於定向爬取可以用正則取代xpath
  18. POST與 GET的區別

    • GET資料傳輸安全性低,POST傳輸資料安全性高,因為引數不會被儲存在瀏覽器歷史或web伺服器日誌中;
    • 在做資料查詢時,建議用GET方式;而在做資料新增、修改或刪除時,建議用POST方式;
    • GET在url中傳遞資料,資料資訊放在請求頭中;而POST請求資訊放在請求體中進行傳遞資料;
    • GET傳輸資料的資料量較小,只能在請求頭中傳送資料,而POST傳輸資料資訊比較大,一般不受限制;
    • 在執行效率來說,GET比POST好
  19. 什麼是lambda函式?它有什麼好處?
    lambda 表示式,通常是在需要一個函式,但是又不想費神去命名一個函式的場合下使用,也就是指匿名函式
    lambda函式:首要用途是指點短小的回撥函式

    lambda [arguments]:expression
    >>> a=lambdax,y:x+y
    >>> a(3,11)

相關文章