python 面試題--你能作出多少?

python3中__get__,getattr,__getattribute__的區別javascript

什麼是 GIL
詳細博客
GIL = Global Intercept Lock 全局解釋器鎖,任意時刻在解釋器中只會有一個線程在運行html

Python中的@staticmethod和@classmethod的區別 (**)前端

@classmethod 有 cls 綁定, 而 @staticmethod 沒有java

Python裏面如何拷貝一個對象,並解析深淺拷貝python

import copy
copy.copy   copy.deepcopy
淺拷貝只拷貝List這種複雜結構的第一層,也就是 List 裏若是還有List等,不會再次被建立而是共享內存,由於修改第二層中的一個元素會影響到另外一個元素
深拷貝則會拷貝第二層中的從新建立,獨享內存,修改其中一個不會影響另外一個
import copy
a = [1,2,3,[4,5],6]
b=a
c=copy.copy(a)
d=copy.deepcopy(a)
b.append(10)  # [1,2,3,[4,5],6,10]
c[3].append(11) # [1,2,3,[4,5,11],6]
d[3].append(12) # [1,2,3,[4,5,12],6]
a,b,c,d
這個例子理解了那麼深淺拷貝就懂了!

Python裏面的search()和match()的區別mysql

search 會搜索字符串中符合規則的第一條字符串,而 match 則會從被搜索的字符串第0個位置開始匹配react

簡述迭代器生成器以及他們之間的區別linux

迭代器 Iterable --> Iterator --> Generatorios

個人理解是生成器是特殊的迭代器,而迭代器是特殊的可迭代對象。nginx

迭代器和生成器都是Python中特有的概念,迭代器能夠看做是一個特殊的對象,每次調用該對象時會返回自身的下一個元素,從實現上來看,一個可迭代的對象必須是定義了iter()方法的對象,而一個迭代器必須是定義了iter()方法和next()方法的對象。生成器的概念要比迭代器稍顯複雜,由於生成器是可以返回一個迭代器的函數,其最大的做用是將輸入對象返回爲一個迭代器。Python中使用了迭代的概念,是由於當須要循環遍歷一個較大的對象時,傳統的內存載入方式會消耗大量的內存,不如須要時讀取一個元素的方式更爲經濟快捷。 迭代器   迭代器(iterator)是一種對象,它可以用來遍歷標準模板庫容器中的部分或所有元素,每一個迭代器對象表明容器中的肯定的地址。迭代器修改了常規指針的接口,所謂迭代器是一種概念上的抽象:那些行爲上像迭代器的東西均可以叫作迭代器。然而迭代器有不少不一樣的能力,它能夠把抽象容器和通用算法有機的統一塊兒來。   迭代器提供一些基本操做符:*、++、==、!=、=。這些操做和C/C++「操做array元素」時的指針接口一致。不一樣之處在於,迭代器是個所謂的複雜的指針,具備遍歷複雜數據結構的能力。其下層運行機制取決於其所遍歷的數據結構。所以,每一種容器型別都必須提供本身的迭代器。事實上每一種容器都將其迭代器以嵌套的方式定義於內部。所以各類迭代器的接口相同,型號卻不一樣。這直接導出了泛型程序設計的概念:全部操做行爲都使用相同接口,雖然它們的型別不一樣。   迭代器使開發人員可以在類或結構中支持foreach迭代,而沒必要整個實現IEnumerable或者IEnumerator接口。只需提供一個迭代器,便可遍歷類中的數據結構。當編譯器檢測到迭代器時,將自動生成IEnumerable接口或者IEnumerator接口的Current,MoveNext和Dispose方法。 生成器   生成器是一次生成一個值的特殊類型函數。能夠將其視爲可恢復函數。調用該函數將返回一個可用於生成連續 x 值的生成器【Generator】   簡單的說就是在函數的執行過程當中,yield語句會把你須要的值返回給調用生成器的地方,而後退出函數,下一次調用生成器函數的時候又從上次中斷的地方開始執行,而生成器內的全部變量參數都會被保存下來供下一次使用。

什麼是協程,Python中的協程是如何實現的

一個線程內部中斷某一個步驟而後再次回到yield地方執行,經過yield來實現

