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

注:答案通常在網上都可以找到。
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的區別python

  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裏面的重複元素web

    # 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. 經常使用的網絡數據爬取方法ajax

    • 正則表達式
    • 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、urllib二、requests
    • 解析包 re、xpath、beautiful soup、lxml
  12. 熟悉的爬蟲框架
    Scrapy框架 根據本身的實際狀況回答
  13. Python在服務器的部署流程,以及環境隔離
  14. Django 和 Flask 的相同點與不一樣點,如何進行選擇?
  15. 寫一個Python中的單例模式redis

    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. 你用過多線程和異步嘛?除此以外你還用過什麼方法來提升爬蟲效率?shell

    • scrapy-redis 分佈式爬取
    • 對於定向爬取能夠用正則取代xpath
  18. POST與 GET的區別express

    • 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)
相關文章
相關標籤/搜索