目標:掌握定向網絡數據爬取和網頁解析的基本能力
課程設置.png
◆1◆ requests庫的7種主要方法
方法 | 說明 |
---|---|
requests.request() | 構造一個請求,支撐以下各方法的基礎方法 |
requests.get() | 獲取HTML網頁的主要方法,對應於HTTP的GET |
requests.head() | 獲取HTML網頁頭信息的方法,對應於HTTP的HEAD |
requests.post() | 向HTML網頁提交POST請求,對應於HTTP的POST |
requests.put() | 向HTML網頁提交PUT請求,對用於HTTP的PUT |
requests.patch() | 向HTML網頁提交局部修改請求,對應於HTTP的PATCH |
requests.delete() | 向HTML網頁提交刪除請求,對應於HTTP的DELETE |
◆ requests.get()方法
r = requests.get(url)
構造一個向服務器請求的Request(大寫)對象,返回一個包含服務器資源的Response(大寫)對象,用變量r表示。
其完整使用方法爲:
requests.get(url,params=None,**kwargs)
- url:擬獲取頁面的url鏈接
- params:url中的額外參數,字典或字節流格式,可選
- **kwargs:12個控制訪問的參數
import requests
r = requests.get('http://www.baidu.com')
print(r.status_code) # 狀態碼,200表示訪問正常
print(type(r)) # 可以看到Response爲一個類
print(r.headers) # 獲取頭部信息
輸出:
200
<class 'requests.models.Response'>
{'Server': 'bfe/1.0.8.18', 'Date': 'Sat, 06 Jan
2018 07:42:41 GMT', 'Content-Type':
**kwargs:12個控制訪問的參數(參考)
參數1 params
params指能夠增加到url中的參數
>>> import requests
>>> kv = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.request('GET', 'http://python123.io/ws', params = kv)
>>> print(r.url)
https://python123.io/ws?key1=value1&key2=value2
在給定的url中後面多了一個問號,問號後面key1=value1,&key2=value2
。通過parame參數,我們可以把一些鍵值對增加到url中,然後再去訪問,服務器根據這些參數篩選部分資源返回。
參數2 data
data,它可以是字典、字節序列或文件對象,作爲向服務器提供或提交資源時使用。
參數3 json
json格式是http協議使用的最經常使用的數據格式,作爲內容部分可以向服務器提交,比如說用字典構造一個鍵值對,可以把它複製給json參數,那麼這個鍵值對就複製到服務器的json裏面。
>>> kv = {'key1': 'value1', 'key2': 'value2'}
>>> r = requests.request('POST', 'http://python123.io/ws', json= kv)
參數4 headers
headers實際上是http頭的相關語句,它對應了向某一個url訪問時所發起的http的頭字段,可以用這個字,來定製訪問某一個url的http的協議頭,舉個例子:
>>> hd = {'user-agent': 'Chrome/10'}
>>> r = requests.request('POST', 'http://python123.io/ws', headers = hd)
把user-agent變爲Chrome/10,那麼在訪問某一個鏈接時,我們可以把這樣的字段賦給headers,此時headers再去向服務器訪問時服務器看到的user-agent字段就是Chrome/10
參數5 cookies 和 auth
cookies和auth都是requests庫的高級功能。
cookies指的是從http協議中解析cookie, 它可以是字典,也可以是CookieJar形式。
auth字段是一個元組類型,它是支持http認證功能的
參數6 files
顧名思義,它是向服務器傳輸文件時使用的字段。我們可以定義一個字典,用File,以對應的文件爲鍵值對,用open的方式打開這個文件,並把這個文件與files做一個關聯,同時對應到相關的url上。通過這樣的方法,我們可以向某一個鏈接提交某一個文件,這個在特定應用時還是非常有用的。
>>> fs = {'file': open('data.txt', 'rb')}
>>> r = requests.request('POST', 'http://python123.io/ws', files= fs)
>>>
參數7 timeout
Timeout設定的超時時間,以秒爲單位。當我們發起一個get請求時,我們可以設一個timeout時間,如果在timeout時間內,我們的請求內容沒有反饋回來,那麼它將產生一個timeout的異常。
>>> r = requests.request('POST', 'http://python123.io/ws', timeout= 10)
>>>
參數8 Proxies
Proxies字段,他是一個字典類型,可以爲我們爬取網頁,設定相關的訪問代理服務器。這裏我們增加兩個代理:
>>> pxs = {'http': 'http://user:[email protected]:1234'
'https': 'https://10.10.10.10:4321'
>>> r = requests.request('GET', 'http://www.baidu.com', proxies= pxs)
>>>
第一個是http訪問時使用的代理,在這代理中,我們可以增加用戶名跟密碼的設置。後面是一個https的代理服務器,這樣我們在訪問百度時的ip地址,就是代理服務器的ip地址。使用這個字段可以有效的隱藏用戶爬取網頁的源的ip地址信息,能夠有效地防止對爬蟲的逆追蹤
其他參數
allow_redirects 和 stream
這兩個字段都是開關字段。
allow_redirects表示允不允許對url進行重定向。
stream指對獲取的內容是否進行立即下載,默認情況是立即下載。
verify 和 cert
verify是一個認證ssl證書的字段。
cert是保存本地ssl證書路徑的字段。
Response的5個屬性
方法 | 說明 |
---|---|
r.status_code | HTTP請求的返回狀態,200表示連接成功 |
r.text | HTTP相應內容的字符串形式即url對應的頁面內容 |
r.encoding | 從HTTPheader中猜測的相應內容編碼方式 |
r.apparent_encoding | 從內容中分析的響應內容編碼方式 |
r.content | HTTP響應內容的二進制形式 |
r.encoding:如果header中不存在charset,則認爲編碼爲ISO-8859-1
requests庫常用的6種連接異常
requests庫的異常
爬取網頁的通用代碼框架
import requests
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return '產生異常'
if __name__ == '__main__':
url = 'http://www.baidu.com'
print(getHTMLText(url))
raise_for_status()方法
Response類提供了一個raise_for_status()方法,能夠判斷返回的Response類型狀態是不是200。如果是200,他將表示返回的內容是正確的,如果不是200,他就會產生一個異常。
◆ requests.head()方法
>>> import requests
>>> r = requests.head('http://www.cnblogs.com/zhang-anan/')
>>> r.headers
{'Date': 'Sun, 07 Jan 2018 08:21:35 GMT', 'Content-Type': 'text/html; charset=utf-8', 'Connection': 'keep-alive', 'Vary': 'Accept-Encoding', 'Cache-Control': 'private, max-age=10', 'Expires': 'Sun, 07 Jan 2018
08:21:45 GMT', 'Last-Modified': 'Sun, 07 Jan 2018 08:21:35 GMT', 'X-UA Compatible': 'IE=10', 'X-Frame-Options': 'SAMEORIGIN', 'Content-Encoding': 'gzip'}
>>> r.text
''
通過requests.head()方法可以較少流量獲取網頁資源的概要信息。
◆2◆ HTTP協議對資源的操作
HTTP協議對資源的操作
HTTP(HyperText Transfer Protocol)指的是超文本傳輸協議。超文本傳輸協議是一種基於請求與響應模式的無狀態的應用層協議。
- 請求與響應模式:用戶發起請求,服務器做相關響應。
- 無狀態:指的是第一次請求,跟第二次請求之間,並沒有相關的關聯。
- 應用層協議:指的是該協議工作在tcp協議之上
作者:有雨敲窗2017
鏈接:https://www.jianshu.com/p/1b0cc1a954a8
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。