爬蟲面試手冊
薪資13~20k
崗位職責:
- 負責公司數據平臺的數據采集、運維優化;
- 負責自動化腳本,爬蟲腳本;
- 研究數據采集策略和防屏蔽規則,提升數據采集系統的穩定性、可擴展性,提高抓取的效率和質量;
崗位要求
- 本科及以上學歷,計算機、信息科學及相關專業畢業;
- 熟悉java、python或go編程語言,熟悉分布式多線程編程,熟悉網絡協議及數據交換標準;
- 熟悉反爬原理,有成熟的繞過網站屏蔽解決方案;
- 熟悉scrapy、nutch等常用爬蟲框架及原理;
- 熟悉app抓取技術,熟悉常規反爬蟲策略和規避方法,能夠獨立承擔爬蟲運維工作;
- 熟悉beautifulsoup、selenium技術等;
- 使用過爬蟲工具八爪魚、火車頭等;
- 能解決封賬號、封IP、驗證碼識別、圖像識別、風控等問題、有解決封號經驗優先;
- 具有豐富的JS逆向經驗,熟悉反混淆、JS跟蹤、JS 逆向、WASM、JSVMP還原技能;
- 熟練使用AST還原JS、能繞過常見的JS反調試;
- 分析問題邏輯清晰,有高度的責任心,有良好的團隊協作意識和溝通能力,善于學習和鉆研技術;
- 加分項:爬取數據日均超100w次,深度參與至少一個大規模分布式爬蟲系統的架構設計。
- http 協議與 https 協議的區別?
- http 協議需要到 ca 申請證書,一般免費證書較少,因而需要一定費用;
- ?http 是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的 ssl加密傳輸協議;
- http 和 https 使用的是完全不同的連接方式,用的端口不一樣,前者是 80,后者是 443;
- http 的連接很簡單,是無狀態的,https 協議是有 ssl +http 協議構建的可進行加密傳輸、身份認證的網絡協議,比 http 協議安全;
- 什么是 robots 協議?闡述 robots 協議與 爬蟲的關系?
- Robots 協議是約定哪些內容允許哪些爬蟲抓取;
- 通用爬蟲無需遵守 robots 協議,而我們寫的聚焦爬蟲則需要遵守。
- 簡述聚焦爬蟲的設計思路?
- 確定 url,模擬瀏覽器向服務器發送請求;
- 獲取響應數據并進行數據解析;
- 將目標數據持久化到本地;
- 簡述爬蟲的分類及各類爬蟲的概念。
- 通用爬蟲:爬取網頁數據,為搜索引擎提供檢索服務;
- 聚焦爬蟲:針對某一領域爬取特定數據的爬蟲;又分為深度爬蟲和增量式爬蟲。
- 請寫出 8 中常用的請求方法。
Get、?Post、Put、?Delete、Trace、?Head、Connect、Option
- 列舉反爬蟲機制。
- UA 檢測;
- Robots 協議;
- 驗證碼;
- IP 封禁;
- 賬號封禁;
- 動態數據加載;
- ?Js 數據加密;
- 隱藏參數;
- 字體反爬
- Requests 模塊發送 get 請求的參數。
- Url;
- Headers;
- Params;
- Proxies;
- Requests 發送請求時攜帶 headers 參數及作用。
- User-Agent:實現 UA 偽裝;
- Cookie:模擬登陸;
- Connection:保持連接;
- Accept:接受數據類型。
- Requests 向服務器發送文件時,文件的打開模式是什么?
Wb
- Requests 模塊那個類自動封裝 cookie。
session
- 針對 requests 請求的響應對象,如何獲取其文本形式,二進制形式及 json數據
- Res.text:獲取 html 源碼;
- Res.content:獲取二進制流,多用于圖片、視頻下載等;
- Res.json():獲取 json 數據,多用 ajax 請求。
- 請列舉數據持久化的方式。
Csv、Json、Mysql、Mongodb、Redis
- Cookie 和 session 的區別?
- 數據存儲位置不同,cookie 存在客戶端,session 存在服務器;
- 安全程度不同,cookie 存客戶端本地,分析 cookie,實現 cookie 欺騙,考慮到安全性,所以用 session;
- 性能不同,session 存服務器,訪問量大時,會增加服務器負載,考慮到性能,所以用 cookie;
- 數據存儲大小不同,單個 cookie 不超過 4k,部分瀏覽器會限制 cookie的存儲個數,但 session 存在服務器,故不受客戶端瀏覽器限制。
- 請寫出 tcp/udp 協議,ip 協議,arp 協議,http/https 協議及 ftp 協議分別位于 tcp/ip 五層模型的哪一層。
- TCP/UDP 協議:傳輸層;
- IP:網絡層;
- ARP 協議:數據鏈路層;
- HTTP/HTTPS:應用層;
- FTP 協議:應用層。
- 請說出 tcp/ip 五層模型。
- 應用層;
- 傳輸層;
- 網絡層;
- 數據鏈路層;
- 物理層。
- 談談 tcp 三次握手四次揮手中為什么要三次握手?
- TCP 連接的三次握手是為了建立可靠的連接;
- 第一次握手:客戶端向服務器發送 SYN 包,并進入 SYN_SENF 狀態,等待服務器確認;
- 第二次握手:服務器收到 SYN 包,確認并發送 SYN+ACK 包,同時進入 SYN_RECV 狀態;
- 第三次握手:客戶端收到服務器 SYN+ACK 包,向服務器確認 ACK 包,進入 ESTABLISHED 狀態
- 請寫出 ftp、ssh、mysql、MongoDB、redis 協議或軟件的默認端口。
- ftp:21;
- Ssh:22;
- Mysql:3306;
- Mongodb:27017;
- Redis:6379。
- Mongodb 數據庫的優點。
- 模式自由,面向集合存儲,項目增刪字段不影響程序運行;
- 具有豐富的查詢表達式,支持動態查詢,以滿足項目的數據查詢需求;
- 良好的索引支持,文檔內嵌對象和數組,均可創建索引;
- 支持二進制數據存儲,可以將圖片視頻等文件轉換為二進制流存儲起來;
- 以內存映射為存儲引擎,大幅度提升性能。
- 多線程爬蟲共封裝了幾個類?每個類的作用是什么?
- 兩個類:爬蟲類、解析類;
- 爬蟲類;定義爬取的行為,將響應數據提交給響應數據隊列;
- 解析類:定義數據解析規則并與數據庫交互,將數據持久化進數據庫。
- 簡述 scrapy 五大核心組件及作用。
- 引擎:負責各個組件之間的通訊信號及數據的傳遞;
- 爬蟲:定義了爬取行為和解析規則,提交 item 并傳給管道;
- 調度器:接受引擎傳遞的 request,并整理排列,然后進行請求的調度;
- 下載器:負責下載 request,提交響應給引擎,引擎傳遞給 spider;
- 管道: 負責處理 spider 傳遞來 的 item,如 去重、持久化存儲等。
- Scrapy 框架有哪些優點?
- 框架封裝的組件豐富,適用于開發大規模的抓取項目;
- 框架基于 Twisted 異步框架,異步處理請求,更快捷,更高效;
- 擁有強大的社區支持,擁有豐富的插件來擴展其功能;
- 如何判斷 scrapy 管道類是否需要 return item?
在 scrapy 框架中,可以自定義多個管道類,以滿足不同的數據持久化需求,當定義多管理類時,多個管道需傳遞 item 來進行存儲,管道類各有自己的權重,權重越小,我們認為越接近引擎,越先接受引擎傳遞來的 item 進行存儲, 故欲使權重大的管道能夠接受到 item,前一個管道必須 return item,如果一個管道類后無其他管道類,該管道則無需return item。
- 請問為什么下載器返回的相應數據不是直接通過擎傳遞給管道,而是傳遞給 spider?
由于在 scrapy 中,spider 不但定義了爬取的行為,還定義了數據解析規則,所以響應數據需傳遞給 spider 進行數據解析后,才能將目標數據傳遞給管道,進行持久化存儲。
- 簡述詳情頁爬取的思路。
- 訪問列表頁;
- 從列表頁的響應數據中獲取詳情頁 url;
- 請求詳情頁 url,使用 scrapy.request 手動發送請求并指定回調;
- 解析數據在回調中獲取目標數據;
- 簡述多頁爬取的思路。
- 思路一:將所有的頁面 url 生成后放在 start_urls 中,當項目啟動后會對 start_urls 中的 url 發起請求,實現多頁爬取;
- 思路二:在解析方法中構建 url,使用 scrapy 手動發送請求并指定回調,實現多頁爬取。
- 請談談動態數據加載的爬取思路。
在 scrapy 項目中正常對動態加載的頁面發起請求,在下載中間件中攔截動態加載頁面的響應數據,在process_response方法中,調用selenium抓取相應的 url,獲取 html 源碼后再替換原有響應
- 請列舉幾種反爬機制及其對應的反爬策略。
- Ua檢測:ua 偽裝;
- Robots 協 議 : requests 模 塊 無 須 理 會 , settings 配 置 中 將ROBOTSTXT_OBEY 改為 False;
- 動態數據加載:selenium 抓取;
- 圖片懶加載:根據響應數據獲取實際的 src 屬性值;
- Ip 封禁:使用代理 ip。