什麼是裝飾器,請使用裝飾器實現singletion。

裝飾器相似於java的AOP能夠用來對方法進行加強,如日誌事務等...

舉例 todo

請使用Python實現快速排序

todo

簡述select和epoll的原理和區別

select、poll、epoll之間的區別總結[整理]
  select,poll,epoll都是IO多路複用的機制。I/O多路複用就經過一種機制,能夠監視多個描述符,一旦某個描述符就緒(通常是讀就緒或者寫就緒),可以通知程序進行相應的讀寫操做。但select,poll,epoll本質上都是同步I/O,由於他們都須要在讀寫事件就緒後本身負責進行讀寫,也就是說這個讀寫過程是阻塞的,而異步I/O則無需本身負責進行讀寫,異步I/O的實現會負責把數據從內核拷貝到用戶空間。關於這三種IO多路複用的用法,前面三篇總結寫的很清楚,並用服務器回射echo程序進行了測試。鏈接以下所示:

select:http://www.cnblogs.com/Anker/archive/2013/08/14/3258674.html

poll:http://www.cnblogs.com/Anker/archive/2013/08/15/3261006.html

epoll:http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html

  今天對這三種IO多路複用進行對比,參考網上和書上面的資料,整理以下:

一、select實現

select的調用過程以下所示:



(1)使用copy_from_user從用戶空間拷貝fd_set到內核空間

(2)註冊回調函數__pollwait

(3)遍歷全部fd,調用其對應的poll方法(對於socket,這個poll方法是sock_poll,sock_poll根據狀況會調用到tcp_poll,udp_poll或者datagram_poll)

(4)以tcp_poll爲例,其核心實現就是__pollwait,也就是上面註冊的回調函數。

(5)__pollwait的主要工做就是把current(當前進程)掛到設備的等待隊列中,不一樣的設備有不一樣的等待隊列,對於tcp_poll來講,其等待隊列是sk->sk_sleep(注意把進程掛到等待隊列中並不表明進程已經睡眠了)。在設備收到一條消息(網絡設備)或填寫完文件數據(磁盤設備)後,會喚醒設備等待隊列上睡眠的進程,這時current便被喚醒了。

(6)poll方法返回時會返回一個描述讀寫操做是否就緒的mask掩碼,根據這個mask掩碼給fd_set賦值。

(7)若是遍歷完全部的fd,尚未返回一個可讀寫的mask掩碼,則會調用schedule_timeout是調用select的進程(也就是current)進入睡眠。當設備驅動發生自身資源可讀寫後,會喚醒其等待隊列上睡眠的進程。若是超過必定的超時時間(schedule_timeout指定),仍是沒人喚醒,則調用select的進程會從新被喚醒得到CPU,進而從新遍歷fd,判斷有沒有就緒的fd。

(8)把fd_set從內核空間拷貝到用戶空間。

總結:

select的幾大缺點:

(1)每次調用select,都須要把fd集合從用戶態拷貝到內核態,這個開銷在fd不少時會很大

(2)同時每次調用select都須要在內核遍歷傳遞進來的全部fd,這個開銷在fd不少時也很大

(3)select支持的文件描述符數量過小了,默認是1024

2 poll實現

  poll的實現和select很是類似,只是描述fd集合的方式不一樣,poll使用pollfd結構而不是select的fd_set結構,其餘的都差很少。

關於select和poll的實現分析,能夠參考下面幾篇博文:

http://blog.csdn.net/lizhiguo0532/article/details/6568964#comments

http://blog.csdn.net/lizhiguo0532/article/details/6568968

http://blog.csdn.net/lizhiguo0532/article/details/6568969

http://www.ibm.com/developerworks/cn/linux/l-cn-edntwk/index.html?ca=drs-

http://linux.chinaunix.net/techdoc/net/2009/05/03/1109887.shtml

