我們在使用爬蟲的時候離不開URL地址和下載頁面,首先我們就來了解一下URL。它的語法格式一般為:
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
URL由三部分組成,第一部分是協(xié)議,有http、https、ftp等,第二部分存放資源的服務(wù)器的域名或IP地址,第三部分為資源的具體地址。
我們在進行網(wǎng)絡(luò)請求的時候通常采用三種方式:urllib、urllib3和requests,下面我們就來介紹一下urllib和requests。
1. urllib模塊
urllib是Python系統(tǒng)庫中存在的一個模塊,它提供了多個子模塊:
1) urllib.request
提供打開和閱讀URL的方法和類。
2) urllib.error
包含異常類。
3) urllib.parse
解析和引用URL。
4) urllib.robotparser
解析robots.txt文件。
我們使用最多的是第一個子模塊中的方法,其中包含了對服務(wù)器請求的發(fā)出、跳轉(zhuǎn)、代理等。
當我們向網(wǎng)頁發(fā)送請求的時候,采用urllib.request.urlopen()方法。
例如:
import urllib.request#引入模塊 response = urllib.request.urlopen('http://www.baidu.com/') html = response.read().decode('utf-8')#以utf-8格式讀取網(wǎng)頁的內(nèi)容 print(html)#輸出內(nèi)容
輸出結(jié)果為網(wǎng)頁中的內(nèi)容(html格式):
它還包含data參數(shù),data參數(shù)主要是字節(jié)流編碼格式的內(nèi)容,即bytes類型,通過bytes()方法來進行轉(zhuǎn)換。
import urllib.parse import urllib.request data = bytes(urllib.parse.urlencode({'word': 'hello'}), encoding='utf8') response = urllib.request.urlopen('http://httpbin.org/post', data=data) print(response.read())
這個例子傳遞了一個參數(shù)word,它的值為hello,它會被轉(zhuǎn)換為bytes類型,第二個參數(shù)為編碼格式,我們常選擇utf8。data參數(shù)有很多功能,這一點在后續(xù)會慢慢了解到。
還可以通過timeout參數(shù)來設(shè)置超時時間,它是直接加在urlopen括號中其余不常用參數(shù)就不作過多介紹,有興趣的可以在Python官方文檔中進行查閱。https://docs.python.org/3/library/urllib.request.html。
2. requests模塊
requests是一種第三方模塊,主要用于發(fā)送請求,它在使用的時候比urllib模塊要簡潔方便很多,我們可以在命令操作符里通過pip install requests來安裝,也可以在Pycharm中直接進行安裝。
我們可以通過requests模塊的get方法打印多種請求信息,代碼如下:
import requests r = requests.get('https://www.douban.com/') print(r.status_code)#輸出狀態(tài)碼 print(r.encoding)#輸出編碼格式 print(r.headers)#輸出頭部文件 print(r.cookies)#輸出cookie信息 print(r.content)#輸出字節(jié)流形式網(wǎng)頁源碼
輸出結(jié)果如下:
418None{'Date': 'Wed, 19 Feb 2020 10:10:22 GMT', 'Content-Length': '0', 'Connection': 'keep-alive', 'Keep-Alive': 'timeout=30', 'Server': 'dae'}<RequestsCookieJar[]>b''
requests模塊也可以使用post、put、delete、hand等來發(fā)送請求,詳情可以參考:
http://2.python-requests.org/zh_CN/latest/user/quickstart.html
3. 總結(jié)
本節(jié)我們主要介紹了Python發(fā)送網(wǎng)絡(luò)請求的方式,在第一節(jié)介紹爬蟲流程的時候提到過,發(fā)送請求是爬蟲操作的關(guān)鍵步驟,但是我們在使用的時候會發(fā)現(xiàn),無論是如何發(fā)送請求都會被服務(wù)器拒絕,因此我們需要請求headers處理,下一節(jié)我們來學習請求headers處理。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導(dǎo)課程