python爬虫从入门到精通
第一講
什么是爬蟲
網(wǎng)絡(luò)蜘蛛(Web spider)也叫網(wǎng)絡(luò)爬蟲(Web crawler),螞蟻(ant),自動檢索工具(automatic indexer),或者(在FOAF軟件概念中)網(wǎng)絡(luò)疾走(WEB scutter),是一種“自動化瀏覽網(wǎng)絡(luò)”的程序,或者說是一種網(wǎng)絡(luò)機器人。它們被廣泛用于互聯(lián)網(wǎng)搜索引擎或其他類似網(wǎng)站,以獲取或更新這些網(wǎng)站的內(nèi)容和檢索方式。它們可以自動采集所有其能夠訪問到的頁面內(nèi)容,以供搜索引擎做進一步處理(分檢整理下載的頁面),而使得用戶能更快的檢索到他們需要的信息。
總結(jié):自動抓取數(shù)據(jù)
爬蟲能做什么
- 搜索引擎
- 搶票
- 下載資料(圖片等)
爬蟲的本質(zhì)是什么
模仿瀏覽器打開網(wǎng)頁
第二講:HTTP協(xié)議
什么是HTTP協(xié)議
超文本傳輸協(xié)議(英文:HyperText Transfer Protocol,縮寫:HTTP)是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。設(shè)計HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法。通過HTTP或者HTTPS協(xié)議請求的資源由統(tǒng)一資源標識符(Uniform Resource Identifiers,URI)來標識。 HTTP的發(fā)展是由蒂姆·伯納斯-李于1989年在歐洲核子研究組織(CERN)所發(fā)起。由萬維網(wǎng)協(xié)會(World Wide Web Consortium,W3C)和互聯(lián)網(wǎng)工程任務(wù)組(Internet Engineering Task Force,IETF)制定標準,最終發(fā)布了一系列的RFC,其中最著名的是1999年6月公布的 RFC 2616,定義了HTTP協(xié)議中現(xiàn)今廣泛使用的一個版本——HTTP 1.1。 2014年12月,互聯(lián)網(wǎng)工程任務(wù)組(IETF)的Hypertext Transfer Protocol Bis(httpbis)工作小組將HTTP/2標準提議遞交至IESG進行討論[1],于2015年2月17日被批準。[2] HTTP/2標準于2015年5月以RFC 7540正式發(fā)表,替換HTTP 1.1成為HTTP的實現(xiàn)標準。[3]
HTTP是一個客戶端終端(用戶)和服務(wù)器端(網(wǎng)站)請求和應(yīng)答的標準(TCP)。通過使用網(wǎng)頁瀏覽器、網(wǎng)絡(luò)爬蟲或者其它的工具,客戶端發(fā)起一個HTTP請求到服務(wù)器上指定端口(默認端口為80)。我們稱這個客戶端為用戶代理程序(user agent)。應(yīng)答的服務(wù)器上存儲著一些資源,比如HTML文件和圖像。我們稱這個應(yīng)答服務(wù)器為源服務(wù)器(origin server)。在用戶代理和源服務(wù)器中間可能存在多個“中間層”,比如代理服務(wù)器、網(wǎng)關(guān)或者隧道(tunnel)。 盡管TCP/IP協(xié)議是互聯(lián)網(wǎng)上最流行的應(yīng)用,HTTP協(xié)議中,并沒有規(guī)定必須使用它或它支持的層。事實上,HTTP可以在任何互聯(lián)網(wǎng)協(xié)議上,或其他網(wǎng)絡(luò)上實現(xiàn)。HTTP假定其下層協(xié)議提供可靠的傳輸。因此,任何能夠提供這種保證的協(xié)議都可以被其使用。因此也就是其在TCP/IP協(xié)議族使用TCP作為其傳輸層。 通常,由HTTP客戶端發(fā)起一個請求,創(chuàng)建一個到服務(wù)器指定端口(默認是80端口)的TCP連接。HTTP服務(wù)器則在那個端口監(jiān)聽客戶端的請求。一旦收到請求,服務(wù)器會向客戶端返回一個狀態(tài),比如"HTTP/1.1 200 OK",以及返回的內(nèi)容,如請求的文件、錯誤消息、或者其它信息。
具體例子
打開知乎頁面,按瀏覽器的F12鍵,點擊network,點擊doc,然后刷新頁面,再點擊headers,可以看到如下界面:
其中:
HTTP協(xié)議中的統(tǒng)一資源定位符也就是我們打開的網(wǎng)址
Request URL:https://zhuanlan.zhihu.com/p/25296437 (爬蟲會用到)
HTTP協(xié)議中的請求方法,我們這次用的是GET
Request Method:GET #(爬蟲會用到)
請求方法有以下這些,常用的是GET,POST
- GET:向指定的資源發(fā)出“顯示”請求。使用GET方法應(yīng)該只用在讀取數(shù)據(jù),而不應(yīng)當被用于產(chǎn)生“副作用”的操作中,例如在Web Application中。其中一個原因是GET可能會被網(wǎng)絡(luò)蜘蛛等隨意訪問。參見安全方法
- POST:向指定資源提交數(shù)據(jù),請求服務(wù)器進行處理(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請求本文中。這個請求可能會創(chuàng)建新的資源或修改現(xiàn)有資源,或二者皆有。
- OPTIONS:這個方法可使服務(wù)器傳回該資源所支持的所有HTTP請求方法。用'*'來代替資源名稱,向Web服務(wù)器發(fā)送OPTIONS請求,可以測試服務(wù)器功能是否正常運作。
- HEAD:與GET方法一樣,都是向服務(wù)器發(fā)出指定資源的請求。只不過服務(wù)器將不傳回資源的本文部分。它的好處在于,使用這個方法可以在不必傳輸全部內(nèi)容的情況下,就可以獲取其中“關(guān)于該資源的信息”(元信息或稱元數(shù)據(jù))。
- PUT:向指定資源位置上傳其最新內(nèi)容。
- DELETE:請求服務(wù)器刪除Request-URI所標識的資源。
- TRACE:回顯服務(wù)器收到的請求,主要用于測試或診斷。
- CONNECT:HTTP/1.1協(xié)議中預留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。通常用于SSL加密服務(wù)器的鏈接(經(jīng)由非加密的HTTP代理服務(wù)器)。
對應(yīng)HTTP協(xié)議中的狀態(tài)碼,我們這次返回的是200 OK、
Status Code:200 OK(爬蟲會用到)
狀態(tài)碼的含義:
- 1xx消息——請求已被服務(wù)器接收,繼續(xù)處理
- 2xx成功——請求已成功被服務(wù)器接收、理解、并接受
- 3xx重定向——需要后續(xù)操作才能完成這一請求
- 4xx請求錯誤——請求含有詞法錯誤或者無法被執(zhí)行
- 5xx服務(wù)器錯誤——服務(wù)器在處理某個正確請求時發(fā)生錯誤
常見狀態(tài)代碼、狀態(tài)描述、說明:
- 200 OK //請求成功
- 400 Bad Request //客戶端請求有語法錯誤,不能被服務(wù)器所理解
- 401 Unauthorized //請求未經(jīng)授權(quán),這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用
- 403 Forbidden //服務(wù)器收到請求,但是拒絕提供服務(wù)
- 404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
- 500 Internal Server Error //服務(wù)器發(fā)生不可預期的錯誤
- 503 Server Unavailable //服務(wù)器當前不能處理客戶端的請求,一段時間后可能恢復正常
請求頭
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8(爬蟲會用到)
其中
- Accept代表客戶端請求接受的信息類型,這里請求的是text/html類型
- Accept-Encoding:gzip, deflate, sdch, br:請求報頭域類似于Accept,但是它是用于指定可接受的內(nèi)容編碼。eg:Accept-Encoding:gzip.deflate.如果請求消息中沒有設(shè)置這個域服務(wù)器假定客戶端對各種內(nèi)容編碼都可以接受。
- Accept-Language:zh-CN,zh;q=0.8:指定語言類型,如果沒有報頭域,那么各種語言都可以接受
- Cache-Control:no-cache:用于控制網(wǎng)頁緩存
- Connection:keep-alive:HTTP持久連接,使用同一個TCP來發(fā)送和接收多個HTTP請求/應(yīng)答
- Cookie:d_c0="AACAWNtZswqPTnJ8dFXqaygiq82ekPD5_-xxxx:cookie,小型文本文件,某些網(wǎng)站為了辨別用戶身份而存儲在本地終端上的數(shù)據(jù)
- Host:zhuanlan.zhihu.com:當前請求網(wǎng)頁的請求域
Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
用戶是通過什么工具來請求的,(因為我用的Google瀏覽器,所以顯示的是Chrome)- Referer:https://www.zhihu.com/people/pa-chong-21/activities
是通過哪個頁面到當前頁面的 - If-Modified-Since:Wed, 15 Feb 2017 09:14:13 GMT
If-None-Match:W/"58a41be5-190aa"
Last-Modified:Wed, 15 Feb 2017 09:14:13 GMT
ETag:"58a41be5-190aa" 這4個一般靜態(tài)頁面會用到 If-Modified-Since,If-None-Match這兩個是請求頭,ETag,Last-Modified是返回頭(服務(wù)器返回的)
如果If-Modified-Since的值和Last-Modified相等 則表明當前請求的內(nèi)容沒有變動,服務(wù)器返回Status Code:304 Not Modified
轉(zhuǎn)載于:https://www.cnblogs.com/drawon/p/8520466.html
總結(jié)
以上是生活随笔為你收集整理的python爬虫从入门到精通的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用递归形成树结构数据
- 下一篇: python项目构建工具zc.build