爬蟲面試題


1. http 基於 tcp/ip 協議

2. 百度是通用性爬蟲

3. http 返回的狀態碼代表成功的是 200

4. 網頁編碼使用的函數式 encode()

5. 解碼使用的函數式是 decode()

6. 爬蟲又叫 網頁蜘蛛、網絡機器人

7. 什么是爬蟲並解釋其概念?

(1) 爬蟲又叫網頁蜘蛛,是模擬人操作客戶端向服務器發起請求,抓取數據的自動化程序或腳本 (2) 說明:   ① 模擬:用爬蟲程序偽裝出人的行為,避免被服務器識別為爬蟲程序   ② 客戶端:瀏覽器、app 都可以實現人與服務器之間的交互行為,應用客戶端從服務器獲取數據   ③ 自動化:數據量較小可以人工獲取,但往往在公司里爬取的數據量在百萬條、千萬條級別,所以要程序自動化獲取數據

8. http 協議與 https 協議的區別

1. http 協議需要到 ca 申請證書,一般免費證書較少,因而需要一定費用 2. http 是超文本傳輸協議,信息是明文傳輸,https 則是具有安全性的 ssl加密傳輸協議 3. http 和 https 使用的是完全不同的連接方式,用的端口不一樣,前者是 80,后者是 443
4. http 的連接很簡單,是無狀態的,https 協議是有 ssl +http 協議構建的可進行加密傳輸、身份認證的網絡協議,比 http 協議安全

9. 談談你對 tcp 協議與 udp 協議的理解

(1) 兩者都是傳輸層協議 (2) Tcp 協議,是一種面向連接的,可靠的,基於字節流的傳輸層通信協議,其具有以下 4 個特性:   ① 有序性   ② 正確性   ③ 可靠性   ④ 可控性 (3) Udp 協議,是用戶數據協議,面向無連接的傳輸層協議,傳輸不可靠,其具有以下 3 個特點:   ① 無鏈接,數據可能丟失或損壞   ② 報文小,傳輸速度快   ③ 吞吐量大的網絡傳輸,可以在一定程度上承受數據丟失

10. 什么是 robots 協議?闡述 robots 協議與 爬蟲的關系?

(1) Robots 協議是 約定哪些內容允許哪些爬蟲抓取 (2) 通用爬蟲無需遵守 robots 協議,而我們寫的聚焦爬蟲則需要遵守

11. 網頁編碼有 utf-8、gbk、gb2312

12. 默認端口信息:

(1) Mysql:3306 (2) Ssh:22 (3) MongoDB:27017 (4) Redis:6379 (5) https:443 (6) http:80

13. Requests 模塊發送 get 請求的參數:

(1) Url (2) Headers (3) Params (4) Proxies

14. Requests 模塊發送 post 請求的參數:

(1) Url (2) Headers (3) Data (4) Proxies

15. 簡述聚焦爬蟲的設計思路

(1) 確定 url,模擬瀏覽器向服務器發送請求 (2) 獲取響應數據並進行數據解析 (3) 將目標數據持久化到本地

16. 簡述爬蟲的分類及各類爬蟲的概念

(1) 通用爬蟲:爬取網頁數據,為搜索引擎提供檢索服務 (2) 聚焦爬蟲:針對某一領域爬取特定數據的爬蟲   ① 聚焦爬蟲又分為深度爬蟲和增量式爬蟲

17. 請寫出 8 中常用的請求方法

(1) Get (2) Post (3) Put (4) Delete (5) Trace (6) Head (7) Connect (8) Options

18. 列舉反爬蟲機制(至少 8 種)

(1) UA 檢測
(2) Robots 協議
(3) 驗證碼
(4) IP 封禁
(5) 賬號封禁
(6) 動態數據加載
(7) Js 數據加密
(8) 隱藏參數
(9) 字體反爬

 

19. Requests 發送請求時攜帶 headers 參數及作用(至少寫 3 點)

User-Agent:實現 UA 偽裝
Cookie:模擬登陸
Connection:保持連接
Accept:接受數據類型

20. Requests 向服務器發送文件時,文件的打開模式為 wb

21. Requests 模塊那個類自動封裝 cookie : session

22. 前端頁面由 html、css、JavaScript 等三部分組成

23. 請列舉三個可以實現網頁請求的庫

(1) Requests
(2) Urllib
(3) Aiohttp

24. 簡述 html、css、JavaScript 的作用

