第一部分 必答題
注意:第31題1分,其他題均每題3分。
1,了解哪些基於爬蟲相關的模塊?
- 網絡請求:urllib,requests,aiohttp - 數據解析:re,xpath,bs4,pyquery - selenium - js逆向:pyexcJs
2,常見的數據解析方式?
- re、lxml、bs4
3,列舉在爬蟲過程中遇到的哪些比較難的反爬機制?
- 動態加載的數據 - 動態變化的請求參數 - js加密 - 代理 - cookie
4,簡述如何抓取動態加載數據?
- 基於抓包工具進行全局搜索
- 如果動態加載的數據是密文,則全局搜索是搜索不到
5,移動端數據如何抓取?
- fiddler,appnium,網絡配置
6,抓取過哪些類型的數據,量級多少?
- 電商,醫療器械,彩妝,新聞資訊,金融,體育賽事(參考hao123網站) - 量級: - 最好不要超過100w。自己計算(頁數,一頁顯示多少數據)
7,了解哪些爬蟲框架?
- scrapy,pyspider
8,談談對scrapy的了解?
- 功能:數據解析,持久化存儲,深度爬取,分布式,關鍵件
- 五大核心組件的作用和工作流程
9,如何解析出攜帶標簽的局部頁面數據?
- bs4
10,scrapy核心組件?
- spider,引擎,調度器,下載器,管道
11,scrapy中間件的應用?
- 作用:攔截請求和響應
- 攔截請求:設置代理
12,如何實現全站數據爬取?
- 基於手動請求發送+遞歸解析
- 基於CrwalSpider(LinkExtractor,Rule)
13,如何檢測網站數據更新?
- 增量式爬蟲
14,分布式爬蟲實現原理?
- 基於scrapy-redis實現的分布式。
15,如何提升爬取數據的效率(異步爬蟲)
- 使用框架 - 線程池,多任務的異步協程 - 分布式
16,列舉你接觸的反爬機制?
ua檢測、封ip、js混淆、參數加密、數據加密,動態加載
17,什么是深度優先和廣度優先(優劣)
- 默認情況下scrapy是深度優先。 - 深度優先:占用空間大,但是運行速度快 - 廣度優先:占用空間少,運行速度慢
18,scrapy如何實現持久化存儲
- 解析數據 - 將解析的數據封裝到item中 - 將item提交管道 - 在管道中持久化存儲 - 開啟管道
19,談談對crawlspider的理解,如何使用其進行深度爬取
- 鏈接提取器&規則解析器
20,如何實現數據清洗?
- 清洗空值(缺失值) - 將空對應的行數據刪除.dropna - 使用近鄰值填充空值.fillna - 清洗重復值 - 重復的行數據刪除:drop_duplicates() - 清洗異常值 - 一定要有一個判定異常值的條件
21,了解過機器學習嗎?
- 特征工程 - 特征預處理 - 歸一化,標准化 - 特征值化 - 將非數值型的數據轉換成數值型的數據 - 降維 - sklean框架 - 線性回歸,KNN,貝葉斯 - 補充: 1.樹模型:決策樹 2.集成模型:隨機森林 - 深度學習框架: - tensorflow
22,在爬蟲中為什么需要是用selenium?selenium和爬蟲之間的關聯么?
selenium和爬蟲之間的關聯是什么? - 爬取動態加載的數據 - 模擬登錄
23,列舉你所熟知的selenium模塊中的常用方法及其作用
24,解釋在多任務異步協程中事件循環(loop)的作用是什么?
- 可以將注冊在其內部的任務對象表示的特定操作進行異步執行
25,多任務異步協程是如何實現異步的?
- 一個任務對象就是一個協程也是一組特定的操作,將任務對象注冊到事件循環中,就可以異步的執行每一組特定的操作
- wait方法,await關鍵字
26,驗證碼如何處理?
- 打碼平台
27,scrapy 和 scrapy-redis 有什么區別?
- scrapy-redis這個組件可以給scrapy框架提供共享的管道和調度器實現分布式爬蟲
28,說一說打開瀏覽器訪問 www.baidu.com 獲取到結果,整個流程。
1.域名解析成IP 2.與目的主機進行TCP連接(三次握手) 3.發送和接收數據
29,列出你知道 header 的內容以及信息
- User-Agent
- Connection
30,簡述scrapy的去重原理?
需要將dont_filter設置為False開啟去重,默認是False;
對於每一個url的請求,調度器都會根據請求的相關信息加密得到一個指紋信息,並且將指紋信息和set()集合中得指紋信息進行比對,如果set()集合中已經存在這個數據,就不在將這個Request放入隊列中。如果set()集合中沒有,就將這個Request對象放入隊列中,等待被調度。
31,下列敘述中錯誤的是:(1分)
A.棧是線性結構 B.隊列是線性結構
C.線性列表是線性結構 D.二叉樹是線性結構
32,簡述前序、中序、后續遍歷?
跟左右
左跟右
左右跟
33,寫代碼:實現一個冒泡排序。
def sort(alist): length = len(alist) for j in range(length-1) for i in range(length-1-j): if alist[i] > alist[i+1]: alist[i],alist[i+1] = alist[i+1],alist[i] return alist alist = [3,8,5,2,0,7,6] print(sort(alist))
34,寫代碼:實現一個快速排序。
def sort(alist,left,right): low = left hight = right if low < high: return mid = alist[low] while low < high: while low < high: if alist[high] < mid: alist[low] = alist[high] break else: high -= 1 while low < high: if alist[low] < mid: low += 1 else: alist[high] = alist[low] break if low == high: alist[low] = mid sort(alist,left,low-1) sort(alist,high+1,right) return alist
第二部分 補充題
1,列舉常見用的git命令?
2,你們公司/團隊用怎么做的協同開發?
3,公司如何做代碼review?誰來做?
4,線上代碼如果出現bug如何解決?
git實戰視頻地址:https://www.bilibili.com/video/av70772636