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

同步與異步

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

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

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

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

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

    談談mysql字符集和排序規則

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

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

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

    如何解決線程安全?

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

    經常使用的linux命令

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

    什麼是面向對象編程?

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

    如何提升 Python 的運行效率,請說出很多於 2 種提升運行效率的方法?

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

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

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

    你工做中遇到哪些bug,怎麼解決的?

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

      說一下事務的特性?

  • 1.原子性(Atomicity):事務中的所有操做在數據庫 中是不可分割的,要麼所有完成,要麼均不執行。
  • 2.一致性(Consistency):幾個並行執行的事務,其執行 結果必須與按某一順序串行執行的結果相一致。
  • 3.隔離性(Isolation):事務的執行不受其餘事務的干擾, 事務執行的中間結果對其餘事務必須是透明的。
  • 四、持久性(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語句,若是隻更改一、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 區別?

  • 回答技巧:有條理從各方面去回答便可
    • 一、GET請求,請求的數據會附加在URL以後,以分割 URL 和傳輸數據,多個參數用&鏈接。URL的編碼格式採用的是 ASCII 編碼,而不是 uniclde,便是說全部的非ASCII字符都要編碼以後再傳輸。
      POST 請求:POST請求會把請求的數據放置在HTTP請求包的包體中。上面的 item=bandsaw 就是實際的傳輸數據。所以,GET 請求的數據會暴露在地址欄中,而 POST 請求則不會。
    • 二、傳輸數據的大小
      在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 能幹不少事情,例如識別點觸

相關文章
相關標籤/搜索