(1) Html:定義網頁骨架 (2) Css:定義網頁樣式 (3) JavaScript:定義網頁行為

25. 針對 requests 請求的響應對象,如何獲取其文本形式,二進制形式及 json數據

(1) Res.text:獲取 html 源碼 (2) Res.content:獲取二進制流,多用於圖片、視頻下載等 (3) Res.json():獲取 json 數據,多用 ajax 請求

26. 請列舉三種數據持久化的方式

(1) Csv (2) Json (3) Mysql (4) Mongodb (5) Redis

27. 正則元字符中“.”代表 匹配 任意字符,換行符除外

28. Responose.text,response.content,res.json 分別獲取響應數據的什么形式

(1) Response.text:文本形式 (2) Response.json():json 數據 (3) Response.content:二進制形式

29. 正則表達式中 (.*) 和 (.*?) 匹配區別

(1) (.*):貪婪匹配,盡可能多的匹配 (2) (.*?):非貪婪匹配,盡可能少的匹配

30. Re 模塊常用的三個匹配方法,並簡述其特點

(1) Re.findall():以列表形式返回所有滿足條件的對象 (2) Re.search():匹配到第一個就返回一個對象 ,用 group()取值,匹配不到返回 None (3) Re.match():從字符串開頭匹配,匹配返回一個對象,用 group()取值,匹配不到返回 None

31. Xpath 中根據索引定位節點數時,索引從 1 開始

32. Xpath 中的 contains()函數的第一個參數是 @屬性名 ,第二個參數是屬性包含的值

33. 請簡述單屬性多值匹配,多屬性匹配概念及使用到的函數或關鍵字

(1) 單屬性多值匹配:根據節點某屬性包含的某個值進行定位,使用contains 函數 (2) 多屬性匹配:根據節點的多個屬性,共同定位該節點,使用關鍵字 and

34. 請列舉爬蟲中解析數據的模塊(至少三種)

(1) Lxml (2) Bs4 (3) Pyquery

35. Cookie 和 session 的區別

(1) 數據存儲位置不同,cookie 存在客戶端,session 存在服務器 (2) 安全程度不同,cookie 存客戶端本地,分析 cookie,實現 cookie 欺騙,考慮到安全性,所以用 session (3) 性能不同,session 存服務器,訪問量大時,會增加服務器負載,考慮到性能,所以用 cookie (4) 數據存儲大小不同,單個 cookie 不超過 4k,部分瀏覽器會限制 cookie的存儲個數,但 session 存在服務器,故不受客戶端瀏覽器限制

36. 將 dict 轉成 json 串,用 json 模塊的函數是 json.dumps()

37. Json.dumps 的參數 ensure_ascii 的作用 避免中文亂碼

38. Xpath 如何定位節點的基本語法(至少寫三點)

(1) 根據節點名定位:nodename (2) 根據節點屬性定位:nodename[@attribute=”value”] (3) 從當前節點的根節點向下匹配: ./ (4) 從當前節點的任意位置向下匹配: .//

39. 請描述 xpath 表達式中的./div[@id=”name”]和.//div[@id=”name”]的含義

(1) 從當前節點的根節點向下匹配,匹配一個 div 標簽,該 div 標簽的 id 屬 性值是“name” (2) 從當前節點的任意位置向下匹配,匹配一個 div 標簽,該 div 標簽的 id 屬性值是“name”

40. 請寫出 xpath 表達式中的/text()與//text()的區別

(1) /text():獲取已定位節點的直接子文本 (2) //text():獲取已定節點的子孫節點文本

41. 請寫出 tcp/udp 協議,ip 協議,arp 協議,http/https 協議及 ftp 協議分別位

於 tcp/ip 五層模型的哪一層

(1) TCP/UDP 協議:傳輸層 (2) IP:網絡層 (3) ARP 協議:數據鏈路層 (4) HTTP/HTTPS:應用層 (5) FTP 協議:應用層

42. 請畫出 tcp/ip 五層模型

(1) 應用層 (2) 傳輸層 (3) 網絡層 (4) 數據鏈路層 (5) 物理層

43. 談談 tcp 三次握手四次揮手中為什么要三次握手

(1) TCP 連接的三次握手是為了建立可靠的連接 (2) 第一次握手:客戶端向服務器發送 SYN 包,並進入 SYN_SENF 狀態,等待服務器確認 (3) 第二次握手:服務器收到 SYN 包,確認並發送 SYN+ACK 包,同時進入 SYN_RECV 狀態 (4) 第三次握手:客戶端收到服務器 SYN+ACK 包,向服務器確認 ACK 包,進入 ESTABLISHED 狀態