三、epoll

  epoll既然是對select和poll的改進,就應該能避免上述的三個缺點。那epoll都是怎麼解決的呢?在此以前,咱們先看一下epoll和select和poll的調用接口上的不一樣,select和poll都只提供了一個函數——select或者poll函數。而epoll提供了三個函數,epoll_create,epoll_ctl和epoll_wait,epoll_create是建立一個epoll句柄;epoll_ctl是註冊要監聽的事件類型;epoll_wait則是等待事件的產生。

  對於第一個缺點,epoll的解決方案在epoll_ctl函數中。每次註冊新的事件到epoll句柄中時(在epoll_ctl中指定EPOLL_CTL_ADD),會把全部的fd拷貝進內核,而不是在epoll_wait的時候重複拷貝。epoll保證了每一個fd在整個過程當中只會拷貝一次。

  對於第二個缺點,epoll的解決方案不像select或poll同樣每次都把current輪流加入fd對應的設備等待隊列中,而只在epoll_ctl時把current掛一遍(這一遍必不可少)併爲每一個fd指定一個回調函數,當設備就緒,喚醒等待隊列上的等待者時,就會調用這個回調函數,而這個回調函數會把就緒的fd加入一個就緒鏈表)。epoll_wait的工做實際上就是在這個就緒鏈表中查看有沒有就緒的fd(利用schedule_timeout()實現睡一會,判斷一會的效果,和select實現中的第7步是相似的)。

  對於第三個缺點,epoll沒有這個限制,它所支持的FD上限是最大能夠打開文件的數目,這個數字通常遠大於2048,舉個例子,在1GB內存的機器上大約是10萬左右,具體數目能夠cat /proc/sys/fs/file-max察看,通常來講這個數目和系統內存關係很大。

總結:

(1)select,poll實現須要本身不斷輪詢全部fd集合,直到設備就緒,期間可能要睡眠和喚醒屢次交替。而epoll其實也須要調用epoll_wait不斷輪詢就緒鏈表,期間也可能屢次睡眠和喚醒交替,可是它是設備就緒時,調用回調函數,把就緒fd放入就緒鏈表中,並喚醒在epoll_wait中進入睡眠的進程。雖然都要睡眠和交替,可是select和poll在「醒着」的時候要遍歷整個fd集合,而epoll在「醒着」的時候只要判斷一下就緒鏈表是否爲空就好了,這節省了大量的CPU時間。這就是回調機制帶來的性能提高。

(2)select,poll每次調用都要把fd集合從用戶態往內核態拷貝一次,而且要把current往設備等待隊列中掛一次,而epoll只要一次拷貝,並且把current往等待隊列上掛也只掛一次(在epoll_wait的開始,注意這裏的等待隊列並非設備等待隊列,只是一個epoll內部定義的等待隊列)。這也能節省很多的開銷。

參考資料:

http://www.cnblogs.com/apprentice89/archive/2013/05/09/3070051.html

http://www.linuxidc.com/Linux/2012-05/59873p3.htm

http://xingyunbaijunwei.blog.163.com/blog/static/76538067201241685556302/

http://blog.csdn.net/kkxgx/article/details/7717125

https://banu.com/blog/2/how-to-use-epoll-a-complete-example-in-c/epoll-example.c

簡述Python的垃圾回收機制

內部採用對象引用計數,當引用計數爲0時,系統自動回收

寫一個簡單的python socket編程

todo tcp ,udp

簡述Python上下文管理器原理,並用上下文管理器實現將「hello world」寫入文件的功能。

todo

利用python執行shell命令並取得返回結果

todo

用python繼承process,寫一個並行執行任務的類,並寫出使用過程。

todo

18.請列出你使用過的HA方案。

19.請列出你瞭解的Web服務器負載架構。

如何判斷一個郵箱是否合法。

.請實現一個裝飾器,限制該函數被調用的頻率,如10秒一次。

介紹一下python的異常處理機制和本身開發過程當中的體會。

解釋下HTTP常見的響應狀態碼。

編寫快速排序或者冒泡排序。

U5G()9(NW3()46463T.png)

Web開發中有哪些技術手段防止SQL注入?

xxx

31.解釋top命令和vmstat命令。

32.mysql高可用方案有哪些,備份方案有哪些,有什麼優缺點?

33.linux基礎問題:

  - 怎麼查看用戶登陸日誌。

  - linux中的utmp,wtmp,lastlog,message各文件的做用。

  - 列舉你屬性的服務器性能查看命令。

  - linux服務器間怎麼實現無密碼登陸,列舉操做步驟

34.畫出TCP三次握手,四次揮手斷開示意圖。

