Python爬蟲面試題

1, 你用過的爬蟲框架或者模塊有哪些馆匿?談?wù)勊麄兊膮^(qū)別或者優(yōu)缺點渐北?

Python自帶:urllib赃蛛,urllib2

第 三 方:requests

框? ? 架:Scrapy

urllib和urllib2模塊都做與請求URL相關(guān)的操作呕臂,但他們提供不同的功能歧蒋。

urllib2.:urllib2.urlopen可以接受一個Request對象或者url谜洽,(在接受Request對象時候褥琐,并以此可以來設(shè)置一個URL 的headers),urllib.urlopen只接收一個url

urllib 有urlencode,urllib2沒有磕洪,因此總是urllib析显,urllib2常會一起使用的原因

scrapy是封裝起來的框架谷异,他包含了下載器,解析器箩绍,日志及異常處理材蛛,基于多線程卑吭, twisted的方式處理豆赏,對于固定單個網(wǎng)站的爬取開發(fā)河绽,有優(yōu)勢纹笼,但是對于多網(wǎng)站爬取 100個網(wǎng)站,并發(fā)及分布式處理方面蔓涧,不夠靈活,不便調(diào)整與括展兄猩。

request 是一個HTTP庫鸠姨, 它只是用來讶迁,進(jìn)行請求核蘸,對于HTTP請求巍糯,他是一個強大的庫啸驯,下載,解析全部自己處理祟峦,靈活性更高坯汤,高并發(fā)與分布式部署也非常靈活,對于功能可以更好實現(xiàn).

2搀愧,scrapy和scrapy-redis的區(qū)別惰聂?

?scrapy是一個爬蟲通用框架,但不支持分布式咱筛,scrapy-redis是為了更方便的實現(xiàn)scrapy分布式爬蟲搓幌,而提供了一些以redis為基礎(chǔ)的組件

為什么會選擇redis數(shù)據(jù)庫拐揭?

? ? 因為redis支持主從同步龄砰,而且數(shù)據(jù)都是緩存在內(nèi)存中娘汞,所以基于redis的分布式爬蟲风秤,對請求和數(shù)據(jù)的高頻讀取效率非常高

什么是主從同步狸捅?

在Redis中,用戶可以通過執(zhí)行SLAVEOF命令或者設(shè)置slaveof選項,讓一個服務(wù)器去復(fù)制(replicate)另一個服務(wù)器嗤堰,我們稱呼被復(fù)制的服務(wù)器為主服務(wù)器(master)后专,而對主服務(wù)器進(jìn)行復(fù)制的服務(wù)器則被稱為從服務(wù)器(slave),當(dāng)客戶端向從服務(wù)器發(fā)送SLAVEOF命令,要求從服務(wù)器復(fù)制主服務(wù)器時,從服務(wù)器首先需要執(zhí)行同步操作,也即是,將從服務(wù)器的數(shù)據(jù)庫狀態(tài)更新至主服務(wù)器當(dāng)前所處的數(shù)據(jù)庫狀態(tài)

3,scrapy的優(yōu)缺點叁扫?為什么要選擇scrapy框架兔综?

優(yōu)點:采取可讀性更強的xpath代替正則

強大的統(tǒng)計和log系統(tǒng)?

同時在不同的url上爬行?

支持shell方式,方便獨立調(diào)試?

寫middleware,方便寫一些統(tǒng)一的過濾器?

通過管道的方式存入數(shù)據(jù)庫

缺點:基于python爬蟲框架固该,擴展性比較差每瞒,基于twisted框架,運行中exception是不會干掉reactor,并且異步框架出錯后是不會停掉其他任務(wù)的,數(shù)據(jù)出錯后難以察覺

4汇在,scrapy和requests的使用情況阿蝶?

requests 是 polling 方式的,會被網(wǎng)絡(luò)阻塞,不適合爬取大量數(shù)據(jù)

scapy 底層是異步框架 twisted ,并發(fā)是最大優(yōu)勢

5悄蕾,描述一下scrapy框架的運行機制?

從start_urls里面獲取第一批url發(fā)送請求,請求由請求引擎給調(diào)度器入請求對列宵晚,獲取完畢后津滞,調(diào)度器將請求對列交給下載器去獲取請求對應(yīng)的響應(yīng)資源咪鲜,并將響應(yīng)交給自己編寫的解析方法做提取處理享郊,如果提取出需要的數(shù)據(jù),則交給管道處理鸠踪,如果提取出url,則繼續(xù)執(zhí)行之前的步驟惨缆,直到多列里沒有請求糜值,程序結(jié)束。

6坯墨,寫爬蟲使用多進(jìn)程好寂汇,還是用多線程好?

IO密集型代碼(文件處理捣染、網(wǎng)絡(luò)爬蟲等)健无,多線程能夠有效提升效率(單線程下有IO操作會進(jìn)行IO等待,造成不必要的時間浪費液斜,而開啟多線程能在線程A等待時累贤,自動切換到線程B,可以不浪費CPU的資源少漆,從而能提升程序執(zhí)行效率)臼膏。在實際的數(shù)據(jù)采集過程中,既考慮網(wǎng)速和響應(yīng)的問題示损,也需要考慮自身機器的硬件情況渗磅,來設(shè)置多進(jìn)程或多線程

7,常見的反爬蟲和應(yīng)對方法检访?

? ??1. 基于用戶行為始鱼,同一個ip段時間多次訪問同一頁面

????????利用代理ip,構(gòu)建ip池

????2. 請求頭里的user-agent

????????構(gòu)建user-agent池(操作系統(tǒng)脆贵、瀏覽器不同医清,模擬不同用戶)

????3. 動態(tài)加載(抓到的數(shù)據(jù)和瀏覽器顯示的不一樣),js渲染

????模擬ajax請求卖氨,返回json形式的數(shù)據(jù)

? ? 4会烙,selenium / webdriver 模擬瀏覽器加載

? ? 5,對抓到的數(shù)據(jù)進(jìn)行分析

? ? 6筒捺,加密參數(shù)字段

?????會話跟蹤【cookie】

????? 防盜鏈設(shè)置【Referer

8柏腻,分布式爬蟲主要解決什么問題?

????????面對海量待抓取網(wǎng)頁系吭,只有采用分布式架構(gòu)五嫂,才有可能在較短時間內(nèi)完成一輪抓取工作。

? ? ? ? 它的開發(fā)效率是比較快而且簡單的肯尺。

9沃缘,爬取時彈出對話框讓驗證,又該怎么處理蟆盹?

? ??HTTP請求的basic認(rèn)證

客戶端將輸入的用戶名密碼用Base64進(jìn)行編碼后孩灯,采用非加密的明文方式傳送給服務(wù)器。

Authorization: Basic xxxxxxxxxx.

10逾滥,你在爬蟲過程中峰档,都是怎么解決反爬的,爬取多少數(shù)據(jù)寨昙,用了多長時間讥巡?

11,爬取這些數(shù)據(jù)都用來做什么的舔哪?怎么交付給公司欢顷?客戶是誰?爬取數(shù)據(jù)的影響因素捉蚤?

? ? 當(dāng)時我們公司核心業(yè)務(wù)是網(wǎng)站開發(fā)抬驴,還有數(shù)據(jù)的采集炼七,會經(jīng)常需要一些數(shù)據(jù),采集的數(shù)據(jù)一?是為了滿足公司需求布持,二是我們有合作的公司豌拙,負(fù)責(zé)給他們提供他們所需要的數(shù)據(jù),(根據(jù)客戶需求做好?相應(yīng)格式的數(shù)據(jù)文件题暖,交付給項目組長)(數(shù)據(jù)庫導(dǎo)出)

? ? 影響因素:機器的性能及帶寬按傅,代碼質(zhì)量,爬取時的反爬機制

12胧卤,什么是爬蟲唯绍,為什么要用爬蟲?

????用于在網(wǎng)絡(luò)上采集數(shù)據(jù)的程序,可以用任何語言開發(fā)枝誊,python更加方便快捷高效一些况芒。

????爬蟲的目的:采集一些需要的數(shù)據(jù)。

? ? 為什么python更適合寫爬蟲程序侧啼?python中封裝了很多爬蟲庫牛柒,如urllib ,re,bs,scrapy等,開發(fā)效率更高