44. 請寫出 ftp 協議,ssh 協議、mysql、MongoDB、redis 等協議或軟件的默

認端口號 (1) ftp:21 (2) Ssh:22 (3) Mysql:3306 (4) Mongodb:27017 (5) Redis:6379

45. 請列舉三個第三方提取數據的 Python 庫

(1) Wxpython (2) Py2exe (3) Psyco (4) Mysqldb (5) pyprocessing

46. Bs4 的三種選擇器是什么:節點選擇器、方法選擇器、css 選擇器

47. Beautifulsoup 使用步驟

From bs4 import BeautifulSoup Soup = BeautifulSoup(res.text,’lxml’) Soup.select(‘css 選擇器’)

48. 請簡述 bs4 和 lxml 的區別

(1) bs4 會將整個文檔樹進行加載然后進行查詢匹配操作,使用過程中消耗資源較多 (2) lxml 是 python 的一個解析庫,支持 HTML 和 XML 的解析,支持 XPath解析方式,而且解析效率非常高,功能更強大

49. 請簡述 bs4 中 get_text()和 string 的區別

(1) String:獲取節點的直接子文本 (2) get_text():獲取節點下子孫節點文本

50. Bs4 對定位到的標簽如何獲取其直接文本,子孫節點文本和屬性

(1) 直接子文本:string (2) 子孫節點文本:get_text() (3) 屬性:tag[“attribute”]

 

51. Selenium 使用 execute_script(js) 執行 JS 代碼

52. 根據 name 屬性查找網頁標簽使用 find_element_by_name 方法

53. 請列舉至少四種 selenium 的交互操作

(1) Clear() (2) Click() (3) Send_keys() (4) Double_click()

54. 列舉 selenium 至少四種定位頁面元素的方式

(1) Find_element_by_name (2) Find_element_by_id (3) Find_element_by_xpath (4) Find_element_css_selector

 

55. 假如實例化的瀏覽器對象名為 broswer,請寫出該對象打開百度首頁的代碼以及獲取百度首頁源碼的代碼

