網易互娛:2019秋招 Java開發(fā) 視頻面試

問題

說一下爬蟲反爬的思路

從數(shù)據的爬取和使用這兩個角度進行反爬蟲:

增大數(shù)據的爬取成本

  • 數(shù)據訪問過于頻繁時,增加驗證碼等校驗機制
  • 檢測到爬蟲時,對相關IP進行封禁、黑名單處理
  • 限制一定時間內的訪問次數(shù)

增大數(shù)據的使用成本

  • 對于文本類數(shù)據,在前端網頁對數(shù)據展示時,使用特殊的字體文件,在爬蟲
  • 爬取到的數(shù)據(或部分數(shù)據)變成無法直接識別的亂碼
  • 對于圖片類數(shù)據,可以圖片中添加水印

UserAgent中有哪些信息

以自己的瀏覽器的User-Agent為例:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36

主要包括了操作系統(tǒng)、瀏覽器名稱以及版本、渲染引擎。

使用IP進行爬蟲的判斷一定準確嗎

不一定。

對爬蟲程序進行識別,主要通過數(shù)據訪問頻率、User-Agent等請求標識符等進行識別。

對于爬蟲程序,可以通過使用IP池,并模仿正常的頻率,達到大量爬取數(shù)據的目的,此時IP難以識別出爬蟲。

對于正常用戶,在網絡不佳不斷請求數(shù)據或者打開多個頁面時,或者在某個使用公網IP的局域網內有多用戶同時訪問時,也可能出現(xiàn)類似爬蟲的行為,此時IP容易被誤判為爬蟲。

Python中如何獲取IP

socket.gethostbyname(socket_name)

Django的默認端口

8000

數(shù)據庫中如何部分模糊查詢

使用like關鍵字或者基于全文索引的查詢

like的效率如何

較低。

對于有索引的數(shù)據列,左模糊查詢會進行全表掃描(如:like ‘%java%’),效率較低;右模糊查詢會使用索引(如:like ‘java%’),效率相對較高。

全文索引的實現(xiàn)

相關數(shù)據結構

倒排索引(反向索引)。

在指定的列中(可以是多個),對每個單詞都保存這個單詞所在的文檔、在文檔中的位置。如果對多個列創(chuàng)建了全文索引,則會將這些列全部拼接成一個字符串,然后進行索引。使用輔助表information_schema.INNODB_FT_INDEX_TABLE來進行保存。

輔助表information_schema.INNODB_FT_INDEX_TABLE中的數(shù)據字段

字段名 作用
WORD 索引列中提取出的具體單詞
FIRST_DOC_ID 首次出現(xiàn)的文檔id
LAST_DOC_ID 最后出現(xiàn)的文檔id
DOC_COUNT 此單詞出現(xiàn)在 FULLTEXT 索引中的行數(shù)
DOC_ID 包含單詞的行的文檔ID
POSITION 該單詞在DOC_ID所標示的文檔中的位置

單詞的一些提取過濾的規(guī)則

  1. 不會使用在停用詞列表中的單詞。

    停用詞列表:默認根據通用英語的使用來設置,也可以通過ft_stopword_file來指定外部文件。

  2. 不使用長度不在指定的長度范圍內的單詞:[ft\_min\_word\_len, ft\_max\_word\_len]。

非英文字段的全文索引

對于英文的字段,可以通過空格來進行分詞。對于非英文的字段,如中文、日文等,則無法直接通過特殊字符進行分詞,需要依靠其他插件實現(xiàn)。

5.7.6之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分詞器把中文段落預處理拆分成單詞,然后存入數(shù)據庫。5.7.6開始,MySQL內置了ngram全文解析器,用來支持中文、日文、韓文分詞。

對于非英文的字段,通過設置分詞的長度(單詞的粒度)來進行分詞。如設置粒度為2,則會把每2個字分成一個詞進行索引。

相關參考:

知乎:請大神推薦符合描述的中文全文檢索引擎有哪些?

MySql 5.7 中文文檔- 24.32.12 INFORMATION_SCHEMA INNODB_FT_INDEX_TABLE表

維基百科:倒排索引

簡書:MySQL 5.7 中文全文檢索使用教程

高性能MySQL 第三版: 7.10 全文索引

介紹一下MySQL的不同引擎特點

引擎 特點
InnoDB 支持事務、支持行級鎖、聚集索引、采用MVCC支持高并發(fā)
MyISAM 不支持事務、只支持表級鎖、支持全文索引、不支持并發(fā)

為什么要使用事務,不使用的話會有什么后果

