python學(xué)習(xí)之python爬蟲原理_第1頁
python學(xué)習(xí)之python爬蟲原理_第2頁
python學(xué)習(xí)之python爬蟲原理_第3頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、前言簡單來說互聯(lián)網(wǎng)是由一個(gè)個(gè)站點(diǎn)和網(wǎng)絡(luò)設(shè)備組成的大網(wǎng),我們通過瀏覽器訪問站點(diǎn),站點(diǎn)把HTML、JS、CSS代碼返回給瀏覽器,這些代碼經(jīng)過瀏覽器解析、渲染,將豐富多彩的網(wǎng)頁呈現(xiàn)我們眼前;一、爬蟲是什么?如果我們把互聯(lián)網(wǎng)比作一張大的蜘蛛網(wǎng),數(shù)據(jù)便是存放于蜘蛛網(wǎng)的各個(gè)節(jié)點(diǎn),而爬蟲就是一只小蜘蛛,沿著網(wǎng)絡(luò)抓取自己的獵物(數(shù)據(jù))爬蟲指的是:向網(wǎng)站發(fā)起請求,獲取資源后分析并提取有用數(shù)據(jù)的程序;從技術(shù)層面來說就是 通過程序模擬瀏覽器請求站點(diǎn)的行為,把站點(diǎn)返回的HTML代碼/JSON數(shù)據(jù)/二進(jìn)制數(shù)據(jù)(圖片、視頻) 爬到本地,進(jìn)而提取自己需要的數(shù)據(jù),存放起來使用;二、爬蟲的基本流程:用戶獲取網(wǎng)絡(luò)數(shù)據(jù)的方式:方式

2、1:瀏覽器提交請求-下載網(wǎng)頁代碼-解析成頁面方式2:模擬瀏覽器發(fā)送請求(獲取網(wǎng)頁代碼)-提取有用的數(shù)據(jù)-存放于數(shù)據(jù)庫或文件中爬蟲要做的就是方式2;1、發(fā)起請求使用http庫向目標(biāo)站點(diǎn)發(fā)起請求,即發(fā)送一個(gè)RequestRequest包含:請求頭、請求體等Request模塊缺陷:不能執(zhí)行JS 和CSS 代碼2、獲取響應(yīng)內(nèi)容如果服務(wù)器能正常響應(yīng),則會得到一個(gè)ResponseResponse包含:html,json,圖片,視頻等3、解析內(nèi)容解析html數(shù)據(jù):正則表達(dá)式(RE模塊),第三方解析庫如Beautifulsoup,pyquery等解析json數(shù)據(jù):json模塊解析二進(jìn)制數(shù)據(jù):以wb的方式寫入文

3、件4、保存數(shù)據(jù)數(shù)據(jù)庫(MySQL,Mongdb、Redis)文件三、http協(xié)議 請求與響應(yīng)Request:用戶將自己的信息通過瀏覽器(socket client)發(fā)送給服務(wù)器(socketserver)Response:服務(wù)器接收請求,分析用戶發(fā)來的請求信息,然后返回?cái)?shù)據(jù)(返回的數(shù)據(jù)中可能包含其他鏈接,如:圖片,js,css等)ps:瀏覽器在接收Response后,會解析其內(nèi)容來顯示給用戶,而爬蟲程序在模擬瀏覽器發(fā)送請求然后接收Response后,是要提取其中的有用數(shù)據(jù)。四、 request1、請求方式:常見的請求方式:GET / POST2、請求的URLurl全球統(tǒng)一資源定位符,用來定義互

4、聯(lián)網(wǎng)上一個(gè)唯一的資源 例如:一張圖片、一個(gè)文件、一段視頻都可以用url唯一確定url編碼/s?wd=圖片圖片會被編碼(看示例代碼)網(wǎng)頁的加載過程是:加載一個(gè)網(wǎng)頁,通常都是先加載document文檔,在解析document文檔的時(shí)候,遇到鏈接,則針對超鏈接發(fā)起下載圖片的請求3、請求頭User-agent:請求頭中如果沒有user-agent客戶端配置,服務(wù)端可能將你當(dāng)做一個(gè)非法用戶host;cookies:cookie用來保存登錄信息注意: 一般做爬蟲都會加上請求頭請求頭需要注意的參數(shù):(1)Referrer:訪問源至哪里來(一些大型網(wǎng)站,會通過Referrer 做防盜鏈策略;所有爬蟲也要注意模

5、擬)(2)User-Agent:訪問的瀏覽器(要加上否則會被當(dāng)成爬蟲程序)(3)cookie:請求頭注意攜帶4、請求體請求體如果是get方式,請求體沒有內(nèi)容 (get請求的請求體放在 url后面參數(shù)中,直接能看到)如果是post方式,請求體是format dataps:1、登錄窗口,文件上傳等,信息都會被附加到請求體內(nèi)2、登錄,輸入錯(cuò)誤的用戶名密碼,然后提交,就可以看到post,正確登錄后頁面通常會跳轉(zhuǎn),無法捕捉到post五、 響應(yīng)Response1、響應(yīng)狀態(tài)碼200:代表成功301:代表跳轉(zhuǎn)404:文件不存在403:無權(quán)限訪問502:服務(wù)器錯(cuò)誤2、respone header響應(yīng)頭需要注意的

6、參數(shù):(1)Set-Cookie:BDSVRTM=0; path=/:可能有多個(gè),是來告訴瀏覽器,把cookie保存下來(2)Content-Location:服務(wù)端響應(yīng)頭中包含Location返回瀏覽器之后,瀏覽器就會重新訪問另一個(gè)頁面3、preview就是網(wǎng)頁源代碼JSO數(shù)據(jù)如網(wǎng)頁html,圖片二進(jìn)制數(shù)據(jù)等六、總結(jié)1、總結(jié)爬蟲流程:爬取-解析-存儲2、爬蟲所需工具:請求庫:requests,selenium(可以驅(qū)動(dòng)瀏覽器解析渲染CSS和JS,但有性能劣勢(有用沒用的網(wǎng)頁都會加載);)解析庫:正則,beautifulsoup,pyquery存儲庫:文件,MySQL,Mongodb,Redi

7、s感謝您的閱讀,以上就是對python爬蟲原理的一些介紹源 /代碼灣 編輯 / AI時(shí)間1. 原地交換兩個(gè)數(shù)字Python 提供了一個(gè)直觀的在一行代碼中賦值與交換(變量值)的方法,請參見下面的示例:x,y=10,20print(x,y)x,y= y,xprint(x,y)#1 (10, 20)#2 (20, 10)賦值的右側(cè)形成了一個(gè)新的元組,左側(cè)立即解析(unpack)那個(gè)(未被引用的)元組到變量和 。一旦賦值完成,新的元組變成了未被引用狀態(tài)并且被標(biāo)記為可被垃圾回收,最終也完成了變量的交換。2. 鏈狀比較操作符比較操作符的聚合是另一個(gè)有時(shí)很方便的技巧:n=10result=1 n n=9pr

8、int(result)#False3. 使用三元操作符來進(jìn)行條件賦值三元操作符是 if-else 語句也就是條件操作符的一個(gè)快捷方式:表達(dá)式為真的返回值if表達(dá)式else表達(dá)式為假的返回值這里給出幾個(gè)你可以用來使代碼緊湊簡潔的例子。下面的語句是說“如果 y 是9,給 x 賦值10,不然賦值為20”。如果需要的話我們也可以延長這條操作鏈。x =10if(y =9)else20同樣地,我們可以對類做這種操作:x = (classAify =1elseclassB)(param1, param2)在上面的例子里 classA 與 classB 是兩個(gè)類,其中一個(gè)類的構(gòu)造函數(shù)會被調(diào)用。下面是另一個(gè)多個(gè)