From selenium import webdriver Borwser = webdriver.chrome(“dirverpath”) Borwser.get(“http://www.baidu.com”) Html = browser.page_source

56. Mongodb 查看當前工作的數據庫的命令是 db

57. Mongodb 查看所有的非空數據庫的命令是 show dbs

58. Show dbs 命令無法查看 空 數據庫

59. 請寫出 mongo db 數據的相關命令

創建並使用集合:use xxx
查看當前工作的集合: db
查看所有非空集合: show dbs
查看當前集合的所有數據:db.table.find()

60. 請列舉三種關系型數據庫與兩種菲關系型數據庫

(1) 關系型數據庫:Mysql、orcale、sql_server (2) 非關系數據庫:redis、mongodb

61. Mongodb 數據庫的優點

(1) 模式自由,面向集合存儲,項目增刪字段不影響程序運行 (2) 具有豐富的查詢表達式,支持動態查詢,以滿足項目的數據查詢需求 (3) 良好的索引支持,文檔內嵌對象和數組,均可創建索引 (4) 支持二進制數據存儲,可以將圖片視頻等文件轉換為二進制流存儲起來 (5)以內存映射為存儲引擎,大幅度提升性能

 

62. 請解釋以下操作符的含義:

(1) $gt: > (2) $lt: < (3) $gte: >= (4) $lte: <= (5) $ne: ≠ (6)$in: 在其中 (7) $nin: 不在其中 (8) $or: 或

63. 向 queue 隊列中添加元素操作為 queue.put()

64. 從 queue 隊列獲取元素的操作為 queue.get()

65. 多線程爬蟲共封裝了幾個類?每個類的作用是什么

(1) 兩個類:爬蟲類、解析類 (2) 爬蟲類;定義爬取的行為,將響應數據提交給響應數據隊列 (2) 解析類:定義數據解析規則並與數據庫交互,將數據持久化進數據庫

66. 談談你對進程與線程的理解

(1) 進程是操作系統將資源分配的基本單位,而線程是任務調度執行的基本單位 (2) 線程是進程的一部分,一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少要有一個線程 (2) 進程都有獨立的代碼和數據空間,切換開銷大,而線程共享代碼與數據空間,切換開銷小

67. 請創建一個名為 dataqueueu 的隊列,並向其中添加一個字符串 s=’helloqueue’的代碼

From queue import Queue Q = Queue() S = “hello queue” Q.put(s)

68. 請簡單繪制多線程爬蟲的架構原理圖

Urlqueue----->爬蟲線程------>Internet----->DataQueue------>解析線程------->database

69. 簡述什么是 i/o 密集型和計算密集型

(1) Io 密集型是指程序運行時,大部分狀況是 CPU 在等待 i/o,即磁盤讀寫,其特點是程序達到性能極限時,CPU 占用率依然很低,涉及到網絡,磁盤 ID 的任務都是 io 密集型 (2) 計算密集型,又稱 CPU 密集型,即程序運行過程中,IO 操作很短時間內完成,而 CPU 占用很大,有許多運算要處理,其特點是要進行大量的運算,消耗 CPU 資源

70. 創建一個 scrapy 項目的命令是 scrapy startproject projectname

71. Scrapy 項目運行的命令是 scrapy crawl spidername

72. Scrapy 框架創建爬蟲文件的命令為 scrapy genspider spidernamedomain

73. 簡述 scrapy 五大核心組件及作用

(1) 引擎:負責各個組件之間的通訊信號及數據的傳遞 (2) 爬蟲:定義了爬取行為和解析規則,提交 item 並傳給管道 (3) 調度器:接受引擎傳遞的 request,並整理排列,然后進行請求的調度 (4) 下載器:負責下載 request,提交響應給引擎,引擎傳遞給 spider (5) 管道: 負責處理 spider 傳遞來 的 item,如 去重、持久化存儲等

74. Scrapy 框架有哪些優點

(1) 框架封裝的組件豐富,適用於開發大規模的抓取項目 (2) 框架基於 Twisted 異步框架,異步處理請求,更快捷,更高效 (3) 擁有強大的社區支持,擁有豐富的插件來擴展其功能

75. Scrapy 基於 Twisted 異步 框架

76. Allowed_domains 的作用是 限制爬蟲爬取的范圍

77. 請簡述 scrapy 框架五大核心組件有哪些

(1) 引擎 (2) 爬蟲 (3) 調度器 (4) 下載器 (5) 管道

78. 如何判斷 scrapy 管道類是否需要 return item

(1)在 scrapy 框架中,可以自定義多個管道類,以滿足不同的數據持久化需求,當定義多管理類時,多個管道需傳遞 item 來進行存儲,管道類   各有自己的權重,權重越小,我們認為越接近引擎,越先接受引擎傳遞來的 item 進行存儲, 故欲使權重大的管道能夠接受到 item,前一個管   道必須 return item,如果一個管道類后無其他管道類,該管道則無需return item

79. 請問為什么下載器返回的相應數據不是直接通過引擎傳遞給管道,而是傳遞給 spider

(2) 由於在 scrapy 中,spider 不但定義了爬取的行為,還定義了數據解析規則,所以響應數據需傳遞給 spider 進行數據解析后,才能將目標數   據傳遞給管道,進行持久化存儲

80. 在 scrapy 框架中手動發起請求時,使用 meta 參數給解析方法傳遞數據

81. Scrapy 框架發送 post 請求使用 FormRequest 方法

82. 請簡述scrapy阻止對start_urls內url主動發送請求時重寫的父類方法名稱,及使用 scrapy.request 的常用參數及含義

(1) 父類方法名稱:start_requests (2) 參數:   ② Url------>發送請求   ③ Callback----->指定回調,解析方法

83. 簡述詳情頁爬取的思路

(1) 訪問列表頁 (2) 從列表頁的響應數據中獲取詳情頁 url (3) 請求詳情頁 url,使用 scrapy.request 手動發送請求並指定回調 (4) 解析數據在回調中獲取目標數據

84. 簡述多頁爬取的思路

(1) 思路一:將所有的頁面 url 生成后放在 start_urls 中,當項目啟動后會對 start_urls 中的 url 發起請求,實現多頁爬取 (2) 思路二:在解析方法中構建 url,使用 scrapy 手動發送請求並指定回調,實現多頁爬取

85. 安裝 scrapy 框架的命令為 pip install scrapy

86. Scrapy 框架管道必須實現的方法是 process_item

87. 請使用 fake_useragent 模塊實現一個簡單的 ua 池

from fake_useragent import UserAgent Ua_obj = UserAgent() Ua_pool = [ ] For i in range(50): Ua = ua_obj.chrome Ua_pool.append(ua) f fr ro om m fake_useragent i i mp po or rt t UserAgent ua = UserAgent() ua_pool = [] f fo or r i i in n range(50): user_agent = ua.Chrome ua_pool.append(user_agent) d de ef f process_request(self, request, spider): request.headers[' 'U Us se er r- -A Ag ge en nt t' '] = random.choice(ua_pool) r re et tu ur rn n N No on ne e c cl la as ss s UaSpider(scrapy.Spider): name = ' 'u ua a' '
# allowed_domains = ['baidu.com']
start_urls = [' 'h ht tt tp p: :/ // /b ba ai id du u. .c co o m/ /' ' f fo or r i i in n range(10)] d de ef f parse(self, response): p pa as ss s

88. Scrapy 框架中間件的分類及其作用

(1) 下載中間件:攔截請求與響應,用於篡改響應 (2) 爬蟲中間件:除下載中間件的作用以外,還可以實現 item 丟棄

89. Scrapy 框架下載中間件的核心方法及其作用

(1) Process_request:攔截非異常請求 (2) Process_response:攔截所有響應 (3) Process_exception:攔截異常請求

90. 修改 scrapy 項目的配置需要修改 settings 文件

91. 應用 selenium 框架實例化瀏覽器對象時,使用 executable_path 參數指定驅動路徑

92. 動態數據加載的兩種情況及相應的解決方案

(1) ajax 請求   ① 方案:如果 url 有規律,直接構建 url 實現請求,如果 url 無規律,則用 selenium (2) Js 動態數據加載   ① 方案:可以采用 scrapy 框架與 selenium 框架對接,實現動態數據加載

93. 簡述 selenium 與 scrapy 框架對接實現動態加載數據的爬取思路

(1) 在 scrapy 項目中正常對動態加載的頁面發起請求,在下載中間件中攔截動態加載頁面的響應數據,在process_response方法中,
  調用selenium抓取相應的 url,獲取 html 源碼后再替換原有響應

94. 請寫出 selenium 的常用節點交互操作(至少 5 條)

(1) Clear():清空 (2) send_keys():輸入 (3) Click():點擊 (4) Quit():退出 (5) double_click():雙擊

95. 創建基於 crawl 的全站爬蟲的命令

(1) Scrapy startproject projectnameScrapy genspider -t crawl spidername baidu.com

96. 簡述 pipeline 的核心方法及各方法實現什么功能

(1) From_crauler:它是一個類方法,用@classmethod 裝飾,用於獲取項目的配置 (2) Open_spider:在爬蟲開啟時被調用,可在其中連接數據庫 (3) process_item:在該方法中實現與數據庫的交互,存儲數據 (4) close_spider:在爬蟲關閉時調用,可在其中關閉數據庫連接

97. Scrapy 原生框架實現分布式要依賴哪個組件?該組件解決了什么問題

(1) scrapy_redis 組件 (2) 該組件為分布式提供了共享的管道和共享的調度器

98. 列舉三種常用的網絡數據爬取的模塊或框架

(1) Requests (2) Scrapy (3) Urllib (4) Aiohttp (5) Pyspider

99. 請談談動態數據加載的爬取思路

(1) 在 scrapy 項目中正常對動態加載的頁面發起請求,在下載中間件中攔截動態加載頁面的響應數據,在process_response方法中,調用selenium   抓取相應的 url,獲取 html 源碼后再替換原有響應

100. 請列舉 5 種反爬機制及其對應的反反爬 策略

(1) Ua 檢測:ua 偽裝 (2) Robots 協 議 : requests 模 塊 無 須 理 會 , settings 配 置 中 將ROBOTSTXT_OBEY 改為 False (3) 動態數據加載:selenium 抓取 (4) 圖片懶加載:根據響應數據獲取實際的 src 屬性值 (5) Ip 封禁:使用代理 ip

101. 請詳細闡述如何在下載中間件中篡改請求頭信息,代理 ip

(1) 在下載中間件的 process_request 中加入如下代碼:   ① Reuqest.meta[“proxy”] = “http://ip:port” # 實現代理 ip
  ② Request.header[“User-Agent”] = “ ” # 實現 ua 偽裝

102. 請寫出爬蟲 數據持久化 Python 與 mongodb 數據庫的交互編碼

Import pymongo Class SpiderPipline(object): Conn = pymongo.MongoClient() Db = conn.xxx Table = db.xx Def process_item(self,item,spider): Self.table.insert_one(dict(item)) Return item

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM