1. 程式人生 > >Python中一些可能會問到的面試題

Python中一些可能會問到的面試題

功能 相關 數量 困難 數據不一致 字符編碼 存取 虛擬 model

同步與異步

  • 同步和異步關註的是消息通信機制 (synchronous communication/ asynchronous communication)
    所謂同步,就是在發出一個調用時,在沒有得到結果之前,該調用就不返回。但是一旦調用返回,就得到返回值了。
    換句話說,就是由調用者主動等待這個調用的結果。
  • 而異步則是相反,調用在發出之後,這個調用就直接返回了,所以沒有返回結果。換句話說,當一個異步過程調用發出後,調用者不會立刻得到結果。而是在調用發出後,被調用者通過狀態、通知來通知調用者,或通過回調函數處理這個調用。

    談談python的裝飾器,叠代器,yield

  • 裝飾器:裝飾器的本質是一個閉包函數,他的作用就是讓其他函數在不需要做任何代碼修改的前提下增加額外功能,裝飾器的返回值也是一個函數對象.我們通常在一些有切面需求的場景,比如:插入日誌,性能測試,事務處理,緩存,權限校驗等場景,有了裝飾器我們就可以少寫很多重復代碼,提高工作效率.
  • 叠代器:叠代器是一中訪問可叠代對象的方式,通常從第一個元素開始訪問,知道所有的元素都被訪問完才結束,叠代器只能前進不能後退,使用叠代器可以不用事先準備好帶跌過程中的所有元素,僅僅是在叠代到該元素的時候才計算該元素,而在這之前的元素則是被銷毀,因此叠代器適合遍歷一些數據量巨大的無限的序列.
    叠代器的本質就是調用__iter__方法,每次調用的時候返回一個元素,當沒有下一個元素的時候會拋出StopIteration異常

    python適合的場景有哪些?當遇到計算密集型任務怎麽辦?

  • 適用場景:網站運維,金融分析,服務器編寫,爬蟲
  • 當遇到io密集型任務時,涉及到的大多是網絡,磁盤等任務,這一類任務的特性是cpu小號低,使用多線程.
  • 計算密集型的任務主要是消耗cpu性能,誰要運用多進程,當然運用python語言的運行效率很低,所以一般對於計算密集型任務,可以使用c語言編寫

    談談mysql字符集和排序規則

  • 字符集,即用於定義字符在數據庫中的編碼的集合。 常見的字符集:utf-8 gbk 等
  • 排序規則,就是指字符比較時是否區分大小寫,以及是按照字符編碼進行比較還是直接用二進制數據比較。

    說一下線程、進程、協程?

  • 回答:進程是具有一定獨立功能的程序關於某個數據集合上的一 次運行活動,進程是系統進行資源分配和調度的一個獨立單位。
  • 每個進程都有自己的獨立內存空間,不同進程通過進程間通信 來通信。由於進程比較重量,占據獨立的內存,所以上下文進程間的切換開銷(棧、寄存器、虛擬內存、文件句柄等)比較 大,但相對比較穩定安全。
  • 線程是進程的一個實體,是 CPU 調度和分派的基本單位, 它是比進程更小的能獨立運行的基本單位.線程自己基本上不 擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計 數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線 程共享進程所擁有的全部資源。線程間通信主要通過共享內存, 上下文切換很快,資源開銷較少,但相比進程不夠穩定容易丟 失數據。
  • 協程是一種用戶態的輕量級線程,協程的調度完全由用戶 控制。協程擁有自己的寄存器上下文和棧。協程調度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復先前保存的寄存器上下文和棧,直接操作棧則基本沒有內核切 換的開銷,可以不加鎖的訪問全局變量,所以上下文的切換非 常快。
  • 最好說一下在項目中如何使用,舉個例子

    如何解決線程安全?

  • 線程安全是在多線程的環境下,能夠保證多個線程同時執行時程序依舊運行正確, 而且要保證對於共享的數據可以由多個線程存取,但是同一時刻只能有一個線程進行存取。多線程環境下解決資源競爭問題的辦法是加鎖來保證存取操作的唯一性。如何加鎖? 分布式 負載均衡

    常用的linux命令

  • ls,cd,more,clear,mkdir,pwd,rm,grep,find,mv,su,date等等

    什麽是面向對象編程?

  • 答技巧:說一下什麽事面向對象編程,再說說為什麽要面向對象編程,面向對象特性。
  • 回答:
    面向對象編程是一種解決軟件復用的設計和編程方法。 這種方法把軟件系統中相近相似的操作邏輯和操作應用數據、狀態,以類的型式 述出來,以對象實例的形式在軟件系統中復用,以達到高軟件開發效率的作用。封裝,繼承多態.

    如何提高 Python 的運行效率,請說出不少於 2 種提高運行效率的方法?

  • 1.使用生成器
  • 2.關鍵代碼使用外部功能包:Cython、Pylnlne、PyPy、Pyrex
  • 3.針對循環的優化——盡量避免在循環中訪問變量的屬性;

    說一下 MySQL 數據庫存儲的原理?

  • 回答技巧:先回答一下mysql的原理,拓展一下它的有點,或者mysql你是怎麽用的?
  • 回答:儲存過程是一個可編程的函數,它在數據庫中創建並保存。它可以有 SQL 語句和一些特殊的控制結構組成。當希望在不同的應用程序或平臺上執行相同的函數,或者封裝特定功能時,存儲過程是非常有用的。數據庫中的存儲過程可以看做是對編程中面向對象方法的模擬。它允許控制數據的訪問方式。 存儲過程通常有以下優點:
  • 1)存儲過程能實現較快的執行速度。
  • 2)存儲過程允許標準組件是編程。
  • 3)存儲過程可以用流控制語句編寫,有很強的靈活性,可 以完成復雜的判斷和較復雜的運算。
  • 4)存儲過程可被作為一種安全機制來充分利用。
  • 5)存儲過程能過減少網絡流量

    你工作中遇到哪些bug,怎麽解決的?

  • 回答技巧:不要聊一些小bug,聊一些印象深刻。或者可以把這道題轉化成你遇到什麽困難
  • 回答:
  • 1.剛入行的時候,對業務不太熟悉,加上給的業務文檔不清晰,導致加班很多。或者第一次代碼合並,python版本更新帶來問題等等
  • 2.項目中第一次做登錄模塊/支付模塊,不太熟悉,吃了很多苦頭
  • 3.平時敲代碼中積累的bug

    說一下事務的特性?

  • 1.原子性(Atomicity):事務中的全部操作在數據庫 中是不可分割的,要麽全部完成,要麽均不執行。
  • 2.一致性(Consistency):幾個並行執行的事務,其執行 結果必須與按某一順序串行執行的結果相一致。
  • 3.隔離性(Isolation):事務的執行不受其他事務的幹擾, 事務執行的中間結果對其他事務必須是透明的。
  • 4、持久性(Durability):對於任意已 交事務,系統必須 保證該事務對數據庫的改變不被丟失,即使數據庫出

    redis 和 mysql 的區別?

  • 回答技巧:回答題目有什麽區別,然後其中一個舉例子,你是如何使用?
  • 回答:
  • redis 是內存數據庫,數據保存在內存中,速度快。
  • mysql 是關系型數據庫,持久化存儲,存放在磁盤裏面, 功能強大。檢索的話,會涉及到一定的 IO,數據訪問也就慢。
  • 我比較常用是mysql,主要創建數據庫,創建表,數據操作,增刪改查,我做的比較多是查,例如在xxx項目中,有個搜索模塊,當時我做比較簡單就是用模糊匹配去做搜索。

    redis 受攻擊怎麽辦?

  • 回答:
  • 在工作防止redis受攻擊,我都會做一下措施:
  • 1.主從
  • 2.持久化存儲Redis 不以 root 賬戶啟動
  • 3.設置復雜密碼
  • 4.不允許 key 方式登錄

    說一下mongoDB你是如何使用?

  • 回答技巧:回答mongoDB什麽,優缺點,平時怎麽用的?
  • MongoDB是一個面向文檔的數據庫系統。使用C++編寫,不 支持 SQL,但有自己功能強大的查詢語法。
  • MongoDB 使用 BSON 作為數據存儲和傳輸的格式。BSON 是 一種類似 JSON 的、二進制序列化文檔,支持嵌套對象和數組。
  • MongoDB 很像 MySQL,document 對應 MySQL 的 row, collection 對應- MySQL 的 table
  • 缺點:不支持事務,MongoDB 占用空間過大,維護工具不夠成熟
  • 應用場景:
  • 1.網站數據:mongo 非常適合實時的插入,更新與查詢, 並具備網站實時數據存儲所需的復制及高度伸縮性。
  • 2.緩存:由於性能很高,mongo 也適合作為信息基礎設 施的緩存層。在系統重啟之後,由 mongo 搭建的持久化緩存可 以避免下層的數據源過載。
  • 3.大尺寸、低價值的數據:使用傳統的關系數據庫存儲 一些數據時可能會比較貴,在此之前,很多程序員往往會選擇 傳統的文件進行存儲。
  • 4.高伸縮性的場景:mongo 非常適合由數十或者數百臺 服務器組成的數據庫。
  • 5.用於對象及 JSON 數據的存儲:mongo 的 BSON 數據格 式非常適合文檔格式化的存儲及查詢。
  • 6.重要數據:mysql,一般數據:mongodb,臨時數據: memcache

    Redis與mongodb的優缺點?

  • 回答技巧:先說一下兩者區別,再說它們優缺點
  • 回答: MongoDB 和 Redis 都是 NoSQL,采用結構型數據存儲。二者在使用場景中,存在一定的區別,這也主要由於二者在內存映射的處理過程,持久化的處理方法不同。MongoDB 建議集群部署,更多的考慮到集群方案,Redis 更偏重於進程順序寫入, 雖然支持集群,也僅限於主-從模式.
  • Redis 優點:
  • 1 讀寫性能優異
  • 2 支持數據持久化,支持 AOF 和 RDB 兩種持久化方式
  • 3 支持主從復制,主機會自動將數據同步到從機,可以進 行讀寫分離。
  • 4 數據結構豐富:除了支持 string 類型的 value 外還支 持 string、hash、set、sortedset、list 等數據結構。
  • 缺點:
  • 1 Redis 不具備自動容錯和恢復功能,主機從機的宕機都 會導致前端部分讀寫請求失敗,需要等待機器重啟或者手動切 換前端的 IP 才能恢復。
  • 2 主機宕機,宕機前有部分數據未能及時同步到從機,切 換 IP 後還會引入數據不一致的問題,降低了系統的可用性。
    1. Redis 較難支持在線擴容,在集群容量達到上限時在線 擴容會變得很復雜。為避免這一問題,運維人員在系統上線時 必須確保有足夠的空間,這對資源造成了很大的浪費.避免這一問題,運維人員在系統上線時 必須確保有足夠的空間,這對資源造成了很大的浪費。
  • mongodb的優缺點:
  • 優點:弱一致性(最終一致),更能保證用戶的訪問速度 文檔結構的存儲方式,能夠更便捷的獲取數 頻)
  • 內置 GridFS,高效存儲二進制大對象 (比如照片和視
  • 支持復制集、主備、互為主備、自動分片等特性 動態查詢 全索引支持,擴展到內部對象和內嵌數組
  • 缺點:不支持事務MongoDB 占用空間過大,維護工具不夠成熟

    數據庫怎麽優化查詢效率?

  • 回答技巧:有條理按照題目回答即可
  • 回答:
  • 1.儲存引擎選擇:如果數據表需要事務處理,應該考慮使用 InnoDB,因為它完全符合ACID 特性。如果不需要事務處理,使用默認存儲引擎MyISAM 是比較明智的
  • 2.分表分庫,主從
  • 3.對查詢進行優化,要盡量避免全表掃 ,首先應考慮在 where 及 order by 涉及的列上建立索引
  • 4.應盡量避免在 where 子句中對字段進行 null 值判斷, 否則將導致引擎放棄使用索引而進行全表掃
  • 5.應盡量避免在 where 子句中使用 != 或 <> 操作符, 否則將引擎放棄使用索引而進行全表掃
  • 6.應盡量避免在 where 子句中使用 or 來連接條件,如果 一個字段有索引,一個字段沒有索引,將導致引擎放棄使用索 引而進行全表掃
  • 7.Update語句,如果只更改1、2 個字段,不要Update全部字段,否則頻繁調用會引起明顯的性能消耗,同時帶來大 量日誌

    數據庫優化方案?

  • 回答技巧:如題回答即可
  • 1.優化索引、SQL 語句、分析慢查詢;
  • 2.設計表的時候嚴格根據數據庫的設計範式來設計數據庫;
  • 3.使用緩存,把經常訪問到的數據而且不需要經常變化的 數據放在緩存中,能節約磁盤 IO;
  • 4.優化硬件;采用 SSD,使用磁盤隊列技術 (RAID0,RAID1,RDID5)等;
  • 5.采用 MySQL 內部自帶的表分區技術,把數據分層不同 的文件,能夠 高磁
    盤的讀取效率;
  • 6.垂直分表;把一些不經常讀的數據放在一張表裏,節約 磁盤 I/O;
  • 7.主從分離讀寫;采用主從復制把數據庫的讀操作和寫入 操作分離開來;
  • 8.分庫分表分機器(數據量特別大),主要的的原理就是數據路由;
  • 9.選擇合適的表引擎,參數上的優化;
  • 10.進行架構級別的緩存,靜態化和分布式;
  • 11.不采用全文索引;
  • 12.采用更快的存儲方式,例如 NoSQL 存儲經常訪問的數

    redis 基本類型、相關方法?

  • 回答技巧:先回答問題所問的,找其中一個說明一下如何使用,在拓展一下redis如何使用的
  • 回答: Redis支持五種數據類型:string(字符串)、hash(哈希)、list(列表)、set (集合)及zset(sorted set:有序集合)。
  • String是Redis最為常用的一種數據類型,String的數據結構為key/value類型,String 可以包含任何數據。常用命令: set,get,decr,incr,mget 等

    redis 的使用場景有哪些?

  • 回答技巧:優點, 如題回答即可
  • 回答:
    -1.取最新 N 個數據的操作
    -2.排行榜應用,取 TOP N 操作
    -3.需要精準設定過期時間的應用
    -4.計數器應用
    -5.uniq 操作,獲取某段時間所有數據排重值
    -6.Pub/Sub 構建實時消息系統
    -7.構建隊列系統
    -8.緩存

    說一下冒泡排序?

  • 回答技巧:回答冒泡原理,最好能手寫,拓展一下其他排序?
  • 冒泡排序的思想: 每次比較兩個相鄰的元素, 如果他們的順序錯誤就把他們交換位置。

    def bubble_improve(l): print l
    flag = 1
    for index in range(len(l) - 1, 0 , -1):
    if flag:
    flag = 0 for two_index in range(index):
    if l[two_index] > l[two_index + 1]:
    l[two_index], l[two_index + 1] = l[two_index + 1], l[two_index]
    flag = 1
    else: break
    print ll = [10, 20, 40, 50, 30, 60] bubble_improve(l)

    說一下 Django,MIDDLEWARES 中間件的作用?

  • 回答技巧:如題回答即可。
  • 回答: 中間件是介於 request 與 response 處理之間的一道 處理過程,相對比較輕量級,並且在全局上改變 django 的輸入與輸出。

    說一下mvvm ?

  • 回答技巧:說一下MVVM,然後拓展回熟悉的MVT?
  • MVVM:將“數據模型數據雙向綁定”的思想作為核心,在 View 和 Model 之間沒有聯系,通過 ViewModel進行交互,而且 Model 和 ViewModel之間的交互是雙向的,因此視圖的數據的變化會同時修改數據源,而數據源數據的變化也會立即反應到View上。

    你對 Django 的認識?

  • 回答技巧:說一下Django是什麽,然後說一下它的優缺點,再說說項目怎麽用?
  • 回答: Django 是走大而全的方向,它最出名的是其全自動化的管 理後臺:只需要使用起 ORM,做簡單的對象定義,它就能自動生成數據庫結構、以及全功能的管理後臺。
  • 優點:
    超高的開發效率。
    適用的是中小型的網站,或者是作為大型網站快速,實現產品雛形的工具。
    徹底的將代碼、樣式分離; Django 從根本上杜絕在模板中進行編碼、處理數據的可能。
  • 缺點:
    其性能擴展有限;
    采用 Django 的項目,在流量達到一定規模後,都需要對其進行重構,才能滿足性能的要求。
    Django 內置的 ORM 跟框架內的其他模塊耦合程度高。

    說一下Jieba 分詞?

  • 回答技巧:jieba分詞有哪些,作用是什麽?
  • 回答:
  • Jieba 分詞支持三種分詞模式:
  • 精確模式:試圖將句子最精確地切開,適合文本分析;
  • 全局模式:把句子中所有的可以成詞的詞語都掃出來, 速度非常快,但是不能解決歧義;
  • 搜索引擎模式:在精確模式的基礎上,對長詞再次切分,高召回率,適合用於搜索引擎分詞
  • 功能:
  • 分詞,添加自定義詞典,關鍵詞取,詞性標註,並行分詞,Tokenize:返回詞語在原文的起始位置,ChineseAnalyzer for Whoosh 搜索引擎

    Django 重定向你是如何實現的?用的什麽狀態碼?

  • 回答技巧:如題回答即可
  • 使用 HttpResponseRedirect redirect 和 reverse ,狀態碼:302,301

    爬取下來的數據如何去重,說一下具體的算法依據?

  • 回答技巧:如題回答即可
  • 答:
  • 1.通過 MD5 生成電子指紋來判斷頁面是否改變
  • 2.nutch 去重。nutch 中 digest 是對采集的每一個網頁內 容的 32 位哈希值,如果兩個網頁內容完全一樣,它們的 digest 值肯定會一樣。

    寫爬蟲是用多進程好?還是多線程好? 為什麽?

  • 回答技巧:就是對比多線程與多進程爬蟲的優缺點
  • 回答:IO 密集型代碼(文件處理、網絡爬蟲等),多線程能夠有效升效率(單線程下有 IO 操作會進行 IO 等待,造成不必要的時間浪費,而開啟多線程能在線程 A 等待時,自動切換到線程B可以不浪費CPU的資源,從而能升程序執行效率)。在實際的數據采集過程中,既考慮網速和響應的問題,也需要考慮自身機器的硬件情況,來設置多進程或多線程。

    1.說一下 numpy 和 pandas 的區別?分別的應用場景?

  • 回答技巧:如題回答就好
  • Numpy 是數值計算的擴展包,純數學。
  • ePandas做數據處理以矩陣為基礎的數學計算模塊。供了一套名為 DataFrame 的數據結構,比較契合統計分析中的表結構,並且供了計算接口,可用Numpy 或其它方式進行計算。

    驗證碼如何處理?

  • 回答技巧:如題回答
  • 1.Scrapy 自帶處理驗證碼
  • 2.獲取到驗證碼圖片的url,調用第三方付費借口破解驗證碼

    動態的股票信息如何抓取?

  • 回答技巧:先說一下抓取方法,然後舉個例子
  • 股票數據的獲取目前有如下兩種方法可以獲取:
  • 1.http/JavaScript 接口取數據
  • 2.web-service 接口
  • Sina 股票數據接口
  • 以大秦鐵路(股票代碼:601006)為例,如果要獲取它的 最新行情,只需訪問新浪的股票數據
  • 接口:http://hq.sinajs.cn/list=sh601006 這個 url 會返回一串文本,例如 var hq_str_sh601006="大秦鐵路, 27.55, 27.25, 26.91, 27.55, 26.20, 26.91, 26.92, 22114263, 589824680, 4695, 26.91, 57590, 26.90, 14700, 26.89, 14300,
    26.88, 15100, 26.87, 3100, 26.92, 8900, 26.93, 14230, 26.94, 25150, 26.95, 15220, 26.96, 2008-01-11, 15:05:32";

    scrapy 去重?

  • 回答技巧:從各個方面有條理去回答
  • 數據量不大時,可以直接放在內存裏面進行去重,python 可以使用 set()進行去重。
  • 當去重數據需要持久化時可以使用 redis 的 set 數據結構。
  • 當數據量再大一點時,可以用不同的加密算法先將長字符 串壓縮成 16/32/40 個字符,再使用上面兩種方法去重;
  • 當數據量達到億(甚至十億、百億)數量級時,內存有限, 必須用“位”來去重,才能夠滿足需求。Bloomfilter 就是將 去重對象映射到幾個內存“位”,通過幾個位的 0/1 值來判斷一個對象是否已經存在。 然而 Bloomfilter 運行在一臺機器的內存上,不方便持久化(機器 down 掉就什麽都沒啦),也不方便分布式爬蟲的統一去重。如果可以在 Redis 上申請內存進行 Bloomfilter,以上兩個問題就都能解決了。
  • simhash 最牛逼的一點就是將一個文檔,最後轉換成一個 64 位的字節,暫且稱之為特征字,然後判斷重復只需要判斷他 們的特征字的距離是不是<n(根據經驗這個 n 一般取值為 3),就可以判斷兩個文檔是否相似。

    分布式有哪些方案,哪一種最好?

  • 回答技巧:先說一下有什麽方案,分析哪一個好?
  • celery、beanstalk,gearman個人認為 gearman 比較好。
    原因主要有以下幾點:
  • 1).技術類型簡單,維護成本低。
  • 2).簡單至上。能滿足當前的技術需求即可 (分布式任務 處理、異步同步任務同時支持、任務隊列的持久化、維護部署 簡單)。
  • 3).有成熟的使用案例。instagram 就是使用的 gearman 來完成圖片的處理的相關任務,有成功的經驗,我們當然應該 借鑒。

    Post 和 get 區別?

  • 回答技巧:有條理從各方面去回答即可
  • 1、GET請求,請求的數據會附加在URL之後,以分割 URL 和傳輸數據,多個參數用&連接。URL的編碼格式采用的是 ASCII 編碼,而不是 uniclde,即是說所有的非ASCII字符都要編碼之後再傳輸。
    POST 請求:POST請求會把請求的數據放置在HTTP請求包的包體中。上面的 item=bandsaw 就是實際的傳輸數據。因此,GET 請求的數據會暴露在地址欄中,而 POST 請求則不會。
  • 2、傳輸數據的大小
    在HTTP規範中,沒有對 URL 的長度和傳輸的數據大小進行限制。但是在實際開發過程中,對於 GET,特定的瀏覽器和服務器對 URL 的長度有限制。因此,在使用GET請求時,傳輸數據會受到URL長度的限制。

    談一談你對 Selenium 和 PhantomJS 了解?

  • 回答技巧:如何回答即可
  • Selenium 是一個 Web 的自動化測試工具,可以根據我們的指令,讓 瀏覽器自動加載頁面,獲取需要的數據,甚至頁面截屏,或者判斷網 站上某些動作是否發生。Selenium 自己不帶瀏覽器,不支持瀏覽器 的功能,它需要與第三方瀏覽器結合在一起才能使用。但是我們有時 候需要讓它內嵌在代碼中運行,所以我們可以用一個叫 PhantomJS 的工具代替真實的瀏覽器。Selenium 庫裏有個叫 WebDriver 的 API。 WebDriver 有點兒像可以加載網站的瀏覽器,但是它也可以像 BeautifulSoup 或者其他 Selector 對象一樣用來查找頁面元素,與 頁面上的元素進行交互 (發送文本、點擊等),以及執行其他動作來 運行網絡爬蟲。
  • PhantomJS 是一個基於Webkit的“無界面”(headless)瀏覽器, 它會把網站加載到內存並執行頁面上的 JavaScript,因為不會展示 圖形界面,所以運行起來比完整的瀏覽器要高效。
    如果我們把 Selenium 和 PhantomJS 結合在一起,就可以運行一 個非常強大的網絡爬蟲了,這個爬蟲可以處理 JavaScrip、Cookie、 headers,以及任何我們真實用戶需要做的事情。

    常用的反爬蟲措施?

  • 回答技巧: 有條理從各方面去回答即可
  • 回答: 1.添加代理 2.降低訪問頻率 3.User-Agent4. 動態 HTML 數據加載 5. 驗證碼處理6. Cookie

    常見的反爬蟲的應對方法?

  • 回答技巧:有條理從各方面去回答即可
  • 1).通過 Headers 反爬蟲,從用戶請求的 Headers 反爬蟲是最常見的反爬蟲策略。很多網站都 會對 Headers 的 User-Agent 進行檢測,還有一部分網站會對 Referer 進行檢測(一些資源網站的防盜鏈就是檢測 Referer)。如果遇到了 這類反爬蟲機制,可以直接在爬蟲中添加 Headers,將瀏覽器的 User-Agent 復制到爬蟲的 Headers 中;或者將 Referer 值修改為目 標網站域名。對於檢測 Headers 的反爬蟲,在爬蟲中修改或者添加 Headers 就能很好的繞過。
  • 2).基於用戶行為反爬蟲
    還有一部分網站是通過檢測用戶行為,例如同一IP 短時間內多次訪問同一頁面,或者同一賬戶短時間內多次進行相同操作。 大多數網站都是前一種情況,對於這種情況,使用 IP 代理就可以 解決。可以專門寫一個爬蟲,爬取網上公開的代理 ip,檢測後全部 保存起來。這樣的代理 ip 爬蟲經常會用到,最好自己準備一個。有 了大量代理 ip 後可以每請求幾次更換一個 ip,這在 requests或者 urllib2 中很容易做到,這樣就能很容易的繞過第一種反爬蟲。
    對於第二種情況,可以在每次請求後隨機間隔幾秒再進行下一次請 求。有些有邏輯漏洞的網站,可以通過請求幾次,退出登錄,重新登 錄,繼續請求來繞過同一賬號短時間內不能多次進行相同請求的限制。
  • 3).動態頁面的反爬蟲
    上述的幾種情況大多都是出現在靜態頁面,還有一部分網站,我們 需要爬取的數據是通過 ajax 請求得到,或者通過 JavaScript 生成的。 首先用 Fiddler 對網絡請求進行分析。如果能夠找到 ajax 請求,也 能分析出具體的參數和響應的具體含義,我們就能采用上面的方法,直接利用 requests 或者 urllib2 模擬 ajax 請求,對響應的 json 進 行分析得到需要的數據。
  • 能夠直接模擬 ajax 請求獲取數據固然是極好的,但是有些網站把 ajax 請求的所有參數全部加密了。我們根本沒辦法構造自己所需要 的數據的請求。這種情況下就用 selenium+phantomJS,調用瀏覽器 內核,並利用 phantomJS 執行 js 來模擬人為操作以及觸發頁面中的 js 腳本。從填寫表單到點擊按鈕再到滾動頁面,全部都可以模擬, 不考慮具體的請求和響應過程,只是完完整整的把人瀏覽頁面獲取數 據的過程模擬一遍。
  • 用這套框架幾乎能繞過大多數的反爬蟲,因為它不是在偽裝成瀏覽 器來獲取數據(上述的通過添加 Headers 一定程度上就是為了偽裝 成瀏覽器),它本身就是瀏覽器,phantomJS 就是一個沒有界面的瀏覽器,只是操控這個瀏覽器的不是人。利selenium+phantomJS 能幹很多事情,例如識別點觸

Python中一些可能會問到的面試題