Python面试题大全(三):Web开发(Flask、爬虫)
目錄
Web
Flask
140.對Flask藍圖(Blueprint)的理解?
141.Flask 和 Django 路由映射的區別?
Django
142.什么是wsgi,uwsgi,uWSGI?
143.Django、Flask、Tornado的對比?
144.CORS 和 CSRF的區別?
145.Session,Cookie,JWT的理解
146.簡述Django請求生命周期
147.用的restframework完成api發送時間時區
148.nginx,tomcat,apach到都是什么?
149.請給出你熟悉關系數據庫范式有哪些,有什么作用?
150.簡述QQ登陸過程
151.post 和 get的區別?
152.項目中日志的作用
153.django中間件的使用?
154.談一下你對uWSGI和nginx的理解?
155.Python中三大框架各自的應用場景?
156.Django中哪里用到了線程?哪里用到了協程?哪里用到了進程?
157.有用過Django REST framework嗎?
爬蟲
159.試列出至少三種目前流行的大型數據庫
160.列舉您使用過的Python網絡爬蟲所用到的網絡數據包?
161.爬取數據后使用哪個數據庫存儲數據的,為什么?
162.你用過的爬蟲框架或者模塊有哪些?優缺點?
163.寫爬蟲是用多進程好?還是多線程好?
164.常見的反爬蟲和應對方法?
165.解析網頁的解析器使用最多的是哪幾個?
167.驗證碼的解決?
168.使用最多的數據庫,對他們的理解?
169.編寫過哪些爬蟲中間件?
170.“極驗”滑動驗證碼如何破解?
171.爬蟲多久爬一次,爬下來的數據是怎么存儲?
173.動態加載又對及時性要求很高怎么處理?
174.HTTPS有什么優點和缺點?
175.HTTPS是如何實現安全傳輸數據的?
176.TTL,MSL,RTT各是什么?
177.談一談你對Selenium和PhantomJS了解
178.平常怎么使用代理的 ?
179.存放在數據庫(redis、mysql等)。
180.怎么監控爬蟲的狀態?
181.描述下scrapy框架運行的機制?
182.談談你對Scrapy的理解?
183.怎么樣讓 scrapy 框架發送一個 post 請求(具體寫出來)
184.怎么監控爬蟲的狀態 ?
185.怎么判斷網站是否更新?
186.圖片、視頻爬取怎么繞過防盜連接
187.你爬出來的數據量大概有多大?大概多長時間爬一次?
188.用什么數據庫存爬下來的數據?部署是你做的嗎?怎么部署?
189.增量爬取
190.爬取下來的數據如何去重,說一下scrapy的具體的算法依據。
191.Scrapy的優缺點?
192.怎么設置爬取深度?
193.scrapy和scrapy-redis有什么區別?為什么選擇redis數據庫?
194.分布式爬蟲主要解決什么問題?
195.什么是分布式存儲?
196.你所知道的分布式爬蟲方案有哪些?
197.scrapy-redis,有做過其他的分布式爬蟲嗎?
Web
Flask
140.對Flask藍圖(Blueprint)的理解?
藍圖的定義
藍圖 /Blueprint 是Flask應用程序組件化的方法,可以在一個應用內或跨越多個項目共用藍圖。使用藍圖可以極大簡化大型應用的開發難度,也為Flask擴展提供了一種在應用中注冊服務的集中式機制。
藍圖的應用場景:
把一個應用分解為一個藍圖的集合。這對大型應用是理想的。一個項目可以實例化一個應用對象,初始化幾個擴展,并注冊一集合的藍圖。
以URL前綴和/或子域名,在應用上注冊一個藍圖。URL前綴/子域名中的參數即成為這個藍圖下的所有視圖函數的共同的視圖參數(默認情況下) 在一個應用中用不同的URL規則多次注冊一個藍圖。
通過藍圖提供模板過濾器、靜態文件、模板和其他功能。一個藍圖不一定要實現應用或視圖函數。
初始化一個Flask擴展時,在這些情況中注冊一個藍圖。
藍圖的缺點:
不能在應用創建后撤銷注冊一個藍圖而不銷毀整個應用對象。
使用藍圖的三個步驟
1.創建一個藍圖對象
blue = Blueprint("blue",__name__)2.在這個藍圖對象上進行操作,例如注冊路由、指定靜態文件夾、注冊模板過濾器...
@blue.route('/') def blue_index():return "Welcome to my blueprint"3.在應用對象上注冊這個藍圖對象
app.register_blueprint(blue,url_prefix="/blue")141.Flask 和 Django 路由映射的區別?
在django中,路由是瀏覽器訪問服務器時,先訪問的項目中的url,再由項目中的url找到應用中url,這些url是放在一個列表里,遵從從前往后匹配的規則。在flask中,路由是通過裝飾器給每個視圖函數提供的,而且根據請求方式的不同可以一個url用于不同的作用。
Django
142.什么是wsgi,uwsgi,uWSGI?
WSGI:
web服務器網關接口,是一套協議。用于接收用戶請求并將請求進行初次封裝,然后將請求交給web框架。
實現wsgi協議的模塊:wsgiref,本質上就是編寫一socket服務端,用于接收用戶請求(django)
werkzeug,本質上就是編寫一個socket服務端,用于接收用戶請求(flask)
uwsgi:
與WSGI一樣是一種通信協議,它是uWSGI服務器的獨占協議,用于定義傳輸信息的類型。 uWSGI:
是一個web服務器,實現了WSGI的協議,uWSGI協議,http協議
143.Django、Flask、Tornado的對比?
1、 Django走的大而全的方向,開發效率高。它的MTV框架,自帶的ORM,admin后臺管理,自帶的sqlite數據庫和開發測試用的服務器,給開發者提高了超高的開發效率。 重量級web框架,功能齊全,提供一站式解決的思路,能讓開發者不用在選擇上花費大量時間。
自帶ORM和模板引擎,支持jinja等非官方模板引擎。
自帶ORM使Django和關系型數據庫耦合度高,如果要使用非關系型數據庫,需要使用第三方庫
自帶數據庫管理app
成熟,穩定,開發效率高,相對于Flask,Django的整體封閉性比較好,適合做企業級網站的開發。python web框架的先驅,第三方庫豐富
2、 Flask 是輕量級的框架,自由,靈活,可擴展性強,核心基于Werkzeug WSGI工具 和jinja2 模板引擎
適用于做小網站以及web服務的API,開發大型網站無壓力,但架構需要自己設計
與關系型數據庫的結合不弱于Django,而與非關系型數據庫的結合遠遠優于Django
3、 Tornado走的是少而精的方向,性能優越,它最出名的異步非阻塞的設計方式
Tornado的兩大核心模塊:
iostraem:對非阻塞的socket進行簡單的封裝
ioloop: 對I/O 多路復用的封裝,它實現一個單例
144.CORS 和 CSRF的區別?
什么是CORS?
CORS是一個W3C標準,全稱是“跨域資源共享"(Cross-origin resoure sharing). 它允許瀏覽器向跨源服務器,發出XMLHttpRequest請求,從而客服了AJAX只能同源使用的限制。
什么是CSRF?
CSRF主流防御方式是在后端生成表單的時候生成一串隨機token,內置到表單里成為一個字段,同時,將此串token置入session中。每次表單提交到后端時都會檢查這兩個值是否一致,以此來判斷此次表單提交是否是可信的,提交過一次之后,如果這個頁面沒有生成CSRF token,那么token將會被清空,如果有新的需求,那么token會被更新。 攻擊者可以偽造POST表單提交,但是他沒有后端生成的內置于表單的token,session中沒有token都無濟于事。
145.Session,Cookie,JWT的理解
為什么要使用會話管理
眾所周知,HTTP協議是一個無狀態的協議,也就是說每個請求都是一個獨立的請求,請求與請求之間并無關系。但在實際的應用場景,這種方式并不能滿足我們的需求。舉個大家都喜歡用的例子,把商品加入購物車,單獨考慮這個請求,服務端并不知道這個商品是誰的,應該加入誰的購物車?因此這個請求的上下文環境實際上應該包含用戶的相關信息,在每次用戶發出請求時把這一小部分額外信息,也做為請求的一部分,這樣服務端就可以根據上下文中的信息,針對具體的用戶進行操作。所以這幾種技術的出現都是對HTTP協議的一個補充,使得我們可以用HTTP協議+狀態管理構建一個的面向用戶的WEB應用。
Session 和Cookie的區別
這里我想先談談session與cookies,因為這兩個技術是做為開發最為常見的。那么session與cookies的區別是什么?個人認為session與cookies最核心區別在于額外信息由誰來維護。利用cookies來實現會話管理時,用戶的相關信息或者其他我們想要保持在每個請求中的信息,都是放在cookies中,而cookies是由客戶端來保存,每當客戶端發出新請求時,就會稍帶上cookies,服務端會根據其中的信息進行操作。 當利用session來進行會話管理時,客戶端實際上只存了一個由服務端發送的session_id,而由這個session_id,可以在服務端還原出所需要的所有狀態信息,從這里可以看出這部分信息是由服務端來維護的。
除此以外,session與cookies都有一些自己的缺點:
cookies的安全性不好,攻擊者可以通過獲取本地cookies進行欺騙或者利用cookies進行CSRF攻擊。使用cookies時,在多個域名下,會存在跨域問題。 session 在一定的時間里,需要存放在服務端,因此當擁有大量用戶時,也會大幅度降低服務端的性能,當有多臺機器時,如何共享session也會是一個問題.(redis集群)也就是說,用戶第一個訪問的時候是服務器A,而第二個請求被轉發給了服務器B,那服務器B如何得知其狀態。實際上,session與cookies是有聯系的,比如我們可以把session_id存放在cookies中的。
JWT是如何工作的
首先用戶發出登錄請求,服務端根據用戶的登錄請求進行匹配,如果匹配成功,將相關的信息放入payload中,利用算法,加上服務端的密鑰生成token,這里需要注意的是secret_key很重要,如果這個泄露的話,客戶端就可以隨機篡改發送的額外信息,它是信息完整性的保證。生成token后服務端將其返回給客戶端,客戶端可以在下次請求時,將token一起交給服務端,一般是說我們可以將其放在Authorization首部中,這樣也就可以避免跨域問題。
146.簡述Django請求生命周期
一般是用戶通過瀏覽器向我們的服務器發起一個請求(request),這個請求會去訪問視圖函數,如果不涉及到數據調用,那么這個時候視圖函數返回一個模板也就是一個網頁給用戶) 視圖函數調用模型毛模型去數據庫查找數據,然后逐級返回,視圖函數把返回的數據填充到模板中空格中,最后返回網頁給用戶。
1.wsgi ,請求封裝后交給web框架(Flask,Django)
2.中間件,對請求進行校驗或在請求對象中添加其他相關數據,例如:csrf,request.session
3.路由匹配 根據瀏覽器發送的不同url去匹配不同的視圖函數
4.視圖函數,在視圖函數中進行業務邏輯的處理,可能涉及到:orm,templates
5.中間件,對響應的數據進行處理
6.wsgi,將響應的內容發送給瀏覽器
147.用的restframework完成api發送時間時區
當前的問題是用django的rest framework模塊做一個get請求的發送時間以及時區信息的api
class getCurrenttime(APIView):def get(self,request):local_time = time.localtime()time_zone =settings.TIME_ZONEtemp = {'localtime':local_time,'timezone':time_zone}return Response(temp)148.nginx,tomcat,apach到都是什么?
Nginx(engine x)是一個高性能的HTTP和反向代理服務器,也是 一個IMAP/POP3/SMTP服務器,工作在OSI七層,負載的實現方式:輪詢,IP_HASH,fair,session_sticky. Apache HTTP Server是一個模塊化的服務器,源于NCSAhttpd服務器 Tomcat 服務器是一個免費的開放源代碼的Web應用服務器,屬于輕量級應用服務器,是開發和調試JSP程序的首選。
149.請給出你熟悉關系數據庫范式有哪些,有什么作用?
在進行數據庫的設計時,所遵循的一些規范,只要按照設計規范進行設計,就能設計出沒有數據冗余和數據維護異常的數據庫結構。
數據庫的設計的規范有很多,通常來說我們在設是數據庫時只要達到其中一些規范就可以了,這些規范又稱之為數據庫的三范式,一共有三條,也存在著其他范式,我們只要做到滿足前三個范式的要求,就能設陳出符合我們的數據庫了,我們也不能全部來按照范式的要求來做,還要考慮實際的業務使用情況,所以有時候也需要做一些違反范式的要求。 1.數據庫設計的第一范式(最基本),基本上所有數據庫的范式都是符合第一范式的,符合第一范式的表具有以下幾個特點:
數據庫表中的所有字段都只具有單一屬性,單一屬性的列是由基本的數據類型(整型,浮點型,字符型等)所構成的設計出來的表都是簡單的二比表
2.數據庫設計的第二范式(是在第一范式的基礎上設計的),要求一個表中只具有一個業務主鍵,也就是說符合第二范式的表中不能存在非主鍵列對只對部分主鍵的依賴關系
3.數據庫設計的第三范式,指每一個非主屬性既不部分依賴與也不傳遞依賴于業務主鍵,也就是第二范式的基礎上消除了非主屬性對主鍵的傳遞依賴
150.簡述QQ登陸過程
qq登錄,在我們的項目中分為了三個接口,
第一個接口是請求qq服務器返回一個qq登錄的界面;
第二個接口是通過掃碼或賬號登陸進行驗證,qq服務器返回給瀏覽器一個code和state,利用這個code通過本地服務器去向qq服務器獲取access_token覆返回給本地服務器,憑借access_token再向qq服務器獲取用戶的openid(openid用戶的唯一標識)
第三個接口是判斷用戶是否是第一次qq登錄,如果不是的話直接登錄返回的jwt-token給用戶,對沒有綁定過本網站的用戶,對openid進行加密生成token進行綁定
151.post 和 get的區別?
1.GET是從服務器上獲取數據,POST是向服務器傳送數據
2.在客戶端,GET方式在通過URL提交數據,數據在URL中可以看到,POST方式,數據放置在HTML——HEADER內提交
3.對于GET方式,服務器端用Request.QueryString獲取變量的值,對于POST方式,服務器端用Request.Form獲取提交的數據
152.項目中日志的作用
一、日志相關概念
1.日志是一種可以追蹤某些軟件運行時所發生事件的方法
2.軟件開發人員可以向他們的代碼中調用日志記錄相關的方法來表明發生了某些事情
3.一個事件可以用一個包含可選變量數據的消息來描述
4.此外,事件也有重要性的概念,這個重要性也可以被成為嚴重性級別(level)
二、日志的作用
1.通過log的分析,可以方便用戶了解系統或軟件、應用的運行情況;
2.如果你的應用log足夠豐富,可以分析以往用戶的操作行為、類型喜好,地域分布或其他更多信息;
3.如果一個應用的log同時也分了多個級別,那么可以很輕易地分析得到該應用的健康狀況,及時發現問題并快速定位、解決問題,補救損失。
4.簡單來講就是我們通過記錄和分析日志可以了解一個系統或軟件程序運行情況是否正常,也可以在應用程序出現故障時快速定位問題。不僅在開發中,在運維中日志也很重要,日志的作用也可以簡單。總結為以下幾點:
1.程序調試
2.了解軟件程序運行情況,是否正常
3,軟件程序運行故障分析與問題定位
4,如果應用的日志信息足夠詳細和豐富,還可以用來做用戶行為分析
153.django中間件的使用?
Django在中間件中預置了六個方法,這六個方法的區別在于不同的階段執行,對輸入或輸出進行干預,方法如下:
1.初始化:無需任何參數,服務器響應第一個請求的時候調用一次,用于確定是否啟用當前中間件
def __init__():pass2.處理請求前:在每個請求上調用,返回None或HttpResponse對象。
def process_request(request):pass3.處理視圖前:在每個請求上調用,返回None或HttpResponse對象。
def process_view(request,view_func,view_args,view_kwargs):pass4.處理模板響應前:在每個請求上調用,返回實現了render方法的響應對象。
def process_template_response(request,response):pass5.處理響應后:所有響應返回瀏覽器之前被調用,在每個請求上調用,返回HttpResponse對象。
def process_response(request,response):pass6.異常處理:當視圖拋出異常時調用,在每個請求上調用,返回一個HttpResponse對象。
def process_exception(request,exception):pass154.談一下你對uWSGI和nginx的理解?
1.uWSGI是一個Web服務器,它實現了WSGI協議、uwsgi、http等協議。Nginx中HttpUwsgiModule的作用是與uWSGI服務器進行交換。WSGI是一種Web服務器網關接口。它是一個Web服務器(如nginx,uWSGI等服務器)與web應用(如用Flask框架寫的程序)通信的一種規范。
要注意WSGI/uwsgi/uWSGI這三個概念的區分。
WSGI是一種通信協議。
uwsgi是一種線路協議而不是通信協議,在此常用于在uWSGI服務器與其他網絡服務器的數據通信。
uWSGI是實現了uwsgi和WSGI兩種協議的Web服務器。
nginx 是一個開源的高性能的HTTP服務器和反向代理:
1.作為web服務器,它處理靜態文件和索引文件效果非常高
2.它的設計非常注重效率,最大支持5萬個并發連接,但只占用很少的內存空間
3.穩定性高,配置簡潔。
4.強大的反向代理和負載均衡功能,平衡集群中各個服務器的負載壓力應用
155.Python中三大框架各自的應用場景?
django:主要是用來搞快速開發的,他的亮點就是快速開發,節約成本,,如果要實現高并發的話,就要對django進行二次開發,比如把整個笨重的框架給拆掉自己寫socket實現http的通信,底層用純c,c++寫提升效率,ORM框架給干掉,自己編寫封裝與數據庫交互的框架,ORM雖然面向對象來操作數據庫,但是它的效率很低,使用外鍵來聯系表與表之間的查詢; flask: 輕量級,主要是用來寫接口的一個框架,實現前后端分離,提考開發效率,Flask本身相當于一個內核,其他幾乎所有的功能都要用到擴展(郵件擴展Flask-Mail,用戶認證Flask-Login),都需要用第三方的擴展來實現。比如可以用Flask-extension加入ORM、文件上傳、身份驗證等。Flask沒有默認使用的數據庫,你可以選擇MySQL,也可以用NoSQL。
其WSGI工具箱用Werkzeug(路由模塊),模板引擎則使用Jinja2,這兩個也是Flask框架的核心。
Tornado: Tornado是一種Web服務器軟件的開源版本。Tornado和現在的主流Web服務器框架(包括大多數Python的框架)有著明顯的區別:它是非阻塞式服務器,而且速度相當快。得利于其非阻塞的方式和對epoll的運用,Tornado每秒可以處理數以千計的連接因此Tornado是實時Web服務的一個理想框架
156.Django中哪里用到了線程?哪里用到了協程?哪里用到了進程?
1.Django中耗時的任務用一個進程或者線程來執行,比如發郵件,使用celery.
2.部署django項目是時候,配置文件中設置了進程和協程的相關配置。
157.有用過Django REST framework嗎?
Django REST framework是一個強大而靈活的Web API工具。使用RESTframework的理由有:
Web browsable API對開發者有極大的好處
包括OAuth1a和OAuth2的認證策略
支持ORM和非ORM數據資源的序列化
全程自定義開發--如果不想使用更加強大的功能,可僅僅使用常規的function-based views額外的文檔和強大的社區支持
158.對cookies與session的了解?他們能單獨用嗎?
Session采用的是在服務器端保持狀態的方案,而Cookie采用的是在客戶端保持狀態的方案。但是禁用Cookie就不能得到Session。因為Session是用Session ID來確定當前對話所對應的服務器Session,而Session ID是通過Cookie來傳遞的,禁用Cookie相當于SessionID,也就得不到Session。
爬蟲
159.試列出至少三種目前流行的大型數據庫
160.列舉您使用過的Python網絡爬蟲所用到的網絡數據包?
requests, urllib,urllib2, httplib2
161.爬取數據后使用哪個數據庫存儲數據的,為什么?
162.你用過的爬蟲框架或者模塊有哪些?優缺點?
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個網站,并發及分布式處理不夠靈活,不便調整與擴展
requests是一個HTTP庫,它只是用來請求,它是一個強大的庫,下載,解析全部自己處理,靈活性高
Scrapy優點:異步,xpath,強大的統計和log系統,支持不同url。shell方便獨立調試。寫middleware方便過濾。通過管道存入數據庫
163.寫爬蟲是用多進程好?還是多線程好?
164.常見的反爬蟲和應對方法?
165.解析網頁的解析器使用最多的是哪幾個?
166.需要登錄的網頁,如何解決同時限制ip,cookie,session
167.驗證碼的解決?
168.使用最多的數據庫,對他們的理解?
169.編寫過哪些爬蟲中間件?
170.“極驗”滑動驗證碼如何破解?
171.爬蟲多久爬一次,爬下來的數據是怎么存儲?
172.cookie過期的處理問題?
173.動態加載又對及時性要求很高怎么處理?
174.HTTPS有什么優點和缺點?
175.HTTPS是如何實現安全傳輸數據的?
176.TTL,MSL,RTT各是什么?
177.談一談你對Selenium和PhantomJS了解
178.平常怎么使用代理的 ?
179.存放在數據庫(redis、mysql等)。
180.怎么監控爬蟲的狀態?
181.描述下scrapy框架運行的機制?
182.談談你對Scrapy的理解?
183.怎么樣讓 scrapy 框架發送一個 post 請求(具體寫出來)
184.怎么監控爬蟲的狀態 ?
185.怎么判斷網站是否更新?
186.圖片、視頻爬取怎么繞過防盜連接
187.你爬出來的數據量大概有多大?大概多長時間爬一次?
188.用什么數據庫存爬下來的數據?部署是你做的嗎?怎么部署?
189.增量爬取
190.爬取下來的數據如何去重,說一下scrapy的具體的算法依據。
191.Scrapy的優缺點?
192.怎么設置爬取深度?
193.scrapy和scrapy-redis有什么區別?為什么選擇redis數據庫?
194.分布式爬蟲主要解決什么問題?
195.什么是分布式存儲?
196.你所知道的分布式爬蟲方案有哪些?
197.scrapy-redis,有做過其他的分布式爬蟲嗎?
總結
以上是生活随笔為你收集整理的Python面试题大全(三):Web开发(Flask、爬虫)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 瓦片地图与geoserver发布
- 下一篇: 齐次坐标,怎么你也叫Homogeneou