爬蟲常見面試問題及解答

最近在找實習的過程中,面試過幾家爬蟲工程師的職位,結合之前BOSS直聘爬蟲的經歷,跟大家分享一下面試中關於爬蟲方面的問題。

——————————基礎知識——————————

什麼是爬蟲?

請求網站並提取數據的自動化程序

爬蟲基本流程?

  1. 瀏覽器發起請求,可能包含請求頭等信息,等待伺服器相應
  2. 獲取伺服器響應內容,可能是網頁文本(html、json代碼),圖片二進位、視頻二進位等
  3. 解析內容(正則、xpath、json解析等 )
  4. 保存數據(本地文件、資料庫等)

遇到過什麼反爬蟲措施,如何解決?

1. 基於用戶行為,同一個ip段時間多次訪問同一頁面

利用代理ip,構建ip池

2. 請求頭裡的user-agent

構建user-agent池(操作系統、瀏覽器不同,模擬不同用戶)

3. 動態載入(抓到的數據和瀏覽器顯示的不一樣),js渲染

模擬ajax請求,返回json形式的數據

selenium / webdriver 模擬瀏覽器載入 (chromedriver安裝)

如何提高爬取效率?

爬蟲下載慢主要原因是阻塞等待發往網站的請求和網站返回

  1. 採用非同步與多線程,擴大電腦的cpu利用率;
  2. 採用消息隊列模式
  3. 提高帶寬

request請求方式中的post、get有什麼區別?

  1. GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息
  2. get是在url中傳遞數據,數據放在請求頭中,post是在請求體中傳遞數據
  3. get安全性非常低,post安全性較高,但是get執行效率卻比Post方法好

xpath、css選擇器及返回類型區分?

response.selector.xpath(css) 為了方便,其中的selector可以省略

返回:由selector組成的list,每個元素都是一個selector對象

1、SelectorList類型

