今天給大家出一個關(guān)于Python爬蟲面試題的總結(jié),相對于來說出現(xiàn)頻率比較高的一些!
1. 為什么 requests 請求需要帶上 header?
原因是:模擬瀏覽器,欺騙服務(wù)器,獲取和瀏覽器一致的內(nèi)容
header 的形式:字典
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
用法: requests.get(url,headers=headers)
2. 談一談你對 Selenium 和 PhantomJS 了解
Selenium 是一個Web 的自動化測試工具,可以根據(jù)我們的指令,讓瀏覽器自動加載頁面,獲取需要的數(shù)據(jù),甚至頁面截屏,或者判斷網(wǎng)站上某些動作是否發(fā)生。Selenium 自己不帶瀏覽器,不支持瀏覽器的功能,它需要與第三方瀏覽器結(jié)合在一起才能使用。但是我們有時候需要讓它內(nèi)嵌在代碼中運行,所以我們可以用一個叫 PhantomJS 的工具代替真實的瀏覽器。Selenium庫里有個叫 WebDriver 的API。WebDriver 有點兒像可以加載網(wǎng)站的瀏覽器,但是它也可以像BeautifulSoup 或者其他Selector 對象一樣用來查找頁面元素,與頁面上的元素進(jìn)行交互 (發(fā)送文本、點擊等),以及執(zhí)行其他動作來運行網(wǎng)絡(luò)爬蟲。
PhantomJS是一個基于 Webkit 的“無界面”(headless)瀏覽器,它會把網(wǎng)站加載到內(nèi)存并執(zhí)行頁面上的 JavaScript,因為不會展示圖形界面,所以運行起來比完整的瀏覽器要高效。相比傳統(tǒng)的Chrome或 Firefox 瀏覽器等,資源消耗會更少。
如果我們把 Selenium 和 PhantomJS 結(jié)合在一起,就可以運行一個非常強大的網(wǎng)絡(luò)爬蟲了,這個爬蟲可以處理 JavaScrip、Cookie、headers,以及任何我們真實用戶需要做的事情。主程序退出后,selenium 不保證 phantomJS 也成功退出,最好手動關(guān)閉 phantomJS 進(jìn)程。(有可能會導(dǎo)致多個 phantomJS 進(jìn)程運行,占用內(nèi)存)。WebDriverWait 雖然可能會減少延時,但是目前存在 bug(各種報錯),這種情況可以采用 sleep。phantomJS爬數(shù)據(jù)比較慢,可以選擇多線程。如果運行的時候發(fā)現(xiàn)有的可以運行,有的不能,可以嘗試將 phantomJS 改成 Chrome。
3. 寫一個郵箱地址的正則表達(dá)式?
[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$
4. 你遇到的反爬蟲策略有哪些?及應(yīng)對策略有什么?
通過headers反爬蟲
基于用戶行為的發(fā)爬蟲:例如同一IP短時間內(nèi)多次訪問同一頁面,或者同一賬戶短時間內(nèi)多次進(jìn)行相同操作
動態(tài)網(wǎng)頁反爬蟲,例如:我們需要爬取的數(shù)據(jù)是通過ajax請求得到,或者通過JavaScript生成的
對部分?jǐn)?shù)據(jù)進(jìn)行加密處理的,例如:我們要抓的數(shù)據(jù)部分能夠抓到,另外的部分加密處理了,是亂碼
應(yīng)對策略:
對于基本網(wǎng)頁的抓取可以自定義headers,添加headers的數(shù)據(jù),代理來解決
有些網(wǎng)站的數(shù)據(jù)抓取必須進(jìn)行模擬登陸才能抓取到完整的數(shù)據(jù),所以要進(jìn)行模擬登陸。
對于限制抓取頻率的,可以設(shè)置抓取的頻率降低一些,
對于限制ip抓取的可以使用多個代理ip進(jìn)行抓取,輪詢使用代理
針對動態(tài)網(wǎng)頁的可以使用selenium+phantomjs進(jìn)行抓取,但是比較慢,所以也可以使用查找接口的方式進(jìn)行抓取。
對部分?jǐn)?shù)據(jù)進(jìn)行加密的,可以使用selenium進(jìn)行截圖,飯后使用python自帶的 pytesseract庫進(jìn)行識別,但是比較慢最直接的方法是找到加密的方法進(jìn)行逆向推理。
5. 分布式爬蟲原理?
scrapy-redis實現(xiàn)分布式,其實從原理上來說很簡單,這里為描述方便,我們把自己的核心服務(wù)器稱為 master,而把用于跑爬蟲程序的機器稱為 slave。
我們知道,采用 scrapy 框架抓取網(wǎng)頁,我們需要首先給定它一些 start_urls,爬蟲首先訪問 start_urls里面的 url,再根據(jù)我們的具體邏輯,對里面的元素、或者是其他的二級、三級頁面進(jìn)行抓取。而要實現(xiàn)分布式,我們只需要在這個 starts_urls 里面做文章就行了。
我們在 master 上搭建一個 redis 數(shù)據(jù)庫(注意這個數(shù)據(jù)庫只用作 url 的存儲,不關(guān)心爬取的具體數(shù)據(jù),不要和后面的 mongodb 或者 mysql 混淆),并對每一個需要爬取的網(wǎng)站類型,都開辟一個單獨的列表字段。通過設(shè)置 slave 上 scrapy-redis 獲取 url 的地址為 master 地址。這樣的結(jié)果就是,盡管有多個 slave,然而大家獲取 url 的地方只有一個,那就是服務(wù)器 master 上的 redis 數(shù)據(jù)庫。并且,由于 scrapy-redis 自身的隊列機制,slave 獲取的鏈接不會相互沖突。這樣各個 slave 在完成抓取任務(wù)之后,再把獲取的結(jié)果匯總到服務(wù)器上(這時的數(shù)據(jù)存儲不再在是 redis,而是 mongodb 或者mysql等存放具體內(nèi)容的數(shù)據(jù)庫了)這種方法的還有好處就是程序移植性強,只要處理好路徑問題,把 slave 上的程序移植到另一臺機器上運行,基本上就是復(fù)制粘貼的事情。
6. pythoon2.x 中urllib和urllib2的區(qū)別?
異同:都是做url請求的操作的,但是區(qū)別很明顯。
urllib2可以接受一個Request類的實例來設(shè)置URL請求的headers,urllib僅可以接受URL。這意味著,你不可以通過urllib模塊偽裝你的User Agent字符串等(偽裝瀏覽器)。
urllib提供urlencode方法用來GET查詢字符串的產(chǎn)生,而urllib2沒有。這是為何urllib常和urllib2一起使用的原因。
模塊比較優(yōu)勢的地方是urlliburllib2.urlopen可以接受Request對象作為參數(shù),從而可以控制HTTP Request的header部。
但是urllib.urlretrieve函數(shù)以及urllib.quote等一系列quote和unquote功能沒有被加入urllib2中,因此有時也需要urllib的輔助。
7.robots協(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ù)和敏感信息、確保用戶個人信息和隱私不被侵犯。因其不是命令,故需要搜索引擎自覺遵守。
8.什么是爬蟲?
爬蟲是請求網(wǎng)站并提取數(shù)據(jù)的自動化程序
9.爬蟲的基本流程?
1、通過http庫向目標(biāo)站點發(fā)起請求,即發(fā)送一個Request,請求可以包含額外的headers等信息,等待服務(wù)器響應(yīng)
2、如果服務(wù)器能正常響應(yīng),會得到一個Response,Response的內(nèi)容比啊是索要獲取的頁面內(nèi)容
3、解析內(nèi)容:正則表達(dá)式、頁面解析庫、json
4、保存數(shù)據(jù):文本或者存入數(shù)據(jù)庫
10.什么是Request和Response?
本地 向 服務(wù)器 發(fā)送Request,服務(wù)器根據(jù)請求返回一個Response,頁面就顯示在頁面上了
1、瀏覽器就發(fā)送消息給該網(wǎng)址所在的服務(wù)器,這個過程叫做Http Request
2、服務(wù)器收到瀏覽器發(fā)送的消息后,能夠根據(jù)瀏覽器發(fā)送消息的內(nèi)容,做相應(yīng)處
理,然后把消息回傳給瀏覽器,這個過程叫做HTTP Response
3、瀏覽器收到服務(wù)器的Response消息后,會對信息進(jìn)行相應(yīng)處理,然后顯示
下期會繼續(xù)為大家更新更多關(guān)于Python爬蟲的面試題總結(jié)!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
