同步與異步
同步和異步關注的是消息通信機制 (synchronous communication/ asynchronous communication)
所謂同步震蒋,就是在發(fā)出一個調用時猜丹,在沒有得到結果之前嫉柴,該調用就不返回恕酸。但是一旦調用返回,就得到返回值了畔勤。
換句話說蕾各,就是由調用者主動等待這個調用的結果。
而異步則是相反庆揪,調用在發(fā)出之后式曲,這個調用就直接返回了,所以沒有返回結果缸榛。換句話說吝羞,當一個異步過程調用發(fā)出后,調用者不會立刻得到結果内颗。而是在調用發(fā)出后钧排,被調用者通過狀態(tài)、通知來通知調用者均澳,或通過回調函數(shù)處理這個調用恨溜。
談談python的裝飾器符衔,迭代器,yield
裝飾器:裝飾器的本質是一個閉包函數(shù),他的作用就是讓其他函數(shù)在不需要做任何代碼修改的前提下增加額外功能,裝飾器的返回值也是一個函數(shù)對象.我們通常在一些有切面需求的場景,比如:插入日志,性能測試,事務處理,緩存,權限校驗等場景,有了裝飾器我們就可以少寫很多重復代碼,提高工作效率.
迭代器:迭代器是一中訪問可迭代對象的方式,通常從第一個元素開始訪問,知道所有的元素都被訪問完才結束,迭代器只能前進不能后退,使用迭代器可以不用事先準備好帶跌過程中的所有元素,僅僅是在迭代到該元素的時候才計算該元素,而在這之前的元素則是被銷毀,因此迭代器適合遍歷一些數(shù)據(jù)量巨大的無限的序列.
迭代器的本質就是調用__iter__方法,每次調用的時候返回一個元素,當沒有下一個元素的時候會拋出StopIteration異常
python適合的場景有哪些糟袁?當遇到計算密集型任務怎么辦柏腻?
適用場景:網(wǎng)站運維,金融分析,服務器編寫,爬蟲
當遇到io密集型任務時,涉及到的大多是網(wǎng)絡,磁盤等任務,這一類任務的特性是cpu小號低,使用多線程.
計算密集型的任務主要是消耗cpu性能,誰要運用多進程,當然運用python語言的運行效率很低,所以一般對于計算密集型任務,可以使用c語言編寫
談談mysql字符集和排序規(guī)則
字符集,即用于定義字符在數(shù)據(jù)庫中的編碼的集合系吭。 常見的字符集:utf-8 gbk 等
排序規(guī)則,就是指字符比較時是否區(qū)分大小寫颗品,以及是按照字符編碼進行比較還是直接用二進制數(shù)據(jù)比較肯尺。
說一下線程、進程躯枢、協(xié)程则吟?
回答:進程是具有一定獨立功能的程序關于某個數(shù)據(jù)集合上的一 次運行活動,進程是系統(tǒng)進行資源分配和調度的一個獨立單位。
每個進程都有自己的獨立內(nèi)存空間锄蹂,不同進程通過進程間通信 來通信氓仲。由于進程比較重量,占據(jù)獨立的內(nèi)存得糜,所以上下文進程間的切換開銷(棧敬扛、寄存器、虛擬內(nèi)存朝抖、文件句柄等)比較 大啥箭,但相對比較穩(wěn)定安全。
線程是進程的一個實體,是 CPU 調度和分派的基本單位, 它是比進程更小的能獨立運行的基本單位.線程自己基本上不 擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源(如程序計 數(shù)器,一組寄存器和棧),但是它可與同屬一個進程的其他的線 程共享進程所擁有的全部資源治宣。線程間通信主要通過共享內(nèi)存急侥, 上下文切換很快,資源開銷較少侮邀,但相比進程不夠穩(wěn)定容易丟 失數(shù)據(jù)坏怪。
協(xié)程是一種用戶態(tài)的輕量級線程,協(xié)程的調度完全由用戶 控制绊茧。協(xié)程擁有自己的寄存器上下文和棧铝宵。協(xié)程調度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候按傅,恢復先前保存的寄存器上下文和棧捉超,直接操作棧則基本沒有內(nèi)核切 換的開銷,可以不加鎖的訪問全局變量唯绍,所以上下文的切換非 称丛溃快。
最好說一下在項目中如何使用况芒,舉個例子
如何解決線程安全惜纸?
線程安全是在多線程的環(huán)境下叶撒,能夠保證多個線程同時執(zhí)行時程序依舊運行正確, 而且要保證對于共享的數(shù)據(jù)可以由多個線程存取,但是同一時刻只能有一個線程進行存取耐版。多線程環(huán)境下解決資源競爭問題的辦法是加鎖來保證存取操作的唯一性祠够。如何加鎖? 分布式 負載均衡
常用的linux命令
ls,cd,more,clear,mkdir,pwd,rm,grep,find,mv,su,date等等
什么是面向對象編程?
答技巧:說一下什么事面向對象編程粪牲,再說說為什么要面向對象編程古瓤,面向對象特性。
回答:
面向對象編程是一種解決軟件復用的設計和編程方法腺阳。 這種方法把軟件系統(tǒng)中相近相似的操作邏輯和操作應用數(shù)據(jù)落君、狀態(tài),以類的型式 述出來,以對象實例的形式在軟件系統(tǒng)中復用,以達到高軟件開發(fā)效率的作用。封裝,繼承多態(tài).
如何提高 Python 的運行效率亭引,請說出不少于 2 種提高運行效率的方法绎速?
1.使用生成器
2.關鍵代碼使用外部功能包:Cython、Pylnlne焙蚓、PyPy纹冤、Pyrex
3.針對循環(huán)的優(yōu)化——盡量避免在循環(huán)中訪問變量的屬性;
說一下 MySQL 數(shù)據(jù)庫存儲的原理?
回答技巧:先回答一下mysql的原理,拓展一下它的有點购公,或者mysql你是怎么用的萌京?
回答:儲存過程是一個可編程的函數(shù),它在數(shù)據(jù)庫中創(chuàng)建并保存君丁。它可以有 SQL 語句和一些特殊的控制結構組成枫夺。當希望在不同的應用程序或平臺上執(zhí)行相同的函數(shù),或者封裝特定功能時绘闷,存儲過程是非常有用的橡庞。數(shù)據(jù)庫中的存儲過程可以看做是對編程中面向對象方法的模擬。它允許控制數(shù)據(jù)的訪問方式印蔗。 存儲過程通常有以下優(yōu)點:
1)存儲過程能實現(xiàn)較快的執(zhí)行速度扒最。
2)存儲過程允許標準組件是編程。
3)存儲過程可以用流控制語句編寫华嘹,有很強的靈活性吧趣,可 以完成復雜的判斷和較復雜的運算。
4)存儲過程可被作為一種安全機制來充分利用耙厚。
5)存儲過程能過減少網(wǎng)絡流量
你工作中遇到哪些bug,怎么解決的?
回答技巧:不要聊一些小bug强挫,聊一些印象深刻⊙或者可以把這道題轉化成你遇到什么困難
回答:
1.剛入行的時候俯渤,對業(yè)務不太熟悉,加上給的業(yè)務文檔不清晰型宝,導致加班很多八匠⌒跻或者第一次代碼合并,python版本更新帶來問題等等
2.項目中第一次做登錄模塊/支付模塊梨树,不太熟悉坑夯,吃了很多苦頭
3.平時敲代碼中積累的bug
說一下事務的特性?
1.原子性(Atomicity):事務中的全部操作在數(shù)據(jù)庫 中是不可分割的抡四,要么全部完成柜蜈,要么均不執(zhí)行。
2.一致性(Consistency):幾個并行執(zhí)行的事務指巡,其執(zhí)行 結果必須與按某一順序串行執(zhí)行的結果相一致跨释。
3.隔離性(Isolation):事務的執(zhí)行不受其他事務的干擾, 事務執(zhí)行的中間結果對其他事務必須是透明的厌处。
4、持久性(Durability):對于任意已 交事務岁疼,系統(tǒng)必須 保證該事務對數(shù)據(jù)庫的改變不被丟失阔涉,即使數(shù)據(jù)庫出
redis 和 mysql 的區(qū)別?
回答技巧:回答題目有什么區(qū)別捷绒,然后其中一個舉例子瑰排,你是如何使用?
回答:
redis 是內(nèi)存數(shù)據(jù)庫暖侨,數(shù)據(jù)保存在內(nèi)存中椭住,速度快。
mysql 是關系型數(shù)據(jù)庫字逗,持久化存儲京郑,存放在磁盤里面, 功能強大葫掉。檢索的話些举,會涉及到一定的 IO,數(shù)據(jù)訪問也就慢俭厚。
我比較常用是mysql户魏,主要創(chuàng)建數(shù)據(jù)庫,創(chuàng)建表挪挤,數(shù)據(jù)操作叼丑,增刪改查,我做的比較多是查扛门,例如在xxx項目中鸠信,有個搜索模塊,當時我做比較簡單就是用模糊匹配去做搜索尖飞。
redis 受攻擊怎么辦?
回答:
在工作防止redis受攻擊症副,我都會做一下措施:
1.主從
2.持久化存儲Redis 不以 root 賬戶啟動
3.設置復雜密碼
4.不允許 key 方式登錄
說一下mongoDB你是如何使用店雅?
回答技巧:回答mongoDB什么,優(yōu)缺點,平時怎么用的贞铣?
MongoDB是一個面向文檔的數(shù)據(jù)庫系統(tǒng)闹啦。使用C++編寫,不 支持 SQL辕坝,但有自己功能強大的查詢語法窍奋。
MongoDB 使用 BSON 作為數(shù)據(jù)存儲和傳輸?shù)母袷健SON 是 一種類似 JSON 的酱畅、二進制序列化文檔琳袄,支持嵌套對象和數(shù)組。
MongoDB 很像 MySQL纺酸,document 對應 MySQL 的 row窖逗, collection 對應- MySQL 的 table
缺點:不支持事務,MongoDB 占用空間過大餐蔬,維護工具不夠成熟
應用場景:
1.網(wǎng)站數(shù)據(jù):mongo 非常適合實時的插入碎紊,更新與查詢, 并具備網(wǎng)站實時數(shù)據(jù)存儲所需的復制及高度伸縮性樊诺。
2.緩存:由于性能很高仗考,mongo 也適合作為信息基礎設 施的緩存層。在系統(tǒng)重啟之后词爬,由 mongo 搭建的持久化緩存可 以避免下層的數(shù)據(jù)源過載秃嗜。
3.大尺寸、低價值的數(shù)據(jù):使用傳統(tǒng)的關系數(shù)據(jù)庫存儲 一些數(shù)據(jù)時可能會比較貴顿膨,在此之前锅锨,很多程序員往往會選擇 傳統(tǒng)的文件進行存儲。
4.高伸縮性的場景:mongo 非常適合由數(shù)十或者數(shù)百臺 服務器組成的數(shù)據(jù)庫恋沃。
5.用于對象及 JSON 數(shù)據(jù)的存儲:mongo 的 BSON 數(shù)據(jù)格 式非常適合文檔格式化的存儲及查詢橡类。
6.重要數(shù)據(jù):mysql,一般數(shù)據(jù):mongodb芽唇,臨時數(shù)據(jù): memcache
Redis與mongodb的優(yōu)缺點顾画?
回答技巧:先說一下兩者區(qū)別,再說它們優(yōu)缺點
回答: MongoDB 和 Redis 都是 NoSQL匆笤,采用結構型數(shù)據(jù)存儲研侣。二者在使用場景中,存在一定的區(qū)別炮捧,這也主要由于二者在內(nèi)存映射的處理過程庶诡,持久化的處理方法不同。MongoDB 建議集群部署咆课,更多的考慮到集群方案末誓,Redis 更偏重于進程順序寫入扯俱, 雖然支持集群,也僅限于主-從模式.
Redis 優(yōu)點:
1 讀寫性能優(yōu)異
2 支持數(shù)據(jù)持久化喇澡,支持 AOF 和 RDB 兩種持久化方式
3 支持主從復制迅栅,主機會自動將數(shù)據(jù)同步到從機,可以進 行讀寫分離晴玖。
4 數(shù)據(jù)結構豐富:除了支持 string 類型的 value 外還支 持 string读存、hash、set呕屎、sortedset让簿、list 等數(shù)據(jù)結構。
缺點:
1 Redis 不具備自動容錯和恢復功能秀睛,主機從機的宕機都 會導致前端部分讀寫請求失敗尔当,需要等待機器重啟或者手動切 換前端的 IP 才能恢復。
2 主機宕機蹂安,宕機前有部分數(shù)據(jù)未能及時同步到從機居凶,切 換 IP 后還會引入數(shù)據(jù)不一致的問題,降低了系統(tǒng)的可用性藤抡。
Redis 較難支持在線擴容,在集群容量達到上限時在線 擴容會變得很復雜抹估。為避免這一問題缠黍,運維人員在系統(tǒng)上線時 必須確保有足夠的空間,這對資源造成了很大的浪費.避免這一問題药蜻,運維人員在系統(tǒng)上線時 必須確保有足夠的空間瓷式,這對資源造成了很大的浪費。
mongodb的優(yōu)缺點:
優(yōu)點:弱一致性(最終一致)语泽,更能保證用戶的訪問速度 文檔結構的存儲方式贸典,能夠更便捷的獲取數(shù) 頻)
內(nèi)置 GridFS,高效存儲二進制大對象 (比如照片和視
支持復制集踱卵、主備廊驼、互為主備、自動分片等特性 動態(tài)查詢 全索引支持,擴展到內(nèi)部對象和內(nèi)嵌數(shù)組
缺點:不支持事務MongoDB 占用空間過大惋砂,維護工具不夠成熟
數(shù)據(jù)庫怎么優(yōu)化查詢效率妒挎?
回答技巧:有條理按照題目回答即可
回答:
1.儲存引擎選擇:如果數(shù)據(jù)表需要事務處理,應該考慮使用 InnoDB西饵,因為它完全符合ACID 特性酝掩。如果不需要事務處理,使用默認存儲引擎MyISAM 是比較明智的
2.分表分庫眷柔,主從
3.對查詢進行優(yōu)化期虾,要盡量避免全表掃 原朝,首先應考慮在 where 及 order by 涉及的列上建立索引
4.應盡量避免在 where 子句中對字段進行 null 值判斷, 否則將導致引擎放棄使用索引而進行全表掃
5.應盡量避免在 where 子句中使用 != 或 <> 操作符镶苞, 否則將引擎放棄使用索引而進行全表掃
6.應盡量避免在 where 子句中使用 or 來連接條件喳坠,如果 一個字段有索引,一個字段沒有索引宾尚,將導致引擎放棄使用索 引而進行全表掃
7.Update語句丙笋,如果只更改1、2 個字段煌贴,不要Update全部字段御板,否則頻繁調用會引起明顯的性能消耗,同時帶來大 量日志
數(shù)據(jù)庫優(yōu)化方案牛郑?
回答技巧:如題回答即可
1.優(yōu)化索引怠肋、SQL 語句、分析慢查詢;
2.設計表的時候嚴格根據(jù)數(shù)據(jù)庫的設計范式來設計數(shù)據(jù)庫;
3.使用緩存淹朋,把經(jīng)常訪問到的數(shù)據(jù)而且不需要經(jīng)常變化的 數(shù)據(jù)放在緩存中笙各,能節(jié)約磁盤 IO;
4.優(yōu)化硬件;采用 SSD,使用磁盤隊列技術 (RAID0,RAID1,RDID5)等;
5.采用 MySQL 內(nèi)部自帶的表分區(qū)技術础芍,把數(shù)據(jù)分層不同 的文件杈抢,能夠 高磁
盤的讀取效率;
6.垂直分表;把一些不經(jīng)常讀的數(shù)據(jù)放在一張表里,節(jié)約 磁盤 I/O;
7.主從分離讀寫;采用主從復制把數(shù)據(jù)庫的讀操作和寫入 操作分離開來;
8.分庫分表分機器(數(shù)據(jù)量特別大)仑性,主要的的原理就是數(shù)據(jù)路由;
9.選擇合適的表引擎惶楼,參數(shù)上的優(yōu)化;
10.進行架構級別的緩存,靜態(tài)化和分布式;
11.不采用全文索引;
12.采用更快的存儲方式诊杆,例如 NoSQL 存儲經(jīng)常訪問的數(shù)
redis 基本類型歼捐、相關方法?
回答技巧:先回答問題所問的晨汹,找其中一個說明一下如何使用豹储,在拓展一下redis如何使用的
回答: Redis支持五種數(shù)據(jù)類型:string(字符串)、hash(哈希)淘这、list(列表)剥扣、set (集合)及zset(sorted set:有序集合)。
String是Redis最為常用的一種數(shù)據(jù)類型铝穷,String的數(shù)據(jù)結構為key/value類型朦乏,String 可以包含任何數(shù)據(jù)。常用命令: set,get,decr,incr,mget 等
redis 的使用場景有哪些?
回答技巧:優(yōu)點氧骤, 如題回答即可
回答:
-1.取最新 N 個數(shù)據(jù)的操作
-2.排行榜應用,取 TOP N 操作
-3.需要精準設定過期時間的應用
-4.計數(shù)器應用
-5.uniq 操作,獲取某段時間所有數(shù)據(jù)排重值
-6.Pub/Sub 構建實時消息系統(tǒng)
-7.構建隊列系統(tǒng)
-8.緩存
說一下冒泡排序呻疹?
回答技巧:回答冒泡原理,最好能手寫,拓展一下其他排序刽锤?
冒泡排序的思想: 每次比較兩個相鄰的元素, 如果他們的順序錯誤就把他們交換位置镊尺。
defbubble_improve(l):printlflag=1forindexinrange(len(l)-1,0,-1):ifflag:flag=0fortwo_indexinrange(index):ifl[two_index]>l[two_index+1]:l[two_index], l[two_index+1]=l[two_index+1], l[two_index]flag=1else:breakprintll=[10,20,40,50,30,60] bubble_improve(l)
說一下 Django,MIDDLEWARES 中間件的作用?
回答技巧:如題回答即可并思。
回答: 中間件是介于 request 與 response 處理之間的一道 處理過程庐氮,相對比較輕量級,并且在全局上改變 django 的輸入與輸出宋彼。
說一下mvvm ?
回答技巧:說一下MVVM弄砍,然后拓展回熟悉的MVT?
MVVM:將“數(shù)據(jù)模型數(shù)據(jù)雙向綁定”的思想作為核心输涕,在 View 和 Model 之間沒有聯(lián)系音婶,通過 ViewModel進行交互,而且 Model 和 ViewModel之間的交互是雙向的莱坎,因此視圖的數(shù)據(jù)的變化會同時修改數(shù)據(jù)源衣式,而數(shù)據(jù)源數(shù)據(jù)的變化也會立即反應到View上。
你對 Django 的認識檐什?
回答技巧:說一下Django是什么碴卧,然后說一下它的優(yōu)缺點,再說說項目怎么用乃正?
回答: Django 是走大而全的方向住册,它最出名的是其全自動化的管 理后臺:只需要使用起 ORM,做簡單的對象定義瓮具,它就能自動生成數(shù)據(jù)庫結構荧飞、以及全功能的管理后臺。
優(yōu)點:
超高的開發(fā)效率搭综。
適用的是中小型的網(wǎng)站,或者是作為大型網(wǎng)站快速划栓,實現(xiàn)產(chǎn)品雛形的工具兑巾。
徹底的將代碼、樣式分離; Django 從根本上杜絕在模板中進行編碼忠荞、處理數(shù)據(jù)的可能蒋歌。
缺點:
其性能擴展有限;
采用 Django 的項目,在流量達到一定規(guī)模后委煤,都需要對其進行重構堂油,才能滿足性能的要求。
Django 內(nèi)置的 ORM 跟框架內(nèi)的其他模塊耦合程度高碧绞。
說一下Jieba 分詞府框?
回答技巧:jieba分詞有哪些,作用是什么讥邻?
回答:
Jieba 分詞支持三種分詞模式:
精確模式:試圖將句子最精確地切開迫靖,適合文本分析;
全局模式:把句子中所有的可以成詞的詞語都掃出來, 速度非掣弦矗快躬审,但是不能解決歧義;
搜索引擎模式:在精確模式的基礎上,對長詞再次切分,高召回率序厉,適合用于搜索引擎分詞
功能:
分詞,添加自定義詞典通危,關鍵詞取沈撞,詞性標注,并行分詞汰寓,Tokenize:返回詞語在原文的起始位置口柳,ChineseAnalyzer for Whoosh 搜索引擎
Django 重定向你是如何實現(xiàn)的?用的什么狀態(tài)碼?
回答技巧:如題回答即可
使用 HttpResponseRedirect redirect 和 reverse ,狀態(tài)碼:302,301
爬取下來的數(shù)據(jù)如何去重踩寇,說一下具體的算法依據(jù)?
回答技巧:如題回答即可
答:
1.通過 MD5 生成電子指紋來判斷頁面是否改變
2.nutch 去重啄清。nutch 中 digest 是對采集的每一個網(wǎng)頁內(nèi) 容的 32 位哈希值,如果兩個網(wǎng)頁內(nèi)容完全一樣俺孙,它們的 digest 值肯定會一樣辣卒。
寫爬蟲是用多進程好?還是多線程好? 為什么?
回答技巧:就是對比多線程與多進程爬蟲的優(yōu)缺點
回答:IO 密集型代碼(文件處理、網(wǎng)絡爬蟲等)睛榄,多線程能夠有效升效率(單線程下有 IO 操作會進行 IO 等待荣茫,造成不必要的時間浪費,而開啟多線程能在線程 A 等待時场靴,自動切換到線程B可以不浪費CPU的資源啡莉,從而能升程序執(zhí)行效率)。在實際的數(shù)據(jù)采集過程中旨剥,既考慮網(wǎng)速和響應的問題咧欣,也需要考慮自身機器的硬件情況,來設置多進程或多線程轨帜。
1.說一下 numpy 和 pandas 的區(qū)別?分別的應用場景?
回答技巧:如題回答就好
Numpy 是數(shù)值計算的擴展包魄咕,純數(shù)學。
ePandas做數(shù)據(jù)處理以矩陣為基礎的數(shù)學計算模塊蚌父。供了一套名為 DataFrame 的數(shù)據(jù)結構哮兰,比較契合統(tǒng)計分析中的表結構,并且供了計算接口苟弛,可用Numpy 或其它方式進行計算喝滞。
驗證碼如何處理?
回答技巧:如題回答
1.Scrapy 自帶處理驗證碼
2.獲取到驗證碼圖片的url膏秫,調用第三方付費借口破解驗證碼
動態(tài)的股票信息如何抓扔以狻?
回答技巧:先說一下抓取方法,然后舉個例子
股票數(shù)據(jù)的獲取目前有如下兩種方法可以獲取:
1.http/JavaScript 接口取數(shù)據(jù)
2.web-service 接口
Sina 股票數(shù)據(jù)接口
以大秦鐵路(股票代碼:601006)為例狸演,如果要獲取它的 最新行情言蛇,只需訪問新浪的股票數(shù)據(jù)
接口: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 去重宵距?
回答技巧:從各個方面有條理去回答
數(shù)據(jù)量不大時腊尚,可以直接放在內(nèi)存里面進行去重,python 可以使用 set()進行去重满哪。
當去重數(shù)據(jù)需要持久化時可以使用 redis 的 set 數(shù)據(jù)結構婿斥。
當數(shù)據(jù)量再大一點時,可以用不同的加密算法先將長字符 串壓縮成 16/32/40 個字符哨鸭,再使用上面兩種方法去重;
當數(shù)據(jù)量達到億(甚至十億民宿、百億)數(shù)量級時,內(nèi)存有限像鸡, 必須用“位”來去重活鹰,才能夠滿足需求。Bloomfilter 就是將 去重對象映射到幾個內(nèi)存“位”只估,通過幾個位的 0/1 值來判斷一個對象是否已經(jīng)存在志群。 然而 Bloomfilter 運行在一臺機器的內(nèi)存上,不方便持久化(機器 down 掉就什么都沒啦)蛔钙,也不方便分布式爬蟲的統(tǒng)一去重锌云。如果可以在 Redis 上申請內(nèi)存進行 Bloomfilter,以上兩個問題就都能解決了吁脱。
simhash 最牛逼的一點就是將一個文檔桑涎,最后轉換成一個 64 位的字節(jié),暫且稱之為特征字兼贡,然后判斷重復只需要判斷他 們的特征字的距離是不是
分布式有哪些方案攻冷,哪一種最好?
回答技巧:先說一下有什么方案,分析哪一個好遍希?
celery等曼、beanstalk,gearman個人認為 gearman 比較好孵班。
原因主要有以下幾點:
1).技術類型簡單涉兽,維護成本低招驴。
2).簡單至上篙程。能滿足當前的技術需求即可 (分布式任務 處理、異步同步任務同時支持别厘、任務隊列的持久化虱饿、維護部署 簡單)。
3).有成熟的使用案例。instagram 就是使用的 gearman 來完成圖片的處理的相關任務氮发,有成功的經(jīng)驗渴肉,我們當然應該 借鑒。
Post 和 get 區(qū)別爽冕?
回答技巧:有條理從各方面去回答即可
1仇祭、GET請求,請求的數(shù)據(jù)會附加在URL之后颈畸,以分割 URL 和傳輸數(shù)據(jù)乌奇,多個參數(shù)用&連接。URL的編碼格式采用的是 ASCII 編碼眯娱,而不是 uniclde礁苗,即是說所有的非ASCII字符都要編碼之后再傳輸。
POST 請求:POST請求會把請求的數(shù)據(jù)放置在HTTP請求包的包體中徙缴。上面的 item=bandsaw 就是實際的傳輸數(shù)據(jù)试伙。因此,GET 請求的數(shù)據(jù)會暴露在地址欄中于样,而 POST 請求則不會疏叨。
2、傳輸數(shù)據(jù)的大小
在HTTP規(guī)范中百宇,沒有對 URL 的長度和傳輸?shù)臄?shù)據(jù)大小進行限制考廉。但是在實際開發(fā)過程中,對于 GET携御,特定的瀏覽器和服務器對 URL 的長度有限制昌粤。因此,在使用GET請求時啄刹,傳輸數(shù)據(jù)會受到URL長度的限制涮坐。
談一談你對 Selenium 和 PhantomJS 了解?
回答技巧:如何回答即可
Selenium 是一個 Web 的自動化測試工具誓军,可以根據(jù)我們的指令袱讹,讓 瀏覽器自動加載頁面,獲取需要的數(shù)據(jù)昵时,甚至頁面截屏捷雕,或者判斷網(wǎng) 站上某些動作是否發(fā)生。Selenium 自己不帶瀏覽器壹甥,不支持瀏覽器 的功能救巷,它需要與第三方瀏覽器結合在一起才能使用。但是我們有時 候需要讓它內(nèi)嵌在代碼中運行句柠,所以我們可以用一個叫 PhantomJS 的工具代替真實的瀏覽器浦译。Selenium 庫里有個叫 WebDriver 的 API棒假。 WebDriver 有點兒像可以加載網(wǎng)站的瀏覽器,但是它也可以像 BeautifulSoup 或者其他 Selector 對象一樣用來查找頁面元素精盅,與 頁面上的元素進行交互 (發(fā)送文本帽哑、點擊等),以及執(zhí)行其他動作來 運行網(wǎng)絡爬蟲叹俏。
PhantomJS 是一個基于Webkit的“無界面”(headless)瀏覽器妻枕, 它會把網(wǎng)站加載到內(nèi)存并執(zhí)行頁面上的 JavaScript,因為不會展示 圖形界面粘驰,所以運行起來比完整的瀏覽器要高效佳头。
如果我們把 Selenium 和 PhantomJS 結合在一起,就可以運行一 個非常強大的網(wǎng)絡爬蟲了晴氨,這個爬蟲可以處理 JavaScrip康嘉、Cookie、 headers籽前,以及任何我們真實用戶需要做的事情亭珍。
常用的反爬蟲措施?
回答技巧: 有條理從各方面去回答即可
回答: 1.添加代理 2.降低訪問頻率 3.User-Agent4. 動態(tài) HTML 數(shù)據(jù)加載 5. 驗證碼處理6. Cookie
常見的反爬蟲的應對方法?
回答技巧:有條理從各方面去回答即可
1).通過 Headers 反爬蟲,從用戶請求的 Headers 反爬蟲是最常見的反爬蟲策略枝哄。很多網(wǎng)站都 會對 Headers 的 User-Agent 進行檢測肄梨,還有一部分網(wǎng)站會對 Referer 進行檢測(一些資源網(wǎng)站的防盜鏈就是檢測 Referer)。如果遇到了 這類反爬蟲機制挠锥,可以直接在爬蟲中添加 Headers众羡,將瀏覽器的 User-Agent 復制到爬蟲的 Headers 中;或者將 Referer 值修改為目 標網(wǎng)站域名。對于檢測 Headers 的反爬蟲蓖租,在爬蟲中修改或者添加 Headers 就能很好的繞過粱侣。
2).基于用戶行為反爬蟲
還有一部分網(wǎng)站是通過檢測用戶行為,例如同一IP 短時間內(nèi)多次訪問同一頁面蓖宦,或者同一賬戶短時間內(nèi)多次進行相同操作齐婴。 大多數(shù)網(wǎng)站都是前一種情況,對于這種情況稠茂,使用 IP 代理就可以 解決柠偶。可以專門寫一個爬蟲睬关,爬取網(wǎng)上公開的代理 ip诱担,檢測后全部 保存起來。這樣的代理 ip 爬蟲經(jīng)常會用到电爹,最好自己準備一個蔫仙。有 了大量代理 ip 后可以每請求幾次更換一個 ip,這在 requests或者 urllib2 中很容易做到藐不,這樣就能很容易的繞過第一種反爬蟲匀哄。
對于第二種情況,可以在每次請求后隨機間隔幾秒再進行下一次請 求雏蛮。有些有邏輯漏洞的網(wǎng)站涎嚼,可以通過請求幾次,退出登錄挑秉,重新登 錄法梯,繼續(xù)請求來繞過同一賬號短時間內(nèi)不能多次進行相同請求的限制。
3).動態(tài)頁面的反爬蟲
上述的幾種情況大多都是出現(xiàn)在靜態(tài)頁面犀概,還有一部分網(wǎng)站立哑,我們 需要爬取的數(shù)據(jù)是通過 ajax 請求得到,或者通過 JavaScript 生成的姻灶。 首先用 Fiddler 對網(wǎng)絡請求進行分析铛绰。如果能夠找到 ajax 請求,也 能分析出具體的參數(shù)和響應的具體含義产喉,我們就能采用上面的方法捂掰,直接利用 requests 或者 urllib2 模擬 ajax 請求,對響應的 json 進 行分析得到需要的數(shù)據(jù)曾沈。
能夠直接模擬 ajax 請求獲取數(shù)據(jù)固然是極好的这嚣,但是有些網(wǎng)站把 ajax 請求的所有參數(shù)全部加密了。我們根本沒辦法構造自己所需要 的數(shù)據(jù)的請求塞俱。這種情況下就用 selenium+phantomJS姐帚,調用瀏覽器 內(nèi)核,并利用 phantomJS 執(zhí)行 js 來模擬人為操作以及觸發(fā)頁面中的 js 腳本障涯。從填寫表單到點擊按鈕再到滾動頁面罐旗,全部都可以模擬, 不考慮具體的請求和響應過程唯蝶,只是完完整整的把人瀏覽頁面獲取數(shù) 據(jù)的過程模擬一遍尤莺。
用這套框架幾乎能繞過大多數(shù)的反爬蟲,因為它不是在偽裝成瀏覽 器來獲取數(shù)據(jù)(上述的通過添加 Headers 一定程度上就是為了偽裝 成瀏覽器)生棍,它本身就是瀏覽器颤霎,phantomJS 就是一個沒有界面的瀏覽器,只是操控這個瀏覽器的不是人涂滴。利selenium+phantomJS 能干很多事情友酱,例如識別點觸