Python爬蟲|Python爬蟲入門(二):請求

系列專欄目錄:

第一講:Python爬蟲|Python爬蟲入門(一):爬蟲基本結構&簡單實例

第二講:Python爬蟲|Python爬蟲入門(二):請求

第三講:Python爬蟲|Python爬蟲入門(三):解析

第四講:Python爬蟲|Python爬蟲入門(四):儲存

------------------------萌萌噠的分割線------------------------

這次我們入門一下爬蟲的請求模塊。本篇不會深入地講請求相關的知識,主要關注在爬虫部分的相關知識,點到為止。

一 、HTTP協議

我們在第一篇爬蟲教程(知乎專欄)講到了HTTP協議這個東西。講HTTP協議之前,我們要先講講我們平時瀏覽的網頁是怎麼來的。

最簡單的模型是這樣的:瀏覽器(客戶端)告訴伺服器說,我想請求一個網頁。伺服器收到消息說,好的給你。然後瀏覽器(客戶端)收到網頁,並且渲染解析成我們看到的網頁。這個部分就涉及到消息怎麼傳送。事實上從最底層的物理層到最頂層的應用層是有很多協議的。我們只討論最上面的應用層。最常用的應用層就是HTTP協議。

所謂HTTP協議,中文名是超文本傳輸協議。這是一種可靠的可以把各種各樣格式的文件在互聯網上傳輸的協議。事實上HTTP協議總共有七步,這次我們先講一下主要的過程。HTTP協議的傳輸主要通過HTTP報文實現的:

1. 客戶端(比如瀏覽器) :發送請求報文到伺服器

2. 伺服器:接收請求報文並處理

3. 伺服器:發送響應報文給客戶端

4. 客戶端:處理接收到的內容。

這就是一個比較粗略的流程。我們先不討論報文,在後面深入講解反爬技巧的時候我們再討論怎麼在報文上下功夫。

萌萌噠的瀏覽器寶寶想發送請求的時候,就必須要知道伺服器的名字。比如,我們需要使用bing搜索,我們就需要bing的名字:微軟必應搜索 - 全球搜索,有問必應 (Bing) 。這個名字就是URL。(至於裡面詳細的過程我們也先跳過。)那麼,在發送請求的時候,就需要知道URL。關於URL的語法,我們也先不深入討論,在後面我們升級單頁爬蟲的時候再詳細說。

另外,客戶端請求的方法也是不一樣的。比如,打開bing的首頁的時候,是什麼都不發送的。但是,你登陸知乎的時候,是需要輸入賬號密碼的。所以這就有兩種方法:一種是客戶端不發送數據,一種是客戶端發送數據,然後接收響應報文。前者就是get方法,後者就是post方法。這是HTTP協議最常用的兩種方法。(其他方法我們先忽略不計,在實際上的使用中相對比較少。)

那麼怎麼判斷這個過程是不是成功呢?響應報文的狀態碼會告訴你。大家最熟悉的就是404了。大家先記住開頭的一位數字就好:2開頭的是正常,3開頭的是重定向(定向到另外一個店鋪),4開頭的是客戶端異常,5開頭的是伺服器異常。

到這裡做個小結:HTTP協議是一種在互聯網上傳輸文件的協議,主要過程是客戶端發送請求報文、伺服器接收並發送響應報文、客戶端接收;訪問某個伺服器資源需要知道它的URL;主要的HTTP請求方法有get(客戶端不發數據)和post(客戶端發數據)

二、Requests入門

requests的官方主頁(Requests: HTTP for Humans)就寫著大大的「HTTP for human beings". requests也確實做的非常好,它把HTTP協議封裝的非常好,非常適合爬蟲等各種各樣的網路編程使用。(所以趕快放棄urllib、urllib2 for Python2 and urllib for Python3 這些標準庫吧~)

這裡我們繼續使用Python解釋器。我們來順著前面說的講講要怎麼實現HTTP協議的過程。事實上高度封裝的requests都搞定了:

import requestsnnr1 = requests.get(http://cn.bing.com/search?q=requests) #get方法nnpost_data={nstock:000001,nsearchkey:,ncategory:category_ndbg_szsh;,npageNum:1,npageSize:,ncolumn:szse_main,ntabName:fulltext,nsortName:,nsortType:,nlimit:,nseDate:n}nnr2 = requests.post(http://www.cninfo.com.cn/cninfo-new/announcement/query,data=post_data) #post方法n

get方法和post方法的使用如上。這裡的返回值是一個對象,這個對象包括了各種各樣的屬性和方法,我們取幾個對我們最重要的:

r1.status_code #狀態碼,正常是200nr1.encoding #文件編碼,比如utf-8nr1.content #文件全文nnr1.json() #把請求回來的json數據轉成Python字典並返回n

這裡特別說明一下,如果需要下載原始文件,比如下面這個例子的PDF文件,那麼最好加一個參數:

r3 = requests.get(http://www.cninfo.com.cn/finalpage/2015-03-13/1200694563.PDF,stream = True) #請求nnr3.raw.read() #讀取文件(最好在括弧裡面加一下個數,只讀前面幾個,不然……可以試試看哈哈哈哈)n

最後,我們來寫一個完整的請求函數,以後我們再在這個基礎上不斷升級:

def getHTML(url):n r = requests.get(url)n return r.contentnnif __name__=="__main__":n url = https://zhuanlan.zhihu.com/xmucppn html = getHTML(url)n print(html)n

完整到只有兩行?這充分顯示了requests庫對HTTP協議封裝的到位。

當然,還有很多很多沒有講到的。這些後續都會在爬蟲教程中慢慢滲透,之後會有更系統的介紹。

如果你想了解更多關於requests的介紹,請戳:

Quickstart - Requests 2.13.0 documentation

或者

知乎專欄

知乎專欄

------------------------萌萌噠的分割線------------------------

非商業轉載註明作者即可,商業轉載請聯繫作者授權並支付稿費。本專欄已授權「維權騎士」網站(rightknights.com)對我在知乎發布文章的版權侵權行為進行追究與維權。

項目聯繫方式:

  • 項目郵箱(@iGuo 的郵箱):zhangguocpp@163.com
  • 項目網站:http://www.xmucpp.com/(修復中)
  • 項目GitHub:Chinas Prices Project at Xiamen Univerisity (CPP@XMU)
  • 項目專欄:Chinas Prices Project - 知乎專欄
  • 項目知乎賬戶:@CPP
  • 項目公眾號:xmucpp2016(XMUCPP)

推薦閱讀:

怎麼寫一個拿得出手的項目?
Python一星期入門第4篇: 函數和異常處理
使用 Python 寫一個搶課用的軟體,卡在了取課表這一步,怎麼辦?
對 Quant 而言 Python 的需求高嗎,除 C++ 外還有哪些流行的編程語言?
此庫在手,好片無憂!Python爬片,小手不抖

TAG:爬虫计算机网络 | 网页爬虫 | Python |