保證數(shù)據的一致性和操作的有效性,并方便數(shù)據的版本控制。具體可以聯(lián)系事務的ACID特性和隔離級別進行回答。

在并發(fā)的情況下,如果不使用事務,則非常容易出現(xiàn)各種諸如“不可重復讀”、“讀臟數(shù)據”等問題,難以保證操作的有效性。

在發(fā)生錯誤時,使用事務的話,能方便的進行RollBack操作,將進行到一半出錯的操作回退到操作前的狀態(tài),不會將錯誤的數(shù)據寫入,導致數(shù)據的不一致。如A給B轉賬,如果在A的賬戶扣完錢以后出現(xiàn)錯誤,未能在B的賬戶中加上對應金額,不用事務的話,則需要手動撤銷掉錯誤前的操作。

需要退回到某個數(shù)據庫版本時,使用事務能方便地根據這一段時間內的操作進行UnDo回滾,在備份和恢復時較為方便。

項目中如何使用事務的

數(shù)據操作的時候都會使用,try{……} catch(){……} finally{……},正常操作時在try中提交,出錯時在finally中回滾。

介紹一下Nginx的作用

反向代理、負載均衡

安卓端在與服務器通信時如何校驗權限

OAuth(開放授權)標準,如:Spring-auth2。

或者基于Token實現(xiàn)一套校驗機制。

Servlet自帶Session嗎

Servlet不自帶Session。

  • Session的創(chuàng)建

    Session的創(chuàng)建是在調用Request對象的getSession(true)方法時創(chuàng)建的,一般在第一次獲取Session對象時創(chuàng)建。

    getSession(boolean create):在當前會話沒有Session時,如果create值為true,則會創(chuàng)建一個Session對象,如果為false則會返回null。當前會話已有對應的Session的話就直接返回這個Session

  • Session在服務器端的存儲

    Session保存于內存中。

  • Session在客戶端的存儲

    Cookie中保存Sessionid

不同用戶會話的Session是如何區(qū)分的

Session之間通過jsessionid作為其id(用于唯一標識的主鍵),通過jsessionid區(qū)分不同的Session。

客戶端在首次請求服務器時,服務器會創(chuàng)建本次會話的Session,并返回一個保存了jsessionidCookie。在本次會話之后的請求中,都會帶上這個Cookie以標識本次會話的Session。

如果客戶端禁用了Cookie,則可以將jsessionidurl參數(shù)的形式發(fā)送給服務器。

在服務器中,Session默認的過期時間是30分鐘,但是保存其idCookie的默認生命周期就是會在瀏覽器關閉以后被銷毀。所以,更多的情況下表現(xiàn)為關閉瀏覽器后再次訪問時Session就”沒了“,其實是因為再次訪問時沒有攜帶上一次會話的jsessionid,所以無法找到這個Session。

Token的數(shù)據格式

本質是由服務器生成的一串字符串。

JWT:JSON Web Token

JWT是目前應用較廣的一種Token解決方案。主要由三部分組成:Header 頭部、Payload 有效載荷、Signature 簽名。

Header

  • typ:type,token的類型,一般為JWT
  • alg:algorithm,加密的算法

Payload

  • iss:Issuer,發(fā)行者
  • sub:Subject,主題
  • aud:Audience,受眾
  • exp:Expiration Time,過期時間
  • nbf:Not Before,最早的生效時間
  • iat:Issued At,發(fā)布時間
  • jti:JWT ID,JWT的唯一標識符
  • 自定義數(shù)據

Signature

加密后的HeaderPayload數(shù)據,用于校驗。

參考:

阮一峰:JSON Web Token 入門教程

RFC 7519 - JSON Web Token (JWT)

總結

雖然面的是Java開發(fā)的崗,但是也問到了python,一是自己簡歷中的項目有python相關,二是面試官所在部門的技術棧中除了Java外也包含了python,所以面試官可能也比較感興趣。

整體面試的題目來說,范圍較廣,深度一般。涉及的知識面較廣,除了Java外還涉及到了python相關的很多內容,但在每一個知識領域內問的都不算很深,基本上也是結合簡歷中的項目稍微做了一下拓展深入。

就個人而言,一是很多底層的機制還需要加強理解,像ServletSession、全文索引的實現(xiàn)這些問題當時都回答的不是很準確。其次便是要加強應用方面的認識,對于項目中的一些技術和解決方案,不僅要會用還要從“為什么要用這個”、“不用會怎么樣”、“其他的方案如何”等角度去思考、去拓展,所幸爬蟲那塊之前項目中稍有了解,也算回答的上來。


討論帖

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容