35.敘述mysql半同步複製原理。

python中如何動態獲取和設置對象的屬性?

經過__dict__ 或者元類

如何用python查詢和替換一個文本字符串?

string.replace() 或者 re 模塊的 sub 或 subn 函數

45.Django裏QuerySet的get和filter方法的區別?

46.簡述Django對HTTP請求的執行流程。

47.簡述Django下的(內建的)緩存機制。

48.Django中Model的slugFied類型字段有什麼用途?

49.Django中如何加載初始數據?

python中怎麼有效讀取一個20G大小的文件。

for line in f

或者使用本身建立的 生成器

如何查看佔用8080端口的是什麼進程?

一、lsof -i:端口號

二、netstat -tunlp|grep 端口號

63.DNS解析過程是怎樣的?有幾種解析方式?各自的區別是什麼?

64.TCP創建鏈接三次握手,斷開鏈接四次揮手的過程是怎樣的?

64.談談Django中的中間件。

65.談談CSRF原理

66.談談RESTful規範

67.談談Python中的面向對象

68.談談Django中CBV原理

68.談談Django REST freamwork

一、大數據的文件讀取

① 利用生成器generator

②迭代器進行迭代遍歷:for line in file

二、迭代器和生成器的區別

1)迭代器是一個更抽象的概念,任何對象,若是它的類有next方法和iter方法返回本身自己。對於string、list、dict、tuple等這類容器對象,使用for循環遍歷是很方便的。在後臺for語句對容器對象調用iter()函數,iter()是python的內置函數。iter()會返回一個定義了next()方法的迭代器對象,它在容器中逐個訪問容器內元素,next()也是python的內置函數。在沒有後續元素時,next()會拋出一個StopIteration異常

2)生成器(Generator)是建立迭代器的簡單而強大的工具。它們寫起來就像是正規的函數,只是在須要返回數據的時候使用yield語句。每次next()被調用時,生成器會返回它脫離的位置(它記憶語句最後一次執行的位置和全部的數據值)

區別:生成器能作到迭代器能作的全部事,並且由於自動建立了__iter__()和next()方法,生成器顯得特別簡潔,並且生成器也是高效的,使用生成器表達式取代列表解析能夠同時節省內存。除了建立和保存程序狀態的自動方法,當發生器終結時,還會自動拋出StopIteration異常

三、裝飾器的做用和功能:

引入日誌

函數執行時間統計

執行函數前預備處理

執行函數後的清理功能

權限校驗等場景

緩存

四、簡單談下GIL:

Global Interpreter Lock(全局解釋器鎖)

Python代碼的執行由Python 虛擬機(也叫解釋器主循環,CPython版本)來控制,Python 在設計之初就考慮到要在解釋器的主循環中,同時只有一個線程在執行,即在任意時刻,只有一個線程在解釋器中運行。對Python 虛擬機的訪問由全局解釋器鎖(GIL)來控制,正是這個鎖能保證同一時刻只有一個線程在運行。

在多線程環境中,Python 虛擬機按如下方式執行:

  1. 設置GIL

  2. 切換到一個線程去運行

  3. 運行:

a. 指定數量的字節碼指令,或者

b. 線程主動讓出控制(能夠調用time.sleep(0))

  1. 把線程設置爲睡眠狀態

  2. 解鎖GIL

  3. 再次重複以上全部步驟

在調用外部代碼(如C/C++擴展函數)的時候,GIL 將會被鎖定,直到這個函數結束爲止(因爲在這期間沒有Python 的字節碼被運行,因此不會作線程切換)。

五、find和grep

grep命令是一種強大的文本搜索工具,grep搜索內容串能夠是正則表達式,容許對文本文件進行模式查找。若是找到匹配模式,grep打印包含模式的全部行。

find一般用來再特定的目錄下搜索符合條件的文件,也能夠用來搜索特定用戶屬主的文件。

六、線上服務可能由於種種緣由致使掛掉怎麼辦?

linux下的後臺進程管理利器 supervisor

每次文件修改後再linux執行 service supervisord restart

七、如何提升python的運行效率

使用生成器;關鍵代碼使用外部功能包(Cython,pylnlne,pypy,pyrex);針對循環的優化--儘可能避免在循環中訪問變量的屬性

