爬虫基本面试题
?
Python自帶:urllib,urllib2
第 三 方:requests
框? ? 架:Scrapy
urllib和urllib2模塊都做與請求URL相關的操作,但他們提供不同的功能。
urllib2.:urllib2.urlopen可以接受一個Request對象或者url,(在接受Request對象時候,并以此可以來設置一個URL 的headers),urllib.urlopen只接收一個url
urllib 有urlencode,urllib2沒有,因此總是urllib,urllib2常會一起使用的原因
scrapy是封裝起來的框架,他包含了下載器,解析器,日志及異常處理,基于多線程, twisted的方式處理,對于固定單個網站的爬取開發,有優勢,但是對于多網站爬取 100個網站,并發及分布式處理方面,不夠靈活,不便調整與括展。
request 是一個HTTP庫, 它只是用來,進行請求,對于HTTP請求,他是一個強大的庫,下載,解析全部自己處理,靈活性更高,高并發與分布式部署也非常靈活,對于功能可以更好實現.
?2,scrapy和scrapy-redis的區別?
???scrapy是一個爬蟲通用框架,但不支持分布式,scrapy-redis是為了更方便的實現scrapy分布式爬蟲,而提供了一些以redis為基礎的組件
? ??為什么會選擇redis數據庫?
? ? 因為redis支持主從同步,而且數據都是緩存在內存中,所以基于redis的分布式爬蟲,對請求和數據的高頻讀取效率非常高
? ??什么是主從同步?
在Redis中,用戶可以通過執行SLAVEOF命令或者設置slaveof選項,讓一個服務器去復制(replicate)另一個服務器,我們稱呼被復制的服務器為主服務器(master),而對主服務器進行復制的服務器則被稱為從服務器(slave),當客戶端向從服務器發送SLAVEOF命令,要求從服務器復制主服務器時,從服務器首先需要執行同步操作,也即是,將從服務器的數據庫狀態更新至主服務器當前所處的數據庫狀態
3,scrapy的優缺點?為什么要選擇scrapy框架?
優點:采取可讀性更強的xpath代替正則?
強大的統計和log系統?
同時在不同的url上爬行?
支持shell方式,方便獨立調試?
寫middleware,方便寫一些統一的過濾器?
通過管道的方式存入數據庫
缺點:基于python爬蟲框架,擴展性比較差,基于twisted框架,運行中exception是不會干掉reactor,并且異步框架出錯后是不會停掉其他任務的,數據出錯后難以察覺
4,scrapy和requests的使用情況?
requests 是 polling 方式的,會被網絡阻塞,不適合爬取大量數據
scapy 底層是異步框架 twisted ,并發是最大優勢
5,描述一下scrapy框架的運行機制?
從start_urls里面獲取第一批url發送請求,請求由請求引擎給調度器入請求對列,獲取完畢后,調度器將請求對列交給下載器去獲取請求對應的響應資源,并將響應交給自己編寫的解析方法做提取處理,如果提取出需要的數據,則交給管道處理,如果提取出url,則繼續執行之前的步驟,直到多列里沒有請求,程序結束。
6,寫爬蟲使用多進程好,還是用多線程好?
IO密集型代碼(文件處理、網絡爬蟲等),多線程能夠有效提升效率(單線程下有IO操作會進行IO等待,造成不必要的時間浪費,而開啟多線程能在線程A等待時,自動切換到線程B,可以不浪費CPU的資源,從而能提升程序執行效率)。在實際的數據采集過程中,既考慮網速和響應的問題,也需要考慮自身機器的硬件情況,來設置多進程或多線程
7,常見的反爬蟲和應對方法?
? ??1. 基于用戶行為,同一個ip段時間多次訪問同一頁面
????????利用代理ip,構建ip池
????2. 請求頭里的user-agent
????????構建user-agent池(操作系統、瀏覽器不同,模擬不同用戶)
????3. 動態加載(抓到的數據和瀏覽器顯示的不一樣),js渲染
????模擬ajax請求,返回json形式的數據
? ? 4,selenium / webdriver 模擬瀏覽器加載
? ? 5,對抓到的數據進行分析
? ? 6,加密參數字段
?????會話跟蹤【cookie】
????? 防盜鏈設置【Referer
8,分布式爬蟲主要解決什么問題?
????????面對海量待抓取網頁,只有采用分布式架構,才有可能在較短時間內完成一輪抓取工作。
? ? ? ? 它的開發效率是比較快而且簡單的。
9,爬取時彈出對話框讓驗證,又該怎么處理?
? ??HTTP請求的basic認證
客戶端將輸入的用戶名密碼用Base64進行編碼后,采用非加密的明文方式傳送給服務器。
Authorization: Basic xxxxxxxxxx.
10,你在爬蟲過程中,都是怎么解決反爬的,爬取多少數據,用了多長時間?
11,爬取這些數據都用來做什么的?怎么交付給公司?客戶是誰?爬取數據的影響因素?
? ? 當時我們公司核心業務是網站開發,還有數據的采集,會經常需要一些數據,采集的數據一?是為了滿足公司需求,二是我們有合作的公司,負責給他們提供他們所需要的數據,(根據客戶需求做好?相應格式的數據文件,交付給項目組長)(數據庫導出)
? ? 影響因素:機器的性能及帶寬,代碼質量,爬取時的反爬機制
12,什么是爬蟲,為什么要用爬蟲?
????用于在網絡上采集數據的程序,可以用任何語言開發,python更加方便快捷高效一些。
????爬蟲的目的:采集一些需要的數據。
? ? 為什么python更適合寫爬蟲程序?python中封裝了很多爬蟲庫,如urllib ,re,bs,scrapy等,開發效率更高
13,爬蟲的基本流程?
? ? ? ? 1,瀏覽器發起請求,可能包含請求頭等信息,等待服務器相應
? ? ? ? ?2,獲取服務器響應內容,可能是網頁文本(html、json代碼),圖片二進制、視頻二進制等
? ? ? ? 3,解析內容(正則、xpath、json解析等 )
? ? ? ? 4, 保存數據(本地文件、數據庫等)
14,如何提高爬取效率?
? ??????爬蟲下載慢主要原因是阻塞等待發往網站的請求和網站返回
? ? ? ? 1,采用異步與多線程,擴大電腦的cpu利用率;
? ? ? ? 2,采用消息隊列模式
? ? ? ? 3,提高帶寬
15,request請求方式中的post、get有什么區別
? ???GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息
????get是在url中傳遞數據,數據放在請求頭中,post是在請求體中傳遞數據
????get安全性非常低,post安全性較高,但是get執行效率卻比Post方法好
16,模擬登陸原理?
? ??因為http請求是無狀態的,網站為了識別用戶身份,需要通過cookie記錄用戶信息(用戶、密碼),這些信息都會在手動登陸時記錄在post請求的form-data里,那么在爬蟲時候只需要將這些信息添加到請求頭里即可。
17,分布式原理?
多臺機器多個spider 對多個 url 同時進行處理
分布式如何判斷爬蟲已經停止了?
18,下載器中間件(Downloader Middlewares)
位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應。
爬蟲中間件(Spider Middlewares)介于Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應輸入和請求輸出。
調度中間件(Scheduler Middewares)介于Scrapy引擎和調度之間的中間件,從Scrapy引擎發送到調度的請求和響應
19,爬蟲協議?
Robots協議(也稱為爬蟲協議、爬蟲規則、機器人協議等)也就是robots.txt,網站通過robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。
Robots協議是網站國際互聯網界通行的道德規范,其目的是保護網站數據和敏感信息、確保用戶個人信息和隱私不被侵犯。因其不是命令,故需要搜索引擎自覺遵守。
20,爬蟲的底層原理?
21,scrapy中間件有幾種類,你用過那些中間件?
? ??????scrapy的中間件理論上有三種(Schduler Middleware,Spider Middleware,Downloader Middleware)
DownloaderMiddleware主要處理請求Request發出去和結果Response返回的一些回調,
比如說你要加UserAgent,使用代理,修改refferer(防盜鏈),添加cookie,或者請求異常超時處理啥的
? ? ? ? 常用:?1.爬蟲中間件Spider Middleware
? ? ? ? ?主要功能是在爬蟲運行過程中進行一些處理.
2.下載器中間件Downloader Middleware
? ? ? ? ?主要功能在請求到網頁后,頁面被下載時進行一些處理.
22,代理問題
1.為什么會用到代理
將真是IP隱藏起來(請求過于太頻繁的話,ip可能會被禁止)
2.代理怎么使用(具體代碼,請求在什么時候添加的代理)
proxy_handler = ProxyHandler({'http': 'http://183.159.89.204:18118'})
# 構建一個Opener對象
proxy_opener = build_opener(proxy_handler)
# 使用自定義opener訪問服務器數據,得到相應
response = proxy_opener.open(request)
3.代理失效了怎么處理
23,驗證碼處理
1.登陸驗證碼處理
2.爬取速度過快出現的驗證碼處理
3.如何用機器識別驗證碼
24,模擬登陸問題
1.模擬登陸流程
因為http請求是無狀態的,網站為了識別用戶身份,需要通過cookie記錄用戶信息(用戶、密碼),這些信息都會在手動登陸時記錄在post請求的form-data里,那么在爬蟲時候只需要將這些信息添加到請求頭里即可
2.cookie如何處理
同上
3.如何處理網站傳參加密的情況
對抓包數據進行分析,這要?在具體的項目中去說明
25,數據存儲和數據庫問題
?1.關系型數據庫和非關系型數據庫的區別
????????????????1.關系型數據庫通過外鍵關聯來建立表與表之間的關系,
????????????????2.非關系型數據庫通常指數據以對象的形式存儲在數據庫中,而對象之間的關系通過每個對象自身的屬性來決定
2.爬下來數據你會選擇什么存儲方式,為什么
3.各種數據庫支持的數據類型,和特點,比如:redis如何實現持久化,mongodb
是否支持事物等?。。
26,協議問題
# 爬蟲從網頁上拿數據肯定需要模擬網絡通信的協議
1.http協議,請求由什么組成,每個字段分別有什么用,https和http有什么差距
2.證書問題
3.TCP,UDP各種相關問題
27,數據提取問題
1.主要使用什么樣的結構化數據提取方式
? ? xpath? 正則? bs4等
2.動態加載的數據如何提取
模擬ajax請求,返回json形式的數據
3.json數據如何提取
? ??python中內置了json模塊,提供了dumps、dump、loads、load,用于字符串 和 python數據類型間進行轉換。然后再對數據用遞歸,正則,或者一層一層獲取的方法得到數據
28,redis數據庫有哪幾種數據結構?
5種數據結構:
? ?String字符串
List列表
Set集合
Hash散列
Zset有序集合
29,使用redis搭建分布式系統時如何處理網絡延遲和網絡異常?
由于網絡異常的存在,分布式系統中請求結果存在“三態”的概念,即三種狀態:“成功”、“失敗”、“超時(未知)”
當出現“超時”時可以通過發起讀取數據的操作以驗證 RPC 是否成功(例如銀行系統的做法)
另一種簡單的做法是,設計分布式協議時將執行步驟設計為可重試的,即具有所謂的“冪等性”
也可設置一個超時時間,如果超過該時間,可以try出去。
30,如果對方網站反爬取,封IP了怎么辦?
1,放慢抓取熟速度,減小對目標網站造成的壓力,但是這樣會減少單位時間內的數據抓取量
2,使用代理IP(免費的可能不穩定,收費的可能不劃算)
?
31,關于防盜鏈?
部分服務器會檢查 http 請求頭的?Referer?字段來判斷你是否是從指定頁面跳轉而來的,以達到防盜鏈的作用。因此在偽裝請求頭部的時候,該字段也是不容忽視的。
?
32,對__if__name__ == 'main'的理解陳述__name__是當前模塊名,當模塊被直接運行時模塊名為_main_,也就是當前的模塊,當模塊被導入時,模塊名就不是__main__,即代碼將不會執行。
33Python里面如何拷貝一個對象?(賦值,淺拷貝,深拷貝的區別)
賦值(=),就是創建了對象的一個新的引用,修改其中任意一個變量都會影響到另一個。
淺拷貝:創建一個新的對象,但它包含的是對原始對象中包含項的引用(如果用引用的方式修改其中一個對象,另外一個也會修改改變){1,完全切片方法;2,工廠函數,如list();3,copy模塊的copy()函數}
深拷貝:創建一個新的對象,并且遞歸的復制它所包含的對象(修改其中一個,另外一個不會改變){copy模塊的deep.deepcopy()函數
?
try…except…except…else…
執行try下的語句,如果引發異常,則執行過程會跳到except語句。對每個except分支順序嘗試執行,如果引發的異常與except中的異常組匹配,執行相應的語句。如果所有的except都不匹配,則異常會傳遞到下一個調用本代碼的最高層try代碼中。
try下的語句正常執行,則執行else塊代碼。如果發生異常,就不會執行如果存在finally語句,最后總是會執行。
35、Python中__new__與__init方法的區別
__new__:它是創建對象時調用,會返回當前對象的一個實例,可以用_new_來實現單例?
__init__:它是創建對象后調用,對當前對象的一些實例初始化,無返回值
36.?常用的網絡數據爬取方法
-
正則表達式
-
Beautiful Soup
-
Lxml
37、遇到過得反爬蟲策略以及解決方法
1.通過headers反爬蟲
2.基于用戶行為的發爬蟲:(同一IP短時間內訪問的頻率)
3.動態網頁反爬蟲(通過ajax請求數據,或者通過JavaScript生成)
4.對部分數據進行加密處理的(數據是亂碼)
解決方法:
對于基本網頁的抓取可以自定義headers,添加headers的數據
使用多個代理ip進行抓取或者設置抓取的頻率降低一些,
動態網頁的可以使用selenium + phantomjs 進行抓取
對部分數據進行加密的,可以使用selenium進行截圖,使用python自帶的pytesseract庫進行識別,但是比較慢最直接的方法是找到加密的方法進行逆向推理。
38、urllib 和 urllib2 的區別
urllib 和urllib2都是接受URL請求的相關模塊,但是urllib2可以接受一個Request類的實例來設置URL請求的headers,urllib僅可以接受URL。urllib不可以偽裝你的User-Agent字符串。
urllib提供urlencode()方法用來GET查詢字符串的產生,而urllib2沒有。這是為何urllib常和urllib2一起使用的原因。
?
39、列舉網絡爬蟲所用到的網絡數據包,解析包
-
網絡數據包 urllib、urllib2、requests
-
解析包 re、xpath、beautiful soup、lxml
40、POST與 GET的區別
-
GET數據傳輸安全性低,POST傳輸數據安全性高,因為參數不會被保存在瀏覽器歷史或web服務器日志中;
-
在做數據查詢時,建議用GET方式;而在做數據添加、修改或刪除時,建議用POST方式;
-
GET在url中傳遞數據,數據信息放在請求頭中;而POST請求信息放在請求體中進行傳遞數據;
-
GET傳輸數據的數據量較小,只能在請求頭中發送數據,而POST傳輸數據信息比較大,一般不受限制;
-
在執行效率來說,GET比POST好
41、什么是lambda函數?它有什么好處?
lambda 表達式,通常是在需要一個函數,但是又不想費神去命名一個函數的場合下使用,也就是指匿名函數
lambda函數:首要用途是指點短小的回調函數
42.?介紹一下except的用法和作用?
try…except…except…[else…][finally…]
執行try下的語句,如果引發異常,則執行過程會跳到except語句。對每個except分支順序嘗試執行,如果引發的異常與except中的異常組匹配,執行相應的語句。如果所有的except都不匹配,則異常會傳遞到下一個調用本代碼的最高層try代碼中。
try下的語句正常執行,則執行else塊代碼。如果發生異常,就不會執行
如果存在finally語句,最后總是會執行
?except: #捕獲所有異常
except: <異常名>: #捕獲指定異常
except:<異常名 1, 異常名 2> : 捕獲異常 1 或者異常 2
except:<異常名>,<數據>:捕獲指定異常及其附加的數據
except:<異常名 1,異常名 2>:<數據>:捕獲異常名 1 或者異常名 2,及附加的數據
答:pass語句不會執行任何操作,一般作為占位符或者創建占位程序,whileFalse:pass
44.介紹一下Python下range()函數的用法?
答:列出一組數據,經常用在for in range()循環中
?45.Python里面如何生成隨機數?
答:random模塊
隨機整數:random.randint(a,b):返回隨機整數x,a<=x<=b
random.randrange(start,stop,[,step]):返回一個范圍在(start,stop,step)之間的隨機整數,不包括結束值。
隨機實數:random.random( ):返回0到1之間的浮點數
random.uniform(a,b):返回指定范圍內的浮點數。
46.有沒有一個工具可以幫助查找python的bug和進行靜態的代碼分析?
答:PyChecker是一個python代碼的靜態分析工具,它可以幫助查找python代碼的bug, 會對代碼的復雜度和格式提出警告
Pylint是另外一個工具可以進行codingstandard檢查
47.如何在一個function里面設置一個全局的變量?
答:解決方法是在function的開始插入一個global聲明:
def f()
global x
?
last:爬蟲中遇到的錯誤,是怎么解決的?
1,獲取json數據之后,把Json格式字符串解碼轉換成Python對象時,在json.loads的時候出錯?
? ??要注意被解碼的Json字符的編碼,如果傳入的字符串的編碼不是UTF-8的話,需要指定字符編碼的參數encoding
2,使用urllib2時,經常遇到編碼問題
3,有時會遇到503錯誤
? ??主要是指服務器判斷出你是爬蟲程序,所以需要改變一下請求頭,設置一下時間的間隔
4,bs4庫解析時遇到的問題?
html 頁面的數據經過Beautiful Soup庫的解析后,部分html源碼丟失,找不到想要的數據了
查看官方文檔,bs 庫支持的解析庫有 lxml, html5lib 和 html.parser。用的最多的是 lxml,因為它的解析速度快,并且容錯能力強,默認也是使用該解析器。
出現解析后源碼丟失的可能原因有 2 個:
BeautifulSoup 有時候會遇到非法的,不支持的 html 源碼而導致無法解析或無法正常解析 html;
處理的文檔太大,而處理的解析器緩存不夠造成的信息丟失。
這里換一個解析器,換成?html.parser?就可以了。
?
摘自:城北有夢https://www.jianshu.com/p/db9046b58173
? ? ? ? hurt- ?https://blog.csdn.net/weixin_40907382/article/details/80480675
? ?hackerie??https://blog.csdn.net/hackerie/article/details/79077634
總結
- 上一篇: 重磅预售 | 分子生物学与遗传学经典名著
- 下一篇: YUM更换源(1)--yum找不到安装包