9、條件表達(dá)式鏈接起來用以計(jì)算最小值的例子:defsmall(a,b,c):returnaifa= banda= celse(bifb= aandb10elsem*4forminrange(50)#= 0, 1, 16, 81, 256, 625, 1296, 2401, 4096, 6561, 10000, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444,

10、 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 24014. 多行字符串基本的方式是使用源于 C 語言的反斜杠:multiStr= “select*frommulti_rowwhere row_id 5”print(multiStr)#select*frommulti_rowwhererow_id 5另一個(gè)技巧是使用三引號:multiStr= “”select*frommulti_rowwhere row_id 5”print(multiStr)#select*frommulti_row#whererow_id 5上面方

11、法共有的問題是缺少合適的縮進(jìn),如果我們嘗試縮進(jìn)會在字符串中插入空格。所以最后的解決方案是將字符串分為多行并且將整個(gè)字符串包含在括號中:multiStr= (“select*frommulti_row ”“whererow_id 5”“orderbyage”)print(multiStr)#select*frommulti_rowwhererow_id 1236. 打印引入模塊的文件路徑如果你想知道引用到代碼中模塊的絕對路徑,可以使用下面的技巧:importthreadingimportsocketprint(threading)print(socket)#1-#2-7. 交互環(huán)境下的 “_”

12、操作符這是一個(gè)我們大多數(shù)人不知道的有用特性,在 Python 控制臺,不論何時(shí)我們測試一個(gè)表達(dá)式或者調(diào)用一個(gè)方法,結(jié)果都會分配給一個(gè)臨時(shí)變量: _(一個(gè)下劃線)。 2 13 _3 print_3“_” 是上一個(gè)執(zhí)行的表達(dá)式的輸出。8. 字典/集合推導(dǎo)與我們使用的列表推導(dǎo)相似,我們也可以使用字典/集合推導(dǎo),它們使用起來簡單且有效,下面是一個(gè)例子:testDict= i: i *iforiinxrange(10)testSet= i *2foriinxrange(10)print(testSet)print(testDict)#set(0,2,4,6,8,10,12,14,16,18)#0:0,1

13、:1,2:4,3:9,4:16,5:25,6:36,7:49,8:64,9:81注:兩個(gè)語句中只有一個(gè) 的不同,另,在 Python3 中運(yùn)行上述代碼時(shí),將改為。9. 調(diào)試腳本我們可以在模塊的幫助下在 Python 腳本中設(shè)置斷點(diǎn),下面是一個(gè)例子:importpdbpdb.set_trace()我們可以在腳本中任何位置指定并且在那里設(shè)置一個(gè)斷點(diǎn),相當(dāng)簡便。10. 開啟文件分享Python 允許運(yùn)行一個(gè) HTTP 服務(wù)器來從根路徑共享文件,下面是開啟服務(wù)器的命令:#Python 2python -m SimpleHTTPServer#Python 3python3 -m http.server上

14、面的命令會在默認(rèn)端口也就是 8000 開啟一個(gè)服務(wù)器,你可以將一個(gè)自定義的端口號以最后一個(gè)參數(shù)的方式傳遞到上面的命令中。11. 檢查 Python 中的對象我們可以通過調(diào)用 dir() 方法來檢查 Python 中的對象,下面是一個(gè)簡單的例子:test= 1,3,5,7print(dir(test)_add_, _class_, _contains_, _delattr_, _delitem_, _delslice_, _doc_, _eq_, _format_, _ge_, _getattribute_, _getitem_, _getslice_, _gt_, _hash_, _iadd_

15、, _imul_, _init_, _iter_, _le_, _len_, _lt_, _mul_, _ne_, _new_, _reduce_, _reduce_ex_, _repr_, _reversed_, _rmul_, _setattr_, _setitem_, _setslice_, _sizeof_, _str_, _subclasshook_, append, count, extend, index, insert, pop, remove, reverse, sort12. 簡化 if 語句我們可以使用下面的方式來驗(yàn)證多個(gè)值:ifmin1,3,5,7:而不是:ifm=1o

16、rm=3orm=5orm=7:或者,對于 in 操作符我們也可以使用 1,3,5,7 而不是 1,3,5,7,因?yàn)?set 中取元素是 O(1) 操作。13. 一行代碼計(jì)算任何數(shù)的階乘Python 2.x.result= (lambdak: reduce(int._mul_,range(1,k1),1)(3)print(result)#-6Python 3.x.importfunctoolsresult= (lambdak: functools.reduce(int._mul_,range(1,k1),1)(3)print(result)#-614. 找到列表中出現(xiàn)最頻繁的數(shù)test= 1,2

17、,3,4,2,2,3,1,4,4,4print(max(set(test),key=test.count)#- 415. 重置遞歸限制Python 限制遞歸次數(shù)到 1000,我們可以重置這個(gè)值:importsysx=1001print(sys.getrecursionlimit()sys.setrecursionlimit(x)print(sys.getrecursionlimit()#1- 1000#2- 1001請只在必要的時(shí)候采用上面的技巧。16. 檢查一個(gè)對象的內(nèi)存使用在 Python 2.7 中,一個(gè) 32 比特的整數(shù)占用 24 字節(jié),在 Python 3.5 中利用 28 字節(jié)。為

18、確定內(nèi)存使用,我們可以調(diào)用 getsizeof 方法:在 Python 2.7 中importsysx=1print(sys.getsizeof(x)#- 24在 Python 3.5 中importsysx=1print(sys.getsizeof(x)#- 2817. 使用 _slots_ 來減少內(nèi)存開支你是否注意到你的 Python 應(yīng)用占用許多資源特別是內(nèi)存?有一個(gè)技巧是使用 _slots_ 類變量來在一定程度上減少內(nèi)存開支。import sysclassFileSystem(object):def_init_(self,files,folders,devices):self.file

19、s= filesself.folders= foldersself.devices= devicesprint(sys.getsizeof(FileSystem)classFileSystem1(object):_slots_=files,folders,devicesdef_init_(self,files,folders,devices):self.files= filesself.folders= foldersself.devices= devicesprint(sys.getsizeof(FileSystem1)#In Python 3.5#1- 1016#2- 888很明顯,你可以

20、從結(jié)果中看到確實(shí)有內(nèi)存使用上的節(jié)省,但是你只應(yīng)該在一個(gè)類的內(nèi)存開銷不必要得大時(shí)才使用 _slots_。只在對應(yīng)用進(jìn)行性能分析后才使用它,不然地話,你只是使得代碼難以改變而沒有真正的益處?!咀g者注:在我的 win10 python2.7 中上面的結(jié)果是:#InPython2.7win10#1- 896#2- 1016所以,這種比較方式是不那么讓人信服的,使用 _slots_ 主要是用以限定對象的屬性信息,另外,當(dāng)生成對象很多時(shí)花銷可能會小一些,具體可以參見 python 官方文檔:The slots declaration takes a sequence of instance variables and reserves just enough space in each instance to hold a value for each variable. Space is saved because dict is not created for each instance.】18. 使用 lambda 來模仿輸出

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論