八、經常使用Linux命令:

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

九、Python中的yield用法

yield簡單說來就是一個生成器,這樣函數它記住上次返 回時在函數體中的位置。對生成器第 二次(或n 次)調用跳轉至該函 次)調用跳轉至該函數。

十、Python是如何進行內存管理的

1、垃圾回收:python不像C++,Java等語言同樣,他們能夠不用事先聲明變量類型而直接對變量進行賦值。對Python語言來說,對象的類型和內存都是在運行時肯定的。這也是爲何咱們稱Python語言爲動態類型的緣由(這裏咱們把動態類型能夠簡單的歸結爲對變量內存地址的分配是在運行時自動判斷變量類型並對變量進行賦值)。

2、引用計數:Python採用了相似Windows內核對象同樣的方式來對內存進行管理。每個對象,都維護這一個對指向該對對象的引用的計數。當變量被綁定在一個對象上的時候,該變量的引用計數就是1,(還有另一些狀況也會致使變量引用計數的增長),系統會自動維護這些標籤,並定時掃描,當某標籤的引用計數變爲0的時候,該對就會被回收。

3、內存池機制Python的內存機制以金字塔行,-1,-2層主要有操做系統進行操做,

第0層是C中的malloc,free等內存分配和釋放函數進行操做;

第1層和第2層是內存池,有Python的接口函數PyMem_Malloc函數實現,當對象小於256K時有該層直接分配內存;

第3層是最上層,也就是咱們對Python對象的直接操做;

在 C 中若是頻繁的調用 malloc 與 free 時,是會產生性能問題的.再加上頻繁的分配與釋放小塊的內存會產生內存碎片. Python 在這裏主要乾的工做有:

若是請求分配的內存在1~256字節之間就使用本身的內存管理系統,不然直接使用 malloc.

這裏仍是會調用 malloc 分配內存,但每次會分配一塊大小爲256k的大塊內存.

經由內存池登記的內存到最後仍是會回收到內存池,並不會調用 C 的 free 釋放掉.以便下次使用.對於簡單的Python對象,例如數值、字符串,元組(tuple不容許被更改)採用的是複製的方式(深拷貝?),也就是說當將另外一個變量B賦值給變量A時,雖然A和B的內存空間仍然相同,但當A的值發生變化時,會從新給A分配空間,A和B的地址變得再也不相同

十一、描述數組、鏈表、隊列、堆棧的區別?

數組與鏈表是數據存儲方式的概念,數組在連續的空間中存儲數據,而鏈表能夠在非連續的空間中存儲數據;

隊列和堆棧是描述數據存取方式的概念,隊列是先進先出,而堆棧是後進先出;隊列和堆棧能夠用數組來實現,也能夠用鏈表實現。

十二、你知道幾種排序,講一講你最熟悉的一種?

你是最棒的!

web框架部分

1.django 中當一個用戶登陸 A 應用服務器(進入登陸狀態),而後下次請求被 nginx 代理到 B 應用服務器會出現什麼影響?

若是用戶在A應用服務器登錄的session數據沒有共享到B應用服務器,納米以前的登陸狀態就沒有了。

2.跨域請求問題django怎麼解決的(原理)

啓用中間件

post請求

驗證碼

表單中添加{%csrf_token%}標籤

3.請解釋或描述一下Django的架構

對於Django框架遵循MVC設計,而且有一個專有名詞:MVT

M全拼爲Model,與MVC中的M功能相同,負責數據處理,內嵌了ORM框架

V全拼爲View,與MVC中的C功能相同,接收HttpRequest,業務處理,返回HttpResponse

T全拼爲Template,與MVC中的V功能相同,負責封裝構造要返回的html,內嵌了模板引擎

4.django對數據查詢結果排序怎麼作,降序怎麼作,查詢大於某個字段怎麼作

排序使用order_by()

降序須要在排序字段名前加-

查詢字段大於某個值:使用filter(字段名_gt=值)

5.說一下Django,MIDDLEWARES中間件的做用?

答:中間件是介於request與response處理之間的一道處理過程,相對比較輕量級,而且在全局上改變django的輸入與輸出。

6.你對Django的認識?

