1.反爬措施
1.你寫爬蟲的時候都遇到過什么反爬蟲措施,你是怎么解決的?
設(shè)置用戶代理 偽裝瀏覽器
禁止IP 設(shè)置代理服務(wù)器(一般是收費、測試可以用免費的)
驗證碼 通過機器學(xué)習(xí)相關(guān)模型框架設(shè)別(后面再說)
動態(tài)加載 ajax(追蹤請求過程,對url進行抓取,進而請求) 非常復(fù)雜的(selenium+無界面瀏覽器)
加密問題 解密(解密算法)
賬戶阻擋 通過登錄
爬蟲和反爬的博弈是做爬蟲的核心問題,最終所有的反爬策略都會被解決掉,只不過公司成本能不能負擔(dān)的了
2.為什么會用到代理?代理怎么使用(具體代碼,請求在什么時候添加的代理)? 如果遇到代理失效該怎么辦?
當我們頻繁的爬取某些網(wǎng)站的時候,這些網(wǎng)站有可能會啟動其反爬機制,對我們的ip地址進行限制,為了突破這種限制,可以設(shè)置代理服務(wù)器,對我們的ip進行隱藏。
可以設(shè)置一個代理池(一個列表放了多個代理服務(wù)器的ip),對代理進行管理,如果某一個禁用立即啟用下一個
3.cookie如何處理?
創(chuàng)建cookie->創(chuàng)建handler攜帶cookie->使用opener攜帶handler進行請求
2.HTTP協(xié)議
1.請您解釋一下什么是http協(xié)議?
是基于請求與響應(yīng)的應(yīng)用層協(xié)議,底層協(xié)議TCP保證了數(shù)據(jù)可靠傳輸 2)通過url進行客戶端與服務(wù)器之間的數(shù)據(jù)交互 3)是一種C/S(B/S)模式的協(xié)議,客戶端向服務(wù)器發(fā)起請求,服務(wù)器處理請求并且返回響應(yīng) 4)該協(xié)議是一種無狀態(tài)的協(xié)議(不會記錄用戶的訪問狀態(tài))
2.請談一下get和post的區(qū)別?
形式上:get請求參數(shù)拼接在url后面 post請求不體現(xiàn)在url中
內(nèi)容上:get請求有數(shù)據(jù)量的限制(不同的瀏覽器對url最大長度都有不同的限制),post的請求是不限制請求體數(shù)據(jù)量的(有的web服務(wù)器會有一個最大請求體的限制,比如阿帕奇限制為20M)
3.http協(xié)議和https協(xié)議有什么區(qū)別?
4.http協(xié)議的常見狀態(tài)碼,及其含義?
5.如何取配置https協(xié)議?
3.其它
1、如何動態(tài)加載的數(shù)據(jù)?
簡單的ajax請求:抓包得到ajax的url對該url進行追蹤
復(fù)雜的動態(tài)加載:一般采用selenium+chromedriver或selenium+PhantomJS,進行js代碼的解析執(zhí)行,得到其執(zhí)行以后html字符串,進一步用xpath、bs4或正則來解析
2、迭代器,生成器,裝飾器
迭代器:
生成器:
裝飾器:不改變原函數(shù)的功能基礎(chǔ)上,裝飾(增加)新的功能,是的函數(shù)可以實現(xiàn)更加廣泛的應(yīng)用。這種設(shè)計模式好處,解耦合
3、Python里面如何拷貝一個對象?(賦值,淺拷貝,深拷貝的區(qū)別)
賦值:把等號右邊的數(shù)據(jù),存儲到左邊變量所開辟的內(nèi)存空間中
淺拷貝:只拷貝引用不拷貝對象本身,一旦有一個引用修改,所有的引用都會被迫修改
深拷貝:直接拷貝對象本身,產(chǎn)生一個新的對象,并且產(chǎn)生一個新的引用
4、什么是并行和并發(fā)?
并行:多個進程在同一時刻同時進行
并發(fā):多個進程在同一時間段內(nèi)交替進行 (操作系統(tǒng)大多采用并發(fā)機制),根據(jù)一定的算法(常見的就是時間片輪詢算法)
5、什么是線程和進程?
進程:一個程序在操作系統(tǒng)中被執(zhí)行以后就會創(chuàng)建一個進程,通過進程分配資源(cpu、內(nèi)存、I/O設(shè)備),一個進程中會包含一到多個線程,其中有一個線程叫做主線程用于管理其他線程
線程:在一個進程執(zhí)行的過程,一般會分成很多個小的執(zhí)行單位,線程就是這些執(zhí)行單位;在處理機調(diào)度,以線程為單位件進行,多個線程之間并發(fā)執(zhí)行,線程占用的是cpu
多線程使用的場合:耗時操作(訪問外存,即:I/O,訪問網(wǎng)絡(luò)資源),為了不阻礙主線程或者其他的操作,一般會采用多線程。
6、什么是協(xié)程?
協(xié)程是:在一個線程執(zhí)行過程中可以在一個子程序的預(yù)定或者隨機位置中斷,然后轉(zhuǎn)而執(zhí)行別的子程序,在適當?shù)臅r候再返回來接著執(zhí)行。他本身是一種特殊的子程序或者稱作函數(shù)。
遇到IO密集型的業(yè)務(wù)時,多線程加上協(xié)程,你磁盤在那該讀讀該寫寫,我還能去干點別的。在WEB應(yīng)用中效果尤為明顯。
協(xié)程的好處:
跨平臺
跨體系架構(gòu)
無需線程上下文切換的開銷
無需原子操作鎖定及同步的開銷
方便切換控制流,簡化編程模型
高并發(fā)+高擴展性+低成本:一個CPU支持上萬的協(xié)程都不是問題。所以很適合用于高并發(fā)處理。
缺點:
無法利用多核資源:協(xié)程的本質(zhì)是個單線程,它不能同時將單個CPU 的多個核用上,協(xié)程需要和進程配合才能運行在多CPU上.當然我們?nèi)粘K帉懙慕^大部分應(yīng)用都沒有這個必要,除非是cpu密集型應(yīng)用。
進行阻塞(Blocking)操作(如IO時)會阻塞掉整個程序:這一點和事件驅(qū)動一樣,可以使用異步IO操作來解決