13痊乾,爬蟲的基本流程皮壁?

? ? ? ? 1,瀏覽器發(fā)起請求哪审,可能包含請求頭等信息蛾魄,等待服務(wù)器相應(yīng)

? ? ? ? ?2,獲取服務(wù)器響應(yīng)內(nèi)容湿滓,可能是網(wǎng)頁文本(html滴须、json代碼),圖片二進(jìn)制叽奥、視頻二進(jìn)制等

? ? ? ? 3扔水,解析內(nèi)容(正則、xpath朝氓、json解析等 )

? ? ? ? 4魔市, 保存數(shù)據(jù)(本地文件、數(shù)據(jù)庫等)

14赵哲,如何提高爬取效率待德?

? ??????爬蟲下載慢主要原因是阻塞等待發(fā)往網(wǎng)站的請求和網(wǎng)站返回

? ? ? ? 1,采用異步與多線程枫夺,擴大電腦的cpu利用率将宪;

? ? ? ? 2,采用消息隊列模式

? ? ? ? 3,提高帶寬

15较坛,request請求方式中的post印蔗、get有什么區(qū)別

? ???GET一般用于獲取/查詢資源信息,而POST一般用于更新資源信息

????get是在url中傳遞數(shù)據(jù)燎潮,數(shù)據(jù)放在請求頭中喻鳄,post是在請求體中傳遞數(shù)據(jù)

????get安全性非常低,post安全性較高确封,但是get執(zhí)行效率卻比Post方法好

16,模擬登陸原理再菊?

? ??因為http請求是無狀態(tài)的爪喘,網(wǎng)站為了識別用戶身份,需要通過cookie記錄用戶信息(用戶纠拔、密碼)秉剑,這些信息都會在手動登陸時記錄在post請求的form-data里,那么在爬蟲時候只需要將這些信息添加到請求頭里即可稠诲。

17侦鹏,分布式原理?

多臺機器多個spider 對多個 url 同時進(jìn)行處理

分布式如何判斷爬蟲已經(jīng)停止了臀叙?

18略水,下載器中間件(Downloader Middlewares)

位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應(yīng)劝萤。

爬蟲中間件(Spider Middlewares)介于Scrapy引擎和爬蟲之間的框架渊涝,主要工作是處理蜘蛛的響應(yīng)輸入和請求輸出。

調(diào)度中間件(Scheduler Middewares)介于Scrapy引擎和調(diào)度之間的中間件床嫌,從Scrapy引擎發(fā)送到調(diào)度的請求和響應(yīng)

19跨释,爬蟲協(xié)議?

Robots協(xié)議(也稱為爬蟲協(xié)議厌处、爬蟲規(guī)則鳖谈、機器人協(xié)議等)也就是robots.txt,網(wǎng)站通過robots協(xié)議告訴搜索引擎哪些頁面可以抓取阔涉,哪些頁面不能抓取缆娃。

Robots協(xié)議是網(wǎng)站國際互聯(lián)網(wǎng)界通行的道德規(guī)范,其目的是保護(hù)網(wǎng)站數(shù)據(jù)和敏感信息洒敏、確保用戶個人信息和隱私不被侵犯龄恋。因其不是命令,故需要搜索引擎自覺遵守凶伙。

20郭毕,爬蟲的底層原理?

21函荣,scrapy中間件有幾種類显押,你用過那些中間件扳肛?

? ??????scrapy的中間件理論上有三種(Schduler Middleware,Spider Middleware,Downloader Middleware)

DownloaderMiddleware主要處理請求Request發(fā)出去和結(jié)果Response返回的一些回調(diào),

比如說你要加UserAgent乘碑,使用代理挖息,修改refferer(防盜鏈),添加cookie兽肤,或者請求異常超時處理啥的

? ? ? ? 常用:?1.爬蟲中間件Spider Middleware

? ? ? ? ?主要功能是在爬蟲運行過程中進(jìn)行一些處理.

  2.下載器中間件Downloader Middleware

? ? ? ? ?主要功能在請求到網(wǎng)頁后,頁面被下載時進(jìn)行一些處理.