Django是走大而全的方向,它最出名的是其全自動化的管理後臺:只須要使用起ORM,作簡單的對象定義,它就能自動生成數據庫結構、以及全功能的管理後臺。

Django內置的ORM跟框架內的其餘模塊耦合程度高。

應用程序必須使用Django內置的ORM,不然就不能享受到框架內提供的種種基於其ORM的便利;理論上能夠切換掉其ORM模塊,但這就至關於要把裝修完畢的房子拆除從新裝修,倒不如一開始就去毛胚房作全新的裝修。

Django的賣點是超高的開發效率,其性能擴展有限;採用Django的項目,在流量達到必定規模後,都須要對其進行重構,才能知足性能的要求。

Django適用的是中小型的網站,或者是做爲大型網站快速實現產品雛形的工具。

Django模板的設計哲學是完全的將代碼、樣式分離; Django從根本上杜絕在模板中進行編碼、處理數據的可能。

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

使用HttpResponseRedirect

redirect和reverse

狀態碼:302,301

8.ngnix的正向代理與反向代理?

正向代理 是一個位於客戶端和原始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),而後代理向原始服務器轉交請求並將得到的內容返回給客戶端。客戶端必需要進行一些特別的設置才能使用正向代理。

反向代理正好相反,對於客戶端而言它就像是原始服務器,而且客戶端不須要進行任何特別的設置。客戶端向反向代理的命名空間中的內容發送普通請求,接着反向代理將判斷向何處(原始服務器)轉交請求,並將得到的內容返回給客戶端,就像這些內容本來就是它本身的同樣。

  1. Tornado 的核是什麼?

Tornado 的核心是 ioloop 和 iostream 這兩個模塊,前者提供了一個高效的 I/O 事件循環,後者則封裝了 一個無阻塞的 socket 。經過向 ioloop 中添加網絡 I/O 事件,利用無阻塞的 socket ,再搭配相應的回調 函數,即可達到求之不得的高效異步執行。

10.Django 自己提供了 runserver,爲何不能用來部署?

runserver 方法是調試 Django 時常常用到的運行方式,它使用 Django 自帶的

WSGI Server 運行,主要在測試和開發中使用,而且 runserver 開啓的方式也是單進程 。

uWSGI 是一個 Web 服務器,它實現了 WSGI 協議、uwsgi、http 等協議。注意 uwsgi 是一種通訊協議,而 uWSGI 是實現 uwsgi 協議和 WSGI 協議的 Web 服務器。uWSGI 具備超快的性能、低內存佔用和多 app 管理等優勢,而且搭配着 Nginx

就是一個生產環境了,可以將用戶訪問請求與應用 app 隔離開,實現真正的部署 。相比來說,支持的併發量更高,方便管理多進程,發揮多核的優點,提高性能。

網絡編程和前端部分

1.AJAX是什麼,如何使用AJAX?

ajax(異步的javascript 和xml) 可以刷新局部網頁數據而不是從新加載整個網頁。

第一步,建立xmlhttprequest對象,var xmlhttp =new XMLHttpRequest();XMLHttpRequest對象用來和服務器交換數據。

第二步,使用xmlhttprequest對象的open()和send()方法發送資源請求給服務器。

第三步,使用xmlhttprequest對象的responseText或responseXML屬性得到服務器的響應。

第四步,onreadystatechange函數,當發送請求到服務器,咱們想要服務器響應執行一些功能就須要使用onreadystatechange函數,每次xmlhttprequest對象的readyState發生改變都會觸發onreadystatechange函數。

  1. 常見的HTTP狀態碼有哪些?

200 OK

301 Moved Permanently

302 Found

304 Not Modified

307 Temporary Redirect

400 Bad Request

401 Unauthorized

403 Forbidden

404 Not Found

410 Gone

500 Internal Server Error

501 Not Implemented

  1. Post和get區別?

GET請求,請求的數據會附加在URL以後,以?分割URL和傳輸數據,多個參數用&鏈接。URL的編碼格式採用的是ASCII編碼,而不是uniclde,便是說全部的非ASCII字符都要編碼以後再傳輸。

POST請求:POST請求會把請求的數據放置在HTTP請求包的包體中。上面的item=bandsaw就是實際的傳輸數據。

