爬蟲常見面試問題及解答
最近在找實習的過程中,面試過幾家爬蟲工程師的職位,結合之前BOSS直聘爬蟲的經歷,跟大家分享一下面試中關於爬蟲方面的問題。
——————————基礎知識——————————
什麼是爬蟲?
請求網站並提取數據的自動化程序
爬蟲基本流程?
- 瀏覽器發起請求,可能包含請求頭等信息,等待伺服器相應
- 獲取伺服器響應內容,可能是網頁文本(html、json代碼),圖片二進位、視頻二進位等
- 解析內容(正則、xpath、json解析等 )
- 保存數據(本地文件、資料庫等)
遇到過什麼反爬蟲措施,如何解決?
1. 基於用戶行為,同一個ip段時間多次訪問同一頁面
利用代理ip,構建ip池
2. 請求頭裡的user-agent
構建user-agent池(操作系統、瀏覽器不同,模擬不同用戶)
3. 動態載入(抓到的數據和瀏覽器顯示的不一樣),js渲染
模擬ajax請求,返回json形式的數據
selenium / webdriver 模擬瀏覽器載入 (chromedriver安裝)
如何提高爬取效率?
爬蟲下載慢主要原因是阻塞等待發往網站的請求和網站返回
- 採用非同步與多線程,擴大電腦的cpu利用率;
- 採用消息隊列模式
- 提高帶寬
request請求方式中的post、get有什麼區別?
- GET一般用於獲取/查詢資源信息,而POST一般用於更新資源信息
- get是在url中傳遞數據,數據放在請求頭中,post是在請求體中傳遞數據
- 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框架執行爬蟲的流程?
- 引擎從調度器中取出一個鏈接(URL)用於接下來的抓取
- 引擎把URL封裝成一個請求(Request)傳給下載器
- 下載器把資源下載下來,並封裝成應答包(Response)
- 爬蟲解析Response
- 解析出實體(Item),則交給實體管道進行進一步的處理
- 解析出的是鏈接(URL),則把URL交給調度器等待抓取
———————————資料庫———————————
關係型資料庫和非關係型資料庫的區別?
關係型:MySQL、Oracle、SQL Server、DB2等
優勢:
- 支持複雜查詢。可以用SQL語句方便的在一個表以及多個表之間做非常複雜的數據查詢
- 事務支持。使得對於安全性能很高的數據訪問要求得以實現
非關係型:MongoDB、Redis等
優勢:
- 性能高。NOSQL是基於鍵值對的,可以想像成表中的主鍵和值的對應關係,而且不需要經過SQL層的解析,所以性能非常高
- 可擴展性。同樣也是因為基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展
資料庫索引(類似於書的目錄)
類型:
(1)普通索引:沒有任何限制
(2)唯一索引:不允許建立索引的列有重複值,但可以有空值
(3)主索引:特殊的唯一索引,不允許有空值
(4)候選索引:唯一性,可以有多個候選索引
優點:加快數據查找的效率
缺點:
- 佔用磁碟空間
- 增加了插入和刪除的操作時間。一個表擁有的索引越多,插入和刪除的速度越慢,如要求快速錄入的系統不宜建過多索引
索引實現方式?
- B+樹
- 散列索引
- 點陣圖索引
SQL裡面設置複合索引與單個普通索引的區別?
- 複合索引只對和索引中排序相同或相反的order by 語句優化
- 如果存在一個多列索引,任何最左面的索引前綴能被優化器使用。所以聯合索引的順序不同,影響索引的選擇,盡量將值少的放在前面。
資料庫視圖?
視圖是從一個或多個表(視圖)導出的表,視圖與表不同,視圖是一個虛表,即視圖所對應的數據不進行實際存儲,資料庫中只存儲視圖的定義,在對視圖的數據進行操作時,系統根據視圖的定義去操作與視圖相關聯的基本表
優點:
- 簡化了操作,把經常使用的數據定義為視圖
對於一個查詢動作頻繁發生的話,我們可以創建視圖簡化
- 安全性,用戶只能查詢和修改能看到的數據
將基表中重要的欄位信息,可以不通過視圖給用戶,用戶對視圖不可以隨意的更改和刪除,可以保證數據的安全性
- 邏輯上的獨立性,屏蔽了真實表的結構帶來的影響
視圖可以使應用程序和資料庫表在一定程度上獨立。如果沒有視圖,應用一定是建立在表上的。有了視圖之後,程序可以建立在視圖之上,從而程序與資料庫表被視圖分割開來
缺點:
- 性能差
資料庫必須把視圖查詢轉化成對基本表的查詢,如果這個視圖是由一個複雜的多表查詢所定義,那麼,即使是視圖的一個簡單查詢,資料庫也要把它變成一個複雜的結合體,需要花費一定的時間
- 修改限制
當用戶試圖修改視圖的某些信息時,資料庫必須把它轉化為對基本表的某些信息的修改,對於簡單的視圖來說,這是很方便的,但是,對於比較複雜的試圖,可能是不可修改的
資料庫事務?
資料庫事務是指作為單個邏輯工作單元執行的一系列操作,要麼完全執行,要麼完全不執行
性質:
- 原子性
- 一致性
- 隔離性
- 持久性
三級模式兩層映射 ?
- 外模式
外模式也稱為用戶模式,它是資料庫用戶(包括應用程序員和最終用戶)能夠看見和使用的局部數據的邏輯結構和特徵的描述,是資料庫用戶的數據視圖,是與某一應用有關的數據的邏輯表示。外模式是模式的子集,一個資料庫可以有多個外模式。
- 模式
模式也稱為邏輯模式或概念模式,是資料庫中全體數據的邏輯結構和特徵的描述,是所有用戶的公共數據視圖。一個資料庫只有一個模式,模式位於三級結構的中間層。
- 內模式
內模式也稱為存儲模式,一個資料庫只有一個內模式,它是數據物理結構和存儲方式的描述,是數據在資料庫內部的表示方式。
好處:有效地組織、管理數據,提高了資料庫的邏輯獨立性和物理獨立性
- 外模式/模式映射
當模式被改變時,資料庫管理員對各個外模式/模式映射做相應的改變,可以使外模式保持不變。這樣,依據數據外模式編寫的應用程序就不用修改,保證了數據與程序的邏輯獨立性
- 模式/內模式映射
資料庫的存儲結構被改變時,資料庫管理員對模式/內模式映射做相應的改變,可以使模式保持不變,應用程序相應地也不做變動。這樣,保證了數據與程序的物理獨立性
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參數加密方法