22套腹,代理問題

1.為什么會用到代理

將真是IP隱藏起來(請求過于太頻繁的話,ip可能會被禁止)

2.代理怎么使用(具體代碼资铡,請求在什么時候添加的代理)

proxy_handler = ProxyHandler({'http': 'http://183.159.89.204:18118'})

# 構(gòu)建一個Opener對象

proxy_opener = build_opener(proxy_handler)

# 使用自定義opener訪問服務(wù)器數(shù)據(jù)电禀,得到相應(yīng)

response = proxy_opener.open(request)

3.代理失效了怎么處理

23,驗證碼處理

1.登陸驗證碼處理

2.爬取速度過快出現(xiàn)的驗證碼處理

3.如何用機器識別驗證碼

24笤休,模擬登陸問題

1.模擬登陸流程

因為http請求是無狀態(tài)的尖飞,網(wǎng)站為了識別用戶身份,需要通過cookie記錄用戶信息(用戶店雅、密碼)政基,這些信息都會在手動登陸時記錄在post請求的form-data里,那么在爬蟲時候只需要將這些信息添加到請求頭里即可

2.cookie如何處理

同上

3.如何處理網(wǎng)站傳參加密的情況

對抓包數(shù)據(jù)進(jìn)行分析闹啦,這要?在具體的項目中去說明

25沮明,數(shù)據(jù)存儲和數(shù)據(jù)庫問題

1.關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫的區(qū)別

????????????????1.關(guān)系型數(shù)據(jù)庫通過外鍵關(guān)聯(lián)來建立表與表之間的關(guān)系,

????????????????2.非關(guān)系型數(shù)據(jù)庫通常指數(shù)據(jù)以對象的形式存儲在數(shù)據(jù)庫中亥揖,而對象之間的關(guān)系通過每個對象自身的屬性來決定

2.爬下來數(shù)據(jù)你會選擇什么存儲方式珊擂,為什么

3.各種數(shù)據(jù)庫支持的數(shù)據(jù)類型,和特點费变,比如:redis如何實現(xiàn)持久化摧扇,mongodb

是否支持事物等。挚歧。

26扛稽,協(xié)議問題

# 爬蟲從網(wǎng)頁上拿數(shù)據(jù)肯定需要模擬網(wǎng)絡(luò)通信的協(xié)議

1.http協(xié)議,請求由什么組成滑负,每個字段分別有什么用,https和http有什么差距

2.證書問題

3.TCP,UDP各種相關(guān)問題

27在张,數(shù)據(jù)提取問題

1.主要使用什么樣的結(jié)構(gòu)化數(shù)據(jù)提取方式

? ? xpath? 正則? bs4等

2.動態(tài)加載的數(shù)據(jù)如何提取

模擬ajax請求,返回json形式的數(shù)據(jù)

3.json數(shù)據(jù)如何提取

? ??python中內(nèi)置了json模塊,提供了dumps矮慕、dump帮匾、loads、load痴鳄,用于字符串 和 python數(shù)據(jù)類型間進(jìn)行轉(zhuǎn)換瘟斜。然后再對數(shù)據(jù)用遞歸,正則,或者一層一層獲取的方法得到數(shù)據(jù)

28螺句,redis數(shù)據(jù)庫有哪幾種數(shù)據(jù)結(jié)構(gòu)虽惭?

5種數(shù)據(jù)結(jié)構(gòu):

? ?String字符串

List列表

Set集合

Hash散列

Zset有序集合

29,使用redis搭建分布式系統(tǒng)時如何處理網(wǎng)絡(luò)延遲和網(wǎng)絡(luò)異常蛇尚?

由于網(wǎng)絡(luò)異常的存在芽唇,分布式系統(tǒng)中請求結(jié)果存在“三態(tài)”的概念,即三種狀態(tài):“成功”取劫、“失敗”匆笤、“超時(未知)”

當(dāng)出現(xiàn)“超時”時可以通過發(fā)起讀取數(shù)據(jù)的操作以驗證 RPC 是否成功(例如銀行系統(tǒng)的做法)

另一種簡單的做法是,設(shè)計分布式協(xié)議時將執(zhí)行步驟設(shè)計為可重試的谱邪,即具有所謂的“冪等性”