所以,GET請求的數據會暴露在地址欄中,而POST請求則不會。

二、傳輸數據的大小

在HTTP規範中,沒有對URL的長度和傳輸的數據大小進行限制。可是在實際開發過程當中,對於GET,特定的瀏覽器和服務器對URL的長度有限制。所以,在使用GET請求時,傳輸數據會受到URL長度的限制。

對於POST,因爲不是URL傳值,理論上是不會受限制的,可是實際上各個服務器會規定對POST提交數據大小進行限制,Apache、IIS都有各自的配置。

三、安全性

POST的安全性比GET的高。這裏的安全是指真正的安全,而不一樣於上面GET提到的安全方法中的安全,上面提到的安全僅僅是不修改服務器的數據。好比,在進行登陸操做,經過GET請求,用戶名和密碼都會暴露再URL上,由於登陸頁面有可能被瀏覽器緩存以及其餘人查看瀏覽器的歷史記錄的緣由,此時的用戶名和密碼就很容易被他人拿到了。除此以外,GET請求提交的數據還可能會形成Cross-site request frogery攻擊。

4.cookie 和session 的區別?

一、cookie數據存放在客戶的瀏覽器上,session數據放在服務器上。

二、cookie不是很安全,別人能夠分析存放在本地的COOKIE並進行COOKIE欺騙考慮到安全應當使用session。

三、session會在必定時間內保存在服務器上。當訪問增多,會比較佔用服務器的性能考慮到減輕服務器性能方面,應當使用COOKIE。

四、單個cookie保存的數據不能超過4K,不少瀏覽器都限制一個站點最多保存20個cookie。

五、建議:

將登錄信息等重要信息存放爲SESSION

其餘信息若是須要保留,能夠放在COOKIE中

5.建立一個簡單tcp服務器須要的流程

1.socket建立一個套接字

2.bind綁定ip和port

3.listen使套接字變爲能夠被動連接

4.accept等待客戶端的連接

5.recv/send接收發送數據

爬蟲和數據庫部分

1.scrapy和scrapy-redis有什麼區別?爲何選擇redis數據庫?

1) scrapy是一個Python爬蟲框架,爬取效率極高,具備高度定製性,可是不支持分佈式。而scrapy-redis一套基於redis數據庫、運行在scrapy框架之上的組件,可讓scrapy支持分佈式策略,Slaver端共享Master端redis數據庫裏的item隊列、請求隊列和請求指紋集合。

2) 爲何選擇redis數據庫,由於redis支持主從同步,並且數據都是緩存在內存中的,因此基於redis的分佈式爬蟲,對請求和數據的高頻讀取效率很是高。

  1. 你用過的爬蟲框架或者模塊有哪些?談談他們的區別或者優缺點?

Python自帶:urllib,urllib2

第 三 方:requests

框 架:Scrapy

urllib和urllib2模塊都作與請求URL相關的操做,但他們提供不一樣的功能。

urllib2.:urllib2.urlopen能夠接受一個Request對象或者url,(在接受Request對象時候,並以此能夠來設置一個URL 的headers),urllib.urlopen只接收一個url

urllib 有urlencode,urllib2沒有,所以老是urllib,urllib2常會一塊兒使用的緣由

scrapy是封裝起來的框架,他包含了下載器,解析器,日誌及異常處理,基於多線程, twisted的方式處理,對於固定單個網站的爬取開發,有優點,可是對於多網站爬取 100個網站,併發及分佈式處理方面,不夠靈活,不便調整與括展。

request 是一個HTTP庫, 它只是用來,進行請求,對於HTTP請求,他是一個強大的庫,下載,解析所有本身處理,靈活性更高,高併發與分佈式部署也很是靈活,對於功能能夠更好實現.

Scrapy優缺點:

優勢:

scrapy 是異步的

採起可讀性更強的xpath代替正則

強大的統計和log系統

同時在不一樣的url上爬行

支持shell方式,方便獨立調試

寫middleware,方便寫一些統一的過濾器

經過管道的方式存入數據庫

缺點:

基於python的爬蟲框架,擴展性比較差

基於twisted框架,運行中的exception是不會幹掉reactor,而且異步框架出錯後是不會停掉其餘任務的,數據出錯後難以察覺。