case = response.xpath(//*[@class="content"]/ul/li)

2、List類型

case = response.xpath(//*[@class="content"]/ul/li).extract()

3、str類型

case = .join(response.xpath(//*[@class="content"]/ul/li).extract())

extract()[0]選取第一個元素, extract_first()能達到一樣的效果

模擬登陸原理?

因為http請求是無狀態的,網站為了識別用戶身份,需要通過cookie記錄用戶信息(用戶、密碼),這些信息都會在手動登陸時記錄在post請求的form-data里,那麼在爬蟲時候只需要將這些信息添加到請求頭裡即可。

驗證碼?

可以將驗證碼下載到本地人工識別填入

分散式原理?

多台機器多個 spider 對多個 url 同時進行處理

——————————框架知識——————————

用的什麼框架,為什麼選擇這個框架?

scrapy,只需要實現少量代碼,就能夠快速的抓取到數據內容。Scrapy 使用了 Twisted非同步網路框架來處理網路通訊,可以加快下載速度,不用自己去實現非同步框架,並且包含各種中間件介面,可以靈活的完成各種需求。

scrapy的基本結構?

  • 引擎(Scrapy)

    用來處理整個系統的數據流處理, 觸發事務(框架核心)
  • 調度器(Scheduler)

    用來接受引擎發過來的請求, 壓入隊列中, 並在引擎再次請求的時候返回. 可以想像成一個URL(抓取網頁的網址或者說是鏈接)的優先隊列, 由它來決定下一個要抓取的網址是什麼, 同時去除重複的網址
  • 下載器(Downloader)

    用於下載網頁內容, 並將網頁內容返回給蜘蛛(Scrapy下載器是建立在twisted這個高效的非同步模型上的)
  • 爬蟲(Spiders)

    爬蟲是主要幹活的, 用於從特定的網頁中提取自己需要的信息, 即所謂的實體(Item)。用戶也可以從中提取出鏈接,讓Scrapy繼續抓取下一個頁面
  • 項目管道(Pipeline)

    負責處理爬蟲從網頁中抽取的實體,主要的功能是持久化實體、驗證實體的有效性、清除不需要的信息。當頁面被爬蟲解析後,將被發送到項目管道,並經過幾個特定的次序處理數據。
  • 下載器中間件(Downloader Middlewares)

    位於Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應。
  • 爬蟲中間件(Spider Middlewares)

    介於Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應輸入和請求輸出。
  • 調度中間件(Scheduler Middewares)

    介於Scrapy引擎和調度之間的中間件,從Scrapy引擎發送到調度的請求和響應。

scrapy框架執行爬蟲的流程?

  1. 引擎從調度器中取出一個鏈接(URL)用於接下來的抓取
  2. 引擎把URL封裝成一個請求(Request)傳給下載器
  3. 下載器把資源下載下來,並封裝成應答包(Response)
  4. 爬蟲解析Response
  5. 解析出實體(Item),則交給實體管道進行進一步的處理
  6. 解析出的是鏈接(URL),則把URL交給調度器等待抓取

———————————資料庫———————————

關係型資料庫和非關係型資料庫的區別?

關係型:MySQL、Oracle、SQL Server、DB2等

優勢:

  • 支持複雜查詢。可以用SQL語句方便的在一個表以及多個表之間做非常複雜的數據查詢
  • 事務支持。使得對於安全性能很高的數據訪問要求得以實現

非關係型:MongoDB、Redis等

優勢:

  • 性能高。NOSQL是基於鍵值對的,可以想像成表中的主鍵和值的對應關係,而且不需要經過SQL層的解析,所以性能非常高
  • 可擴展性。同樣也是因為基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展

資料庫索引(類似於書的目錄)

類型:

(1)普通索引:沒有任何限制

(2)唯一索引:不允許建立索引的列有重複值,但可以有空值

(3)主索引:特殊的唯一索引,不允許有空值

(4)候選索引:唯一性,可以有多個候選索引

優點:加快數據查找的效率

缺點:

  1. 佔用磁碟空間
  2. 增加了插入和刪除的操作時間。一個表擁有的索引越多,插入和刪除的速度越慢,如要求快速錄入的系統不宜建過多索引

索引實現方式?

  1. B+樹
  2. 散列索引
  3. 點陣圖索引

SQL裡面設置複合索引與單個普通索引的區別?

  1. 複合索引只對和索引中排序相同或相反的order by 語句優化
  2. 如果存在一個多列索引,任何最左面的索引前綴能被優化器使用。所以聯合索引的順序不同,影響索引的選擇,盡量將值少的放在前面。

資料庫視圖?

視圖是從一個或多個表(視圖)導出的表,視圖與表不同,視圖是一個虛表,即視圖所對應的數據不進行實際存儲,資料庫中只存儲視圖的定義,在對視圖的數據進行操作時,系統根據視圖的定義去操作與視圖相關聯的基本表

優點:

  • 簡化了操作,把經常使用的數據定義為視圖

對於一個查詢動作頻繁發生的話,我們可以創建視圖簡化

  • 安全性,用戶只能查詢和修改能看到的數據

將基表中重要的欄位信息,可以不通過視圖給用戶,用戶對視圖不可以隨意的更改和刪除,可以保證數據的安全性

  • 邏輯上的獨立性,屏蔽了真實表的結構帶來的影響

視圖可以使應用程序和資料庫表在一定程度上獨立。如果沒有視圖,應用一定是建立在表上的。有了視圖之後,程序可以建立在視圖之上,從而程序與資料庫表被視圖分割開來

缺點:

  • 性能差

資料庫必須把視圖查詢轉化成對基本表的查詢,如果這個視圖是由一個複雜的多表查詢所定義,那麼,即使是視圖的一個簡單查詢,資料庫也要把它變成一個複雜的結合體,需要花費一定的時間

  • 修改限制

當用戶試圖修改視圖的某些信息時,資料庫必須把它轉化為對基本表的某些信息的修改,對於簡單的視圖來說,這是很方便的,但是,對於比較複雜的試圖,可能是不可修改的

資料庫事務?

資料庫事務是指作為單個邏輯工作單元執行的一系列操作,要麼完全執行,要麼完全不執行

性質:

  • 原子性
  • 一致性
  • 隔離性
  • 持久性

三級模式兩層映射

  • 外模式

外模式也稱為用戶模式,它是資料庫用戶(包括應用程序員和最終用戶)能夠看見和使用的局部數據的邏輯結構和特徵的描述,是資料庫用戶的數據視圖,是與某一應用有關的數據的邏輯表示。外模式是模式的子集,一個資料庫可以有多個外模式。

  • 模式

模式也稱為邏輯模式或概念模式,是資料庫中全體數據的邏輯結構和特徵的描述,是所有用戶的公共數據視圖。一個資料庫只有一個模式,模式位於三級結構的中間層。

  • 內模式

內模式也稱為存儲模式,一個資料庫只有一個內模式,它是數據物理結構和存儲方式的描述,是數據在資料庫內部的表示方式。

好處:有效地組織、管理數據,提高了資料庫的邏輯獨立性和物理獨立性

  • 外模式/模式映射

當模式被改變時,資料庫管理員對各個外模式/模式映射做相應的改變,可以使外模式保持不變。這樣,依據數據外模式編寫的應用程序就不用修改,保證了數據與程序的邏輯獨立性

  • 模式/內模式映射

資料庫的存儲結構被改變時,資料庫管理員對模式/內模式映射做相應的改變,可以使模式保持不變,應用程序相應地也不做變動。這樣,保證了數據與程序的物理獨立性

MySQL用戶許可權、庫許可權、表許可權的控制?

用戶許可權:連接資料庫需要用戶名、密碼

庫許可權:

#給用戶hehe賦予操作test庫的所有許可權grant all on test.* to hehe@localhost identified by 123456;

表許可權:

#給用戶hehe操作test庫goods表的insert,select,update的許可權grant insert,select,update on test.goods to hehe@localhost identified

——————————協議方面———————————

http、https協議有什麼區別?

  • http協議是超文本傳輸協議,被用於在web瀏覽器和網站伺服器之間傳遞信息,以明文方式發送內容,不對數據加密,很容易被黑客入侵,安全性不高
  • 為了數據傳輸的安全,https在http的基礎上加入了SSL協議,SSL依靠ca證書來驗證伺服器的身份,為瀏覽器和伺服器之間的通信加密

http狀態碼?

表示網頁伺服器http響應狀態的3位數字代碼

  • 2開頭 (請求成功)表示成功處理了請求的狀態代碼
  • 3開頭 (請求被重定向)表示要完成請求,需要進一步操作
  • 4開頭 (客戶端錯誤)這些狀態代碼表示請求可能出錯,妨礙了伺服器的處理
  • 5開頭(伺服器錯誤)這些狀態代碼表示伺服器在嘗試處理請求時發生內部錯誤

常見狀態碼:

200 (成功) 伺服器已成功處理了請求

403 (禁止) 伺服器拒絕請求

404 (未找到) 伺服器找不到請求的網頁

408 (請求超時) 伺服器等候請求時發生超時

爬蟲協議?

Robots協議(也稱為爬蟲協議、爬蟲規則、機器人協議等)也就是robots.txt,網站通過robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。

Robots協議是網站國際互聯網界通行的道德規範,其目的是保護網站數據和敏感信息、確保用戶個人信息和隱私不被侵犯。因其不是命令,故需要搜索引擎自覺遵守。

未經許可,禁止轉載!!!


推薦閱讀:

關於在Python中安裝Scrapy 框架遇到的問題的解決方案
大神教你如果學習Python爬蟲 如何才能高效地爬取海量數據
xpath全面總結
網易雲音樂Ajax Post參數加密方法

TAG:python爬蟲 | 面試問題 | scrapy |