也可設(shè)置一個超時時間疚膊,如果超過該時間,可以try出去虾标。

30,如果對方網(wǎng)站反爬取灌砖,封IP了怎么辦璧函?

1,放慢抓取熟速度基显,減小對目標(biāo)網(wǎng)站造成的壓力蘸吓,但是這樣會減少單位時間內(nèi)的數(shù)據(jù)抓取量

2,使用代理IP(免費的可能不穩(wěn)定撩幽,收費的可能不劃算)

31库继,爬蟲過程中驗證碼怎么處理?

32窜醉,關(guān)于防盜鏈宪萄?

部分服務(wù)器會檢查 http 請求頭的?Referer?字段來判斷你是否是從指定頁面跳轉(zhuǎn)而來的,以達(dá)到防盜鏈的作用榨惰。因此在偽裝請求頭部的時候拜英,該字段也是不容忽視的。

last:爬蟲中遇到的錯誤琅催,是怎么解決的居凶?

1,獲取json數(shù)據(jù)之后藤抡,把Json格式字符串解碼轉(zhuǎn)換成Python對象時侠碧,在json.loads的時候出錯?

要注意被解碼的Json字符的編碼缠黍,如果傳入的字符串的編碼不是UTF-8的話弄兜,需要指定字符編碼的參數(shù)encoding

2,使用urllib2時,經(jīng)常遇到編碼問題

3挨队,有時會遇到503錯誤

主要是指服務(wù)器判斷出你是爬蟲程序谷暮,所以需要改變一下請求頭,設(shè)置一下時間的間隔

4盛垦,bs4庫解析時遇到的問題湿弦?

html 頁面的數(shù)據(jù)經(jīng)過Beautiful Soup庫的解析后,部分html源碼丟失腾夯,找不到想要的數(shù)據(jù)了

查看官方文檔颊埃,bs 庫支持的解析庫有 lxml, html5lib 和 html.parser。用的最多的是 lxml蝶俱,因為它的解析速度快班利,并且容錯能力強,默認(rèn)也是使用該解析器榨呆。

出現(xiàn)解析后源碼丟失的可能原因有 2 個:

BeautifulSoup 有時候會遇到非法的罗标,不支持的 html 源碼而導(dǎo)致無法解析或無法正常解析 html;

處理的文檔太大积蜻,而處理的解析器緩存不夠造成的信息丟失闯割。

這里換一個解析器,換成html.parser就可以了竿拆。


鏈接:http://www.reibang.com/p/db9046b58173

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宙拉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子丙笋,更是在濱河造成了極大的恐慌谢澈,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件御板,死亡現(xiàn)場離奇詭異锥忿,居然都是意外死亡,警方通過查閱死者的電腦和手機稳吮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門缎谷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灶似,你說我怎么就攤上這事列林。” “怎么了酪惭?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵希痴,是天一觀的道長。 經(jīng)常有香客問我春感,道長砌创,這世上最難降的妖魔是什么虏缸? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮嫩实,結(jié)果婚禮上刽辙,老公的妹妹穿的比我還像新娘。我一直安慰自己甲献,他們只是感情好宰缤,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晃洒,像睡著了一般慨灭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上球及,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天氧骤,我揣著相機與錄音,去河邊找鬼吃引。 笑死筹陵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镊尺。 我是一名探鬼主播惶翻,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鹅心!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纺荧,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤旭愧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宙暇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體输枯,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年占贫,在試婚紗的時候發(fā)現(xiàn)自己被綠了桃熄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡型奥,死狀恐怖瞳收,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厢汹,我是刑警寧澤螟深,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站烫葬,受9級特大地震影響界弧,放射性物質(zhì)發(fā)生泄漏凡蜻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一垢箕、第九天 我趴在偏房一處隱蔽的房頂上張望划栓。 院中可真熱鬧,春花似錦条获、人聲如沸忠荞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钻洒。三九已至,卻和暖如春锄开,著一層夾襖步出監(jiān)牢的瞬間素标,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工萍悴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留头遭,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓癣诱,卻偏偏與公主長得像计维,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子撕予,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容