3.你經常使用的mysql引擎有哪些?各引擎間有什麼區別?

主要 MyISAM 與 InnoDB 兩個引擎,其主要區別以下:

1、InnoDB 支持事務,MyISAM 不支持,這一點是很是之重要。事務是一種高

級的處理方式,如在一些列增刪改中只要哪一個出錯還能夠回滾還原,而 MyISAM

就不能夠了;

2、MyISAM 適合查詢以及插入爲主的應用,InnoDB 適合頻繁修改以及涉及到

安全性較高的應用;

3、InnoDB 支持外鍵,MyISAM 不支持;

4、MyISAM 是默認引擎,InnoDB 須要指定;

5、InnoDB 不支持 FULLTEXT 類型的索引;

6、InnoDB 中不保存表的行數,如 select count(*) from table 時,InnoDB;須要

掃描一遍整個表來計算有多少行,可是 MyISAM 只要簡單的讀出保存好的行數即

可。注意的是,當 count(*)語句包含 where 條件時 MyISAM 也須要掃描整個表;

7、對於自增加的字段,InnoDB 中必須包含只有該字段的索引,可是在 MyISAM

表中能夠和其餘字段一塊兒創建聯合索引;

8、清空整個表時,InnoDB 是一行一行的刪除,效率很是慢。MyISAM 則會重

建表;

9、InnoDB 支持行鎖(某些狀況下仍是鎖整表,如 update table set a=1 where

user like '%lee%'

4.描述下scrapy框架運行的機制?

從start_urls裏獲取第一批url併發送請求,請求由引擎交給調度器入請求隊列,獲取完畢後,調度器將請求隊列裏的請求交給下載器去獲取請求對應的響應資源,並將響應交給本身編寫的解析方法作提取處理:1. 若是提取出須要的數據,則交給管道文件處理;2. 若是提取出url,則繼續執行以前的步驟(發送url請求,並由引擎將請求交給調度器入隊列...),直到請求隊列裏沒有請求,程序結束。

5.什麼是關聯查詢,有哪些?

將多個表聯合起來進行查詢,主要有內鏈接、左鏈接、右鏈接、全鏈接(外鏈接)

6.寫爬蟲是用多進程好?仍是多線程好? 爲何?

IO密集型代碼(文件處理、網絡爬蟲等),多線程可以有效提高效率(單線程下有IO操做會進行IO等待,形成沒必要要的時間浪費,而開啓多線程能在線程A等待時,自動切換到線程B,能夠不浪費CPU的資源,從而能提高程序執行效率)。在實際的數據採集過程當中,既考慮網速和響應的問題,也須要考慮自身機器的硬件狀況,來設置多進程或多線程

7.數據庫的優化?

  1. 優化索引、SQL 語句、分析慢查詢;

  2. 設計表的時候嚴格根據數據庫的設計範式來設計數據庫;

  3. 使用緩存,把常常訪問到的數據並且不須要常常變化的數據放在緩存中,能

節約磁盤IO;

  1. 優化硬件;採用SSD,使用磁盤隊列技術(RAID0,RAID1,RDID5)等;

  2. 採用MySQL 內部自帶的表分區技術,把數據分層不一樣的文件,可以提升磁

盤的讀取效率;

  1. 垂直分表;把一些不常常讀的數據放在一張表裏,節約磁盤I/O;

  2. 主從分離讀寫;採用主從複製把數據庫的讀操做和寫入操做分離開來;

  3. 分庫分表分機器(數據量特別大),主要的的原理就是數據路由;

  4. 選擇合適的表引擎,參數上的優化;

  5. 進行架構級別的緩存,靜態化和分佈式;

  6. 不採用全文索引;

  7. 採用更快的存儲方式,例如 NoSQL存儲常常訪問的數據

8.常見的反爬蟲和應對方法?

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能幹不少事情,例如識別點觸式(12306)或者滑動式的驗證碼,對頁面表單進行暴力破解等。

9.分佈式爬蟲主要解決什麼問題?

1)ip

2)帶寬

3)cpu

4)io

10.爬蟲過程當中驗證碼怎麼處理?

1.scrapy自帶

2.付費接口

相關文章